WinDbg を使用して VC++ アプリケーションのクラッシュ ダンプを分析するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/734272

質問

使い方 WinDbg ダンプファイルを分析するためですか?

役に立ちましたか?

解決

ここでは、作業を進めるための一般的な手順をいくつか示します。

まず、リリース ビルドであっても PDB ファイルを作成するようにコンパイラーの設定を変更する必要があります。以降のバージョンの ビジュアルC++ コンパイラはデフォルトでこれを実行しますが、Visual C++ の多くのバージョンではこれを自分で行う必要があります。プログラム データベース ファイルを作成し、アプリケーションの各ビルドとともにそれらのファイルのアーカイブを保存します。アプリケーションのすべてのビルドに独自の PDB セットがあることが重要です。たとえば、ビルド 10 で作成したものと同じものを再利用して、ビルド 15 で生成されたダンプを調べることはできません。プロジェクトの存続期間中には、大量の PDB が作成されることになるため、その準備をしてください。

次に、ダンプ ファイルを生成したアプリケーションの正確なバージョンを特定できる必要があります。独自の MiniDumps を作成している場合 (呼び出しによって) MiniDumpWriteDump() たとえば)、おそらくこれを行う最も簡単な方法は、単に MiniDump のファイル名の一部をアプリケーションの完全なバージョン番号にすることです。これが機能するには、適切なバージョン番号付けスキームを導入する必要があります。私のショップでは、オートビルダーがビルドを作成するたびに、すべてのブランチのビルド番号を 1 ずつ増やします。

顧客からダンプ ファイルを受け取ったので、ダンプを作成したアプリケーションの正確なバージョンがわかり、このビルドの PDB ファイルも見つかりました。

次に、ソース管理の履歴を調べて、ソフトウェアの正確なバージョンのソース コードを見つける必要があります。これを行うための最良の方法は、ビルドを作成するたびにブランチに「ラベル」を適用することです。ラベルの値を正確なバージョン番号に設定すると、履歴内で見つけやすくなります。

WinDbg/Visual C++ を起動する準備がほぼ整いました。

  1. アプリケーションのそのバージョンの完全なソース ツリーを取得します。それをハードドライブ上の別の場所に置きます。 c:\app_build_1.0.100 アプリケーション バージョン 1.0 ビルド #100 の場合。
  2. アプリケーションの正確なバージョンのバイナリを取得し、ハード ドライブ上のどこかに置きます。アプリケーションのそのバージョンをインストールしてバイナリを入手するのが最も簡単かもしれません。
  3. PDB ファイルを手順 2 のバイナリと同じ場所に置きます。

ダンプ ファイルを表示するには 2 つのオプションがあります。使用できます ビジュアルスタジオ またはWinDbg。Visual Studio を使用する方が簡単ですが、WinDbg の方がはるかに強力です。ほとんどの場合、Visual Studio の機能で十分です。

Visual Studio を使用するには、プロジェクトと同じようにダンプ ファイルを開くだけです。開いたら、ダンプ ファイルを「実行」します (F5 デフォルトで)、すべてのパスが正しく設定されている場合は、クラッシュしたコードに直接アクセスし、コールスタックなどが表示されます。

WinDbg を使用するには、いくつかの困難を乗り越える必要があります。

  1. WinDbgを開始する
  2. ダンプ ファイルを開きます。(Ctrl + D デフォルトでは)
  3. WinDbg に正しい MicroSoft シンボル ファイルを取得するように指示します。タイプ .symfix. 。インターネットから大量のデータを取得するため、これには少し時間がかかる場合があります。
  4. WinDbg にシンボル (PDB ファイル) の場所を伝えます。タイプ .sympath+ c:\pdblocation, 、PDB ファイルを配置した場所のパス名を置き換えます。間に空白を入れずにプラス記号を入れてください。 .sympath そしてその + 署名しないとステップ 3 が台無しになります。
  5. WinDbg にソース コードの場所を伝えます。タイプ .srcpath c:\app_build_1.0.100 このバージョンのソフトウェアのソース管理からコードを取得したパスを置き換えます。
  6. WinDbg にダンプ ファイルを分析するように指示します。タイプ !analyze -v

しばらくして、すべてが正しく構成されていれば、WinDbg によってクラッシュの場所が表示されます。この時点で、アプリケーションのメモリ空間、重要なセクション、ウィンドウなどの状態を詳しく調べるためのオプションが 100 万通りあります。しかし、それは 方法 この投稿の範囲を超えています。

幸運を!

他のヒント

(以下の「ダンプ」セクションを参照してください)

WinDbg の使用に関する基本的なチュートリアルとデモンストレーション

WinDBG を「開始」/アタッチするさまざまな方法

ワークスペース

ワークスペースの仕組みを理解する...

コマンドツリー

「cmdtree」を使用すると、簡潔なコマンド名を覚えなくても、頻繁に使用するコマンドに簡単にアクセスできるように、デバッガー コマンドの「メニュー」を定義できます。

すべてのコマンド定義を同じ cmdtree テキスト ファイルに入れる必要はありません。必要に応じて、それらを個別に保持し、複数のコマンド定義をロードすることができます (その後、独自のウィンドウが取得されます)。

起動スクリプト

コマンド ラインで -c オプションを使用すると、WinDBG の起動時に WinDBG スクリプトを自動的に実行できます。

DML (デバッガー マークアップ言語) モードをオンにし、特定の拡張機能をロードし、.NET 例外ブレークポイントを設定し、カーネル フラグを設定する機会を与えます (例:カーネルのデバッグ時には、トレース情報を表示するために DbgPrint マスクを変更する必要がある場合があります (nt!Kd_DEFAULT_Mask 0xffffffff)、cmdtree のロードなど。

スクリプトの例:

$$ 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 内でサポートされるコマンド/機能の範囲を拡張できます。

独自の拡張機能を作成する

WinDBG を使用したマネージド コードのデバッグ

スクリプト (C#、PS、Python、WinDBG)

dbgeng.dll API を使用するデバッガー/ツール/WinDBG ツール

事後分析用のクラッシュ ダンプ ファイルを生成するさまざまな方法

ダンプ分析ツール

ダンプ関連ツール

  • Citrix dumpcheck - ダンプ ファイルの整合性をチェックします (放棄されたようです) リンク + リンク)
  • ダンチク (デバッグ ツールの一部) - ダンプ ファイルの整合性をチェックします。
  • MoonSols Windows メモリ ツールキット (以前は ) - さまざまな生のメモリ ダンプ ファイルを WinDBG 互換の dmp ファイルに変換します
  • vm2dmp - Microsoft Hyper-V VM 状態からメモリ ダンプへのコンバータ
  • vmss2コア - VMWare スナップショット ファイルをコア ダンプ ファイルに変換します (ダウンロード), (説明書)

カーネルの仮想マシンのデバッグ

  • VMKD - 仮想マシン KD 拡張機能
  • VirtualKD - (VMWare/VirtualBox でホストされている OS に対するカーネル デバッガーのサポート)

動画

ブログ

一部のブログ (ネイティブ コードとマネージ コードのデバッグが混在)。

高度な記事とチュートリアル リソース

代替デバッガ

その他のリンク

これは本当に幅広い質問です。

  1. 最初のステップは、ダンプ ファイルを WinDbg インスタンスにロードすることです。
  2. 次に、シンボルが設定されていることを確認する必要があります。
  3. 最後に、コマンドを実行できます !analyze -v 基本的な分析を実行します。ダンプ ファイルを価値のあるものにするには、コードで使用できるシンボル情報が必要です。

ウェブサイト メモリ ダンプ、ソフトウェア トレース、デバッグ、マルウェア、被害者ウェア、およびインテリジェンス分析ポータル 私にとってとても参考になりました。私も本がとても楽しかったので、 高度な Windows デバッグ マリオ・ヒューワードとダニエル・プラヴァト著。

テスFerrandezは素晴らしいを持っていますWindbgのを始めるためにの基本的なチュートリアルとラボのセット。私は非常にそれらをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top