3

長い(つまらない)話

現在、1台のPCでのみ例外を引き起こすアプリケーションがあります。少し掘り下げた後、小さなサンプルアプリケーションで問題をカプセル化できましたが、本当の理由はまだ隠されています.

このPCにはVisual Studioがインストールされておらず、そうすることができないため、本当の理由を見つけるために別の解決策を探しました。

最初のアプローチでは、例外メッセージを注意深く読んでコードを比較し、試行錯誤して問題の具体的な行に到達することで、小さなアプリケーションをますます削除しました。しかし、それは、使用されているすべての変数の現在の値などに関するすべての情報を取得するのに役立ちません.

そこで、必要な情報を取得するための別のより良い方法を探しました。私はすでにダンプミニダンプについて長い間読んできましたが、それらを必要としたことはありません。これまで、開発者またはテストマシンでユーザーが記述したシナリオをいつでも再現できたからです。

しかし、今回は問題のある PC が 1 台だけのようで、残念ながらマシン全体を変更するか、新しいものをすべてインストールするという選択肢はありません。

ダンプの操作方法に慣れるために、単純な C# テスト アプリケーションを作成しました。throw new ArgumentException("Test");

悪意のあるボタンを押した後、このような魔法のダンプ ファイルを作成し、それを Visual Studio 2008 Professional に読み込んで、VS 内の通常の実行中のアプリケーションのように見えるようにする必要がありますが、Step nextなどが機能しません。

私が知る限り、特定の時点でダンプを作成するための最良のツールはprocdumpです。これは、1 つまたは複数のダンプをいつ取得するかを定義できる可能性があるためです。

だから私は単にそれをダウンロードし、呼び出して開始しましたprocdump -o -e MyApp.exe d:\MyApp.dmpMyApp.exeが存在しないと主張しています。わかりました、私のせいです。最初に MyApp を起動し、その後 procdump を起動するだけです。

Procdump が実行され、使用するすべてのオプションが表示され、未処理の例外が発生するのを待っているようです。これほど簡単なことはありません。悪意のあるボタンを押すだけです...そしてprocdumpでは何も起こりません。

代わりに、未処理の例外が発生したこと (サプライズ、サプライズ) と何をしたいのか (詳細、続行、終了) を説明するアプリケーションのダイアログ ウィンドウがポップアップします。しかし、何を選択しても、procdump はダンプ ファイルを自動的に作成できません。

ダイアログにダンプファイルが表示されているときに呼び出すだけprocdump -o MyApp.exe d:\MyApp.dmpでは役に立たないようです.VSで開いた後、コールスタックはntdll.dll私のコード内のどこかにぶら下がっているだけです(これはのMessageQueueであると推測しますマウスのクリックを待っているダイアログ)。

詳細を詳しく調べると、未処理の例外を JIT デバッガーに委任する方法に関する情報が見つかります。しかし、JIT デバッガーは必要ありません。アプリケーションをクラッシュさせてダンプ ファイルを取得したいと考えています。

これらの試行の後、ClrDumpを見つけましたが、より良いダンプは生成されませんでした (VS にロードしてコール スタックを調べた場合)。

これらの情報を考慮に入れると、(できれば) .Net アプリケーションの (動作する) ソリューションを提供できるようになります。

(短い)質問

未処理の例外が .net アプリケーション内で発生したときにダンプ ファイルを作成するにはどうすればよいですか?

答え

Naveen と Lex Li の助けを借りて、クラッシュ ダンプを使用したデバッグがどのように機能するかについて、もう少し理解を深めることができました。そして今、私はそれを機能させるために必要なすべてのものを要約したいと思います:

プロセスのダンプを取得したいときはいつでも、ジョブを完了するためにいくつかのツールから選択できます。

  • Procdump
    • 複雑なシナリオでダンプを作成できる簡単なコマンド ライン ツールですが、.net の未処理の例外をキャッチすることはできません。
  • DebugDiag
    • クラッシュ時に (.net 例外でも) ダンプを作成できる簡単なグラフィカル ツールですが、Procdump のような高度なシナリオではダンプを作成できません。

ご覧のように、異なる状況でダンプを作成できる 2 つのツールが提供されるため、必要な時点でダンプを作成する上で、どちらもライバルというよりもパートナーです。

上記のツールのいずれかでダンプを作成したら、ダンプを分析して問題の原因を突き止めます。分析のために、WinDbg を取得できます。Windows 用のデバッグ ツールの一部であり、Microsoft から入手できます。残念ながら、WinDbg の参入障壁は非常に高いですが、非常に強力です。このブログを読んで、このツールの使用方法をよりよく理解してください。

.Net 4 アプリケーションがあり、Visual Studio 2010 を使用している場合は、これを分析に使用することもできます。優れたグラフィカル ユーザー インターフェイスにより、はるかに使いやすくなっていますが、WinDbg の機能はありません。より良い比較を行うには、この記事をご覧ください。

最後に、Visual Studio 2008でsos.dll を使用することもできます。

4

2 に答える 2

3

DebugDiagは、例外に基づいてメモリ ダンプを取得する最も簡単な方法の 1 つです。

例外に基づいてダンプを生成するには、debugdiag 内の「Configure Exception Dialog」ヘルプ セクションを探します。

以下は、ArgumentException に基づいてフル メモリ ダンプを生成する例です。

ここに画像の説明を入力

于 2011-01-24T19:03:01.087 に答える
1

DebugDiag または WinDbg で問題ありません。

http://support.microsoft.com/kb/919789

http://www.microsoft.com/whdc/devtools/debugging/default.mspx

于 2011-01-24T11:49:54.673 に答える