web-dev-qa-db-ja.com

WinDbgを使用してVC ++アプリケーションのクラッシュダンプを分析する方法

WinDbg を使用してダンプファイルを分析するにはどうすればよいですか?

42
Haranadh

以下に、一般的な手順を示します。

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

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

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

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

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

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

ダンプファイルを表示するための2つのオプションがあります。 Visual Studio または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万あります。しかし、それはwayを超えていますこの投稿の範囲。

幸運を!

69
John Dibling

(以下の「ダンプ」セクションを参照)

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

WinDBGを「開始」/接続するさまざまな方法

ワークスペース

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

Cmdtree

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

  • bigLasagne(bldbgexts&blwdbgue)
    -アセンブリ構文の強調表示とドライバーマッピングツール)

  • BigLib番号リーダー

  • 白丸
    -アンチデバッグ手法、Vistaヒープの視覚化/エミュレーション、メモリ内のバッファーの追跡を検出

  • Call Flow Analyzer + KnExt

  • CmdHist
    -デバッグセッションで実行したすべてのコマンドを記録して、簡単に再実行できるようにします

  • Core Analyzer
    -ヒープ構造の破損のチェック、スレッドで共有されているオブジェクトの検出など

  • dom WinDBG Extension
    -(!stlpvector、!idt、!unhex、!grepなど)

  • dumppe
    -PEファイルをメモリからダンプします

  • 画像ビューアー拡張機能(ウラジミール・ブキチェビッチ)

  • Intel UEFI開発キットデバッガーツール
    -UEFIファームウェアのデバッグ

  • リークトラップ
    -リーク検出を支援するGDI/USERハンドルトラッカー

  • Mona (PyKDが必要)
    -高度な分析/エクスプロイトの発見を支援する一連のコマンド

  • [〜#〜] msec [〜#〜]
    -自動クラッシュ分析とセキュリティリスク評価を提供します

  • narly
    -SafeSEH、ASLR、DEP、/ GS(バッファセキュリティチェック)を使用している場合など、ロードされたモジュールに関する情報を一覧表示します

  • netext (ロドニー・ヴィアナ)
    -(!wservice-WCFサービスオブジェクトのリスト、!wconfig-.config行の表示、!whttp-HttpContextのリスト、!wselect /!wfrom-配列でのクエリのようなSQLのサポート)

  • ODbgExt
    -デバッガー拡張機能を開く

  • OllyMigrate
    -再起動せずにデバッグ対象を別のデバッガーに渡す

  • Psscor2
    -.NET 2.0マネージコードのデバッグを支援するためのSOSのスーパーセット

  • Psscor4
    -.NET 4マネージコードのデバッグを支援するためのSOSのスーパーセット

  • PyDBGExt
    -pythonスクリプトの使用を許可します

  • PyKD
    -Pythonを使用してWinDBGのスクリプトを作成できます

  • sdbgext(Nynaeve)
    -(!valloc、!vallocrwx、!heapalloc、!heapfree、!remotecall、!remotecall64、!loaddll、!unloaddll、!close、!killthread、!adjpriv、!ret)

  • SieExtPub
    -legacy extension ... ext.dllのWinDBGに組み込まれました

  • [〜#〜] sosex [〜#〜]
    -マネージドNET 2.0または4.0コードのデバッグを支援するためのその他のコマンド

  • SPT/SDBGExt2(Steve Niemitz)
    -(!DumpHttpContext、!DumpASPNetRequests、!DumpSqlConnectionPools、!DumpThreadPoolなど)

  • niqstack
    -デバッガー拡張機能のソース(それにアクセスするにはOSRオンラインアカウントが必要です)

  • viscope
    -コードカバレッジグラフ

  • Wait Chain Traversal/wct.dll(Codeplex Debugging Extensions
    -アプリケーションスレッドの待機チェーンを表示します( deadlocks の検索に役立ちます)

  • windbgshark
    -Wiresharkプロトコルアナライザーを統合して、VMトラフィックの操作と分析を有効にします

  • WinDBG Extensions(Sasha Goldstein)
    -トレーサー、WCT、heap_stat、bkb、traverse_map、traverse_vector)

  • WinDBG Highlight (ColorWindbg.dll)[Google翻訳を使用してリンクを翻訳]
    -asm構文の強調表示

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

WinDBGを使用してマネージコードをデバッグする

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

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

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

ダンプ分析ツール

  • BlueScreenView -BSOD後にWindowsによって保存されたミニダンプ.dmpファイルを見つけ、クラッシュの原因に関する情報を抽出します
  • Debug.Analyzer (ダンプファイルを分析でき、プラグインは.NETで記述できます)
  • SAD-Simple After Dump (事後分析)
  • 揮発性 -ダンプファイルに記録された「メモリ」を分析するためのフレームワーク( cheat sheet

ダンプ関連ツール

  • Citrix dumpcheck-ダンプファイルの一貫性を確認します(破棄されたように見えます link + link
  • dumpchk (デバッグツールの一部)-ダンプファイルの一貫性をチェックします
  • MoonSols Windows Memory Toolkit (以前の windd )-さまざまな生メモリダンプファイルをWinDBG互換のdmpファイルに変換します
  • vm2dmp -Microsoft Hyper-V VM State to Memory Dump Converter
  • vmss2core -VMWareスナップショットファイルをコアダンプファイルに変換します( download )、( instructions

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

動画

ブログ

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

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

代替デバッガー

その他のリンク

  • 共同RCEツールライブラリ
    -デバッガーとシステムレベルのツールの膨大なコレクション
  • cr4zyserb
    -プラグインおよびその他のデバッグツールの膨大なコレクション
  • Windowsデバッガー参照の作成方法(Devon Straw)
    -独自のデバッガーを作成したい場合に必要な詳細情報を提供する多数のリンクのコレクション。 PDBファイル形式、.DMPファイル形式、PEファイル構造、スタックトレースの記録方法など。
  • Tuts4Yo
    -アンパッカー、IDA、OlyDBG、Immunity Debuggerプラグインなど。
34
Colin Smith

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

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

Webサイトメモリダンプ、ソフトウェアトレース、デバッグ、マルウェア、Victimware、およびIntelligence Analysis Portalは非常に有益です。また、Mario HewardtとDaniel Pravatの本Advanced Windows Debuggingを本当に楽しんでいました。

5
LanceSc

Tess Ferrandezには、Windbgを始めるための 基本的なチュートリアルとラボの素晴らしいセット があります。強くお勧めします。

3
womp