2012-08-23 9 views
5

コードプロファイラ(この場合はDrone Profiler)が.NETアプリケーションを実行する方法と、それを直接実行するのとは異なる方法を理解しようとしています。私がこれを知る必要があるのは、私が開発者のコ​​ンピュータの.NETインストールに非常に奇妙な問題や破損があるためです。なぜなら、プロファイラの外に現れますが、非常に奇妙なことです。コードプロファイラ内の実行中のC#アプリケーションは、コードプロファイラ外での実行とどのように違いますか?

この問題は、System.Net.NetworkInformationのメソッドへの呼び出しにのみ影響するようです(.NET 3.5から2.0では、4に対して何かを構築すればすべてがうまくいきます)。私は1つだけを行う小さなテストアプリケーションを構築し、System.Net.NetworkInformation.IsNetworkAvailable()を呼び出します。プロファイラーの外では、System.dllで「致命的な実行エンジンエラー」が発生し、それがすべての情報です。私が理解しているところでは、通常、System.dllがネイティブDLLにIsNetworkAvailable()ロジックを実行させるときに発生するネイティブメソッド呼び出しのエラーが原因です。

  • Process Monitorを使用してプロファイラの違いの内側と外側を把握し、両方の状況のイベントを記録して比較しようとしました。両方のログは、iphlpapi.dllとwinnsi.dllが呼び出された直後、dnsapi.dllというプロファイラ実行コードの直前に両方のログが同じになり、非プロファイラコードがクラッシュレポート関連のものを読み込むようになりました。プロファイラー実行コードが間違っているように見えるその瞬間に、新しいスレッドが4-6個作成され、非プロファイラー(クラッシュ)コードは1または2だけ作成されました。何かがあれば、その意味は分かりません。

  • 私のハードドライブは、いくつかの破損を被ったとcheckdiskは不良クラスタを見つけ始めるまで細かい仕事をしていた私のWindows 7は.NETのインストール(2.0から3.5)に含まれる背景

    間違いなく不要。私はドライブを新しいものにイメージし、.NETのこの1つの問題以外はすべて正常に動作します。

    この問題を解決するには、Windowsを再インストールするか、イメージバックアップに戻す必要があります。私が最も関連性の高いように見えたファイル/ディレクトリ(Windowsおよびプログラムファイルの下で、.NETのものに)前と後のディスクを差分を取っている

    • :ここ

      は私がに見てきた事柄のいくつかであります私が何も期待していない場所では何の変更も見られませんでした(明白なファイル破損はありません)。

    • 私はソフトウェアとシステムレジストリハイブをディスクの前後の問題と比較し、関連性のある変更は見られませんでした。
    • 私は新しいユーザーアカウントを作成し、環境が関連している場合はすべての環境変数をクリーンアップしました。変化なし。
    • "sfc/scannow"を実行したところ、完全性の問題は見つかりませんでした。
    • 破損して何も変更されていないものが見つからなかった場合に備えて、事前にコンパイルされたコードを再生成するために "ngen update"を試しました。
    • 私はウイルススキャナーを削除して、干渉していないかどうかを確認しました。違いはありません。
    • セーフモードでテストコードを実行しようとしましたが、同じクラッシュ問題です。
    • .NETインストールを修復する必要があると仮定しますが、Windows 7には.NET 3.5 - 2.0が含まれているため、.NETインストーラを再実行してやり直すことはできません。自分でWindowsを再インストールしようとすると、Windowsディスクにアクセスできません(コンピュータにはリカバリパーティションがありますが、使用できません)。また、ドライブはディスク全体の暗号化ソリューションを使用しているため、再インストールが困難です。

      私はここから最初からやり直して、新しいWindowsをインストールしたくないソフトウェアパッケージを数多く再インストールし、数十の開発関連のカスタマイズを覚えておきたいと思います。

      すべてのことを考えると、誰も助けてくれるアドバイスはありますか? .NET 3.5 - 2.0が必要です。私は開発者であり、ビルドしてテストする必要があります。

      ありがとうございます!

      Quinxy

    答えて

    1

    短い答えは、私のSystem.ni.dllファイルが破損していて、私はそれを置き換えて、すべてがうまくいきます。 .NETに関連する長い答えが解決へのアプローチの仕方によって他の誰かを助けるかもしれない

    ...

    私の問題は、アプリケーションがプロファイラーによる以外に実行しませんように損傷されます。 SlimTune open source profilerのソースをダウンロードし、ローカルにビルドし、Process.Start()の呼び出しの直前にブレークポイントを設定しました。私はその後、手動でプロファイラーを介して正常にアプリを起動に関与するすべてのパラメータを比較した。私が見つけた唯一の意味のある差は、環境変数に追加.NETプロファイルパラメータの添加であった:

    • cor_enable_profiling = 1
    • cor_profiler = {38A7EA35-B221-425a-AD07-D058C581611D}

    私は自分のユーザーの環境でこれを設定しようとしました。今では私が手動で動かしたアプリケーションは動作します。 (私は実際に数時間前に同じことをやろうとしていましたが、例に含まれていたGUIDを使用していましたが、実際のプロファイラを指していなかったようで、.NETは偽のGUIDを与えていました

    私は今、私のアプリがプロファイリングを有効にして実行された理由を理解するために、CLRによってPEファイルがどのように実行されたかについて読んで始めました。私はたくさんのことを学んだが、適用するようなものは何もなかった。

    私はchkdskログを再チェックする必要があることを覚えていましたが、ドライブ障害によって損傷したファイルのリストを保持していました。失敗後、リストにあるすべてのファイルIDをファイルパス/名前に変換して、バックアップから取り出せる100以上のファイルをすべて置き換えましたが、今戻ってきて、私が4または5 .NET関連のファイルが正常に "使用中"なので、置き換えられなかったファイルが1つありました。そのファイル? System.ni.dll !!!私は今、このファイルをバックアップから置き換えることができました。私の.NETインストールは正常に戻っています。アプリはプロファイルされているかどうかにかかわらず動作します。

    このインシデントが最初に発生したとき、私は完全に問題が破損したファイル、特に失敗したメソッドを格納していたSystem.dllというファイルに関連すると予想していたということです。そして、私はdiffとSystem.dllという名前のすべてのファイルをrediffedしました。しかし、私はその時点で、System.ni.dllがSystem.dllのネイティブでコンパイルされた兆候であることを認識していませんでした。そして、私は.NETの関連ディレクトリを差し替えて再配布し、これに気付かなかったので(私がそれを逃したとは思えませんでした)、私はそのアプローチをあきらめました。

    とにかく短い話ですが、私の問題の原因となった破損したSystem.ni.dllで、その中の1つ以上のクラスタで内容が0x0に置き換えられました。観察された。

    0

    これはタイミングの問題のように聞こえる、それはほんの少し遅くなることにより、プロファイラ「固定」。

    多くのプロファイラでは、計器(more info here)を使用しているため、アプリケーションの速度が若干低下します。どうやら、あるスレッドを遅くして別のスレッドがクラッシュするのを防ぎます。このようなエラーは、多くの場合、開発者のマシンには直接現れませんが、より多くのコアまたはハイパースレッディングを持つプロセッサで実行されるとすぐに表示されます。リリースビルドでのみ発生することがあります(デバッグビルドでも同様)。同じコードが異なる条件(プロファイラまたはデバッガ内)で異なる結果を与える可能性があるため、タイミングの問題を追跡するのは困難です。

    あなたの説明から、私はそれを固定することができる方法についての野生の推測を行うことを試みます:

    は、新しいスレッドが開始されているソースで探してみてください。その後、それらが生成された後、System.Threading.Thread.Sleep(500);行を追加してメインスレッドを一時停止し、新しいスレッドに開始する時間を与えます。

    クラッシュのソースコードといくつかのスタックトレースがなければ、これはかなりの推測です。

    +0

    本当にありがとうと思います。それは非常に興味深い仮説です。私は、この問題を明らかにするデモプログラムが文字通りPing()関数を呼び出す1行(既定のWindowsフォームプロジェクトフォーム)であり、私が持っていたディスクの問題。 しかし、私が働いている国と仕事していない国のレジストリを比較したとき、私はパフォーマンスモニタに関連したいくつかの変更が気づいたので、あなたが計測について言及した部分は非常に重要かもしれません。 –

    +0

    私はパフォーマンスカウンタに関連するレジストリの変更をさらに見直して、それらの変更が何かを行うかどうかを確認する必要があると思います。 –

    関連する問題