WinDbg を使用してダンプファイルを分析するにはどうすればよいですか?
以下に、一般的な手順を示します。
最初に、リリースビルドであってもPDBファイルを作成するように、コンパイラの設定を変更する必要があります。 Visual C++ コンパイラの以降のバージョンはデフォルトでこれを行いますが、Visual C++の多くのバージョンではこれを自分で行う必要があります。プログラムデータベースファイルを作成し、アプリケーションの各ビルドと共にそれらのファイルのアーカイブを保持します。アプリケーションのすべてのビルドに独自のPDBセットがあることが重要です。たとえば、ビルド10で作成したものと同じものを再利用して、ビルド15で生成されたダンプを調べることはできません。プロジェクトの存続期間中、大量のPDBが作成されるため、そのための準備をしてください。
次に、ダンプファイルを生成したアプリケーションの正確なバージョンを特定できる必要があります。独自のMiniDumpsを作成している場合(たとえば、 MiniDumpWriteDump() を呼び出して)、おそらくこれを行う最も簡単な方法は、MiniDumpのファイル名の一部をアプリケーションの完全なバージョン番号にすることです。これを機能させるには、適切なバージョン番号付けスキームが必要です。私の店では、オートビルダーがビルドを作成するたびに、すべてのブランチのビルド番号を1ずつ増やします。
顧客からダンプファイルを受け取ったので、ダンプを作成したアプリケーションの正確なバージョンがわかり、このビルドのPDBファイルが見つかりました。
次に、ソース管理の履歴を調べて、このソフトウェアの正確なバージョンのソースコードを見つける必要があります。これを行う最良の方法は、ビルドを行うたびにブランチに「ラベル」を適用することです。ラベルの値を正確なバージョン番号に設定すると、履歴で簡単に見つけることができます。
WinDbg/Visual C++を起動する準備がほぼ整いました。
c:\app_build_1.0.100
と言って、ハードドライブ上の別の場所に置きます。ダンプファイルを表示するための2つのオプションがあります。 Visual Studio またはWinDbgを使用できます。 Visual Studioの使用は簡単ですが、WinDbgははるかに強力です。ほとんどの場合、Visual Studioの機能で十分です。
Visual Studioを使用するには、プロジェクトのようにダンプファイルを開くだけです。開いたら、ダンプファイルを「実行」します(F5 デフォルトで)、すべてのパスが正しく設定されている場合、クラッシュしたコードにすぐに移動し、コールスタックなどを提供します。
WinDbgを使用するには、いくつかのフープにジャンプする必要があります。
.symfix
と入力します。これにより、インターネットから大量のデータが削除されるため、しばらく時間がかかる場合があります。.sympath+ c:\pdblocation
と入力し、パス名の代わりにPDBファイルを置く場所を置き換えます。 .sympath
と+
記号の間に空白を入れずにプラス記号を入力してください。そうでない場合は、手順3を台無しにしてしまいます。.srcpath c:\app_build_1.0.100
と入力して、このバージョンのソフトウェアのソース管理からコードを取得したパスを置き換えます。!analyze -v
しばらくしてから、すべてが正しく構成されていれば、WinDbgがクラッシュの場所に直接連れて行ってくれます。この時点で、アプリケーションのメモリスペース、クリティカルセクション、ウィンドウなどの状態を掘り下げるためのオプションが100万あります。しかし、それはwayを超えていますこの投稿の範囲。
幸運を!
(以下の「ダンプ」セクションを参照)
ワークスペースの仕組みを理解する...
「cmdtree」を使用すると、デバッガコマンドの「メニュー」を定義して、簡潔なコマンド名を覚えなくても頻繁に使用するコマンドに簡単にアクセスできます。
すべてのコマンド定義を同じcmdtreeテキストファイルに入れる必要はありません。..それらを別々に保持し、必要に応じて複数の定義をロードできます(その後、独自のウィンドウを取得します)。
コマンドラインで-cオプションを使用すると、WinDBGの起動時にWinDBGスクリプトを自動的に実行できます。
DML(デバッガマークアップ言語)モードを有効にし、特定の拡張機能をロードし、.NET例外ブレークポイントを設定し、カーネルフラグを設定する機会を与えます(たとえば、カーネルデバッグ時にDbgPrintマスクを変更してトレース情報を表示する必要がある場合があります... ed nt !Kd_DEFAULT_Mask 0xffffffff)、cmdtreesのロードなど。
サンプルスクリプト:
$$ Include a directory to search for extensions
$$ (point to a source controlled or UNC common directory so that all developers get access)
.extpath+"c:\svn\DevTools\WinDBG\Extensions"
$$ When debugging a driver written with the Windows Driver Framework/KMDF
$$ load this extension that comes from the WinDDK.
!load C:\WinDDK\7600.16385.1\bin\x86\wdfkd.dll
!wdftmffile C:\WinDDK\7600.16385.1\tools\tracing\i386\wdf01009.tmf
$$ load some extensions
.load msec.dll
.load byakugan.dll
.load odbgext.dll
.load sosex
.load psscor4
$$ Make commands that support DML (Debugger Markup Language) use it
.prefer_dml 1
.dml_start
$$ Show NTSTATUS codes in hex by default
.enable_long_status 1
$$ Set default extension
.setdll psscor4
$$ Show all loaded extensions
.chain /D
$$ Load some command trees
.cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree1.txt
.cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree2.txt
$$ Show some help for the extensions
!wdfkd.help
!psscor4.help
.help /D
「拡張」により、WinDBG内でサポートされるコマンド/機能の範囲を拡張できます。
一部のブログ(ネイティブコードとマネージコードのデバッグの混合)。
これは本当に幅広い質問です。
!analyze -v
を実行して、基本的な分析を実行できます。ダンプファイルを価値のあるものにするために、コードで使用可能なシンボル情報が必要です。Webサイトメモリダンプ、ソフトウェアトレース、デバッグ、マルウェア、Victimware、およびIntelligence Analysis Portalは非常に有益です。また、Mario HewardtとDaniel Pravatの本Advanced Windows Debuggingを本当に楽しんでいました。
Tess Ferrandezには、Windbgを始めるための 基本的なチュートリアルとラボの素晴らしいセット があります。強くお勧めします。