WinDbg を使用して VC++ アプリケーションのクラッシュ ダンプを分析するにはどうすればよいですか?
-
06-09-2019 - |
質問
使い方 WinDbg ダンプファイルを分析するためですか?
解決
ここでは、作業を進めるための一般的な手順をいくつか示します。
まず、リリース ビルドであっても PDB ファイルを作成するようにコンパイラーの設定を変更する必要があります。以降のバージョンの ビジュアルC++ コンパイラはデフォルトでこれを実行しますが、Visual C++ の多くのバージョンではこれを自分で行う必要があります。プログラム データベース ファイルを作成し、アプリケーションの各ビルドとともにそれらのファイルのアーカイブを保存します。アプリケーションのすべてのビルドに独自の PDB セットがあることが重要です。たとえば、ビルド 10 で作成したものと同じものを再利用して、ビルド 15 で生成されたダンプを調べることはできません。プロジェクトの存続期間中には、大量の PDB が作成されることになるため、その準備をしてください。
次に、ダンプ ファイルを生成したアプリケーションの正確なバージョンを特定できる必要があります。独自の MiniDumps を作成している場合 (呼び出しによって) MiniDumpWriteDump() たとえば)、おそらくこれを行う最も簡単な方法は、単に MiniDump のファイル名の一部をアプリケーションの完全なバージョン番号にすることです。これが機能するには、適切なバージョン番号付けスキームを導入する必要があります。私のショップでは、オートビルダーがビルドを作成するたびに、すべてのブランチのビルド番号を 1 ずつ増やします。
顧客からダンプ ファイルを受け取ったので、ダンプを作成したアプリケーションの正確なバージョンがわかり、このビルドの PDB ファイルも見つかりました。
次に、ソース管理の履歴を調べて、ソフトウェアの正確なバージョンのソース コードを見つける必要があります。これを行うための最良の方法は、ビルドを作成するたびにブランチに「ラベル」を適用することです。ラベルの値を正確なバージョン番号に設定すると、履歴内で見つけやすくなります。
WinDbg/Visual C++ を起動する準備がほぼ整いました。
- アプリケーションのそのバージョンの完全なソース ツリーを取得します。それをハードドライブ上の別の場所に置きます。
c:\app_build_1.0.100
アプリケーション バージョン 1.0 ビルド #100 の場合。 - アプリケーションの正確なバージョンのバイナリを取得し、ハード ドライブ上のどこかに置きます。アプリケーションのそのバージョンをインストールしてバイナリを入手するのが最も簡単かもしれません。
- PDB ファイルを手順 2 のバイナリと同じ場所に置きます。
ダンプ ファイルを表示するには 2 つのオプションがあります。使用できます ビジュアルスタジオ またはWinDbg。Visual Studio を使用する方が簡単ですが、WinDbg の方がはるかに強力です。ほとんどの場合、Visual Studio の機能で十分です。
Visual Studio を使用するには、プロジェクトと同じようにダンプ ファイルを開くだけです。開いたら、ダンプ ファイルを「実行」します (F5 デフォルトで)、すべてのパスが正しく設定されている場合は、クラッシュしたコードに直接アクセスし、コールスタックなどが表示されます。
WinDbg を使用するには、いくつかの困難を乗り越える必要があります。
- WinDbgを開始する
- ダンプ ファイルを開きます。(Ctrl + D デフォルトでは)
- WinDbg に正しい MicroSoft シンボル ファイルを取得するように指示します。タイプ
.symfix
. 。インターネットから大量のデータを取得するため、これには少し時間がかかる場合があります。 - WinDbg にシンボル (PDB ファイル) の場所を伝えます。タイプ
.sympath+ c:\pdblocation
, 、PDB ファイルを配置した場所のパス名を置き換えます。間に空白を入れずにプラス記号を入れてください。.sympath
そしてその+
署名しないとステップ 3 が台無しになります。 - WinDbg にソース コードの場所を伝えます。タイプ
.srcpath c:\app_build_1.0.100
このバージョンのソフトウェアのソース管理からコードを取得したパスを置き換えます。 - WinDbg にダンプ ファイルを分析するように指示します。タイプ
!analyze -v
しばらくして、すべてが正しく構成されていれば、WinDbg によってクラッシュの場所が表示されます。この時点で、アプリケーションのメモリ空間、重要なセクション、ウィンドウなどの状態を詳しく調べるためのオプションが 100 万通りあります。しかし、それは 方法 この投稿の範囲を超えています。
幸運を!
他のヒント
(以下の「ダンプ」セクションを参照してください)
WinDbg の使用に関する基本的なチュートリアルとデモンストレーション
- WinDbg (Windows デバッグ ツール) のインストールと構成
- Mike Taulty - WinDBG の一言
- WinDbg チュートリアル
- Windows デバッガー:パート1:WinDbg チュートリアル
WinDBG を「開始」/アタッチするさまざまな方法
ワークスペース
ワークスペースの仕組みを理解する...
コマンドツリー
「cmdtree」を使用すると、簡潔なコマンド名を覚えなくても、頻繁に使用するコマンドに簡単にアクセスできるように、デバッガー コマンドの「メニュー」を定義できます。
すべてのコマンド定義を同じ cmdtree テキスト ファイルに入れる必要はありません。必要に応じて、それらを個別に保持し、複数のコマンド定義をロードすることができます (その後、独自のウィンドウが取得されます)。
- 素晴らしいヘルパー .cmdtree
- WinDBG の起動時に cmdtree ウィンドウをドッキングするにはどうすればよいですか
- .cmdtree を使用して Windbg で .net ダンプをデバッグしやすくする
- マイクロシャフトコマンドツリー
- 特別なコマンド - .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
コマンドチートシート
- クラッシュ ダンプ分析ポスター v3.0
- SOS チートシート (.NET 2.0/3.0/3.5)
- WinDbg チートシート (開発の技術)
- WinDbg カーネルモード拡張コマンドのフラッシュカード
拡張機能
「拡張機能」を使用すると、WinDBG 内でサポートされるコマンド/機能の範囲を拡張できます。
- bigLasagne (bldbgexts & blwdbgue)
- アセンブリ構文の強調表示とドライバー マッピング ツール) - BigLib 番号リーダー
- 白眼
- アンチデバッグ方法の検出、Vista ヒープの視覚化/エミュレーション、メモリ内のバッファーの追跡 - コール フロー アナライザー + KnExt
- CmdHist
- デバッグセッションで実行したすべてのコマンドを記録し、簡単に再実行できるようにします - コアアナライザー
- ヒープ構造の破損をチェックし、スレッドによって共有されているオブジェクトを検出します。 - dom WinDBG 拡張機能
- (!stlpvector、!idt、!unhex、!grep など) - ダンペ
- メモリから PE ファイルをダンプします - 画像ビューア拡張機能 (Vladimir Vukićević)
- インテル UEFI 開発キット デバッガー ツール
- UEFIファームウェアをデバッグする
- リークトラップ
- 漏れ検出を支援する GDI/USER ハンドル トラッカー - モナ (PyKDが必要です)
- 高度な分析/エクスプロイトの発見を支援する一連のコマンド - MSEC
- 自動化されたクラッシュ分析とセキュリティ リスク評価を提供します - ほとんど
- SafeSEH、ASLR、DEP、/GS (バッファ セキュリティ チェック) を使用しているかどうかなど、ロードされたモジュールに関する情報をリストします。 - ネットテキスト (ロドニー・ヴィアナ)
- (!wservice - WCF サービス オブジェクトのリスト、!wconfig - .config 行の表示、!whttp - HttpContexts のリスト、!wselect/!wfrom - 配列に対する SQL のようなクエリのサポート) - ODbgExt
- デバッガ拡張機能を開く - オリーマイグレート
- 再起動せずにデバッグ対象を別のデバッガに渡します - Psscor2
- .NET 2.0 マネージ コードのデバッグを支援する SOS のスーパーセット - Psscor4
- .NET 4 マネージ コードのデバッグを支援する SOS のスーパーセット - PyDBGExt
- Python スクリプトの使用を許可します
- PyKD
- Python を使用して WinDBG をスクリプト化できるようにします - sdbgext (ニーナエブ)
-(!valloc、!vallocrwx、!heapalloc、!heapfree、!remotecall、!remotecall64、!loaddll、!unloaddll、!close、!killthread、!adjpriv、!ret) - SieExtPub
-レガシー拡張機能...ext.dll の WinDBG に組み込まれるようになりました - ソセックス
- マネージド NET 2.0 または 4.0 コードのデバッグに役立つその他のコマンド - SPT/SDBGExt2 (スティーブ・ニーミッツ)
- (!DumpHttpContext、!DumpASPNetRequests、!DumpSqlConnectionPools、!DumpThreadPool など) - ユニークスタック
- デバッガー拡張機能へのソース (アクセスするには OSR オンライン アカウントが必要です) - 鏡
- コードカバレッジグラフ - 待機チェーン トラバーサル/wct.dll (Codeplex デバッグ拡張機能)
- アプリケーションスレッドの待機チェーンを表示 (検索に役立ちます) デッドロック) - ウインドブシャーク
- Wireshark プロトコル アナライザーを統合して、VM トラフィックの操作と分析を可能にします - WinDBG 拡張機能 (Sasha Goldstein)
- トレーサー、WCT、heap_stat、bkb、traverse_map、traverse_vector) - WinDBG ハイライト (ColorWindbg.dll) [リンクを翻訳するには Google 翻訳を使用してください]
- asm 構文の強調表示
独自の拡張機能を作成する
WinDBG を使用したマネージド コードのデバッグ
- 例外を突破する
- 特定の CLR 例外で中断する
- Windbg 内での .Net Framework ソース コードのデバッグ
- Windbg を使用したマネージド コードの例外のデバッグ
- WinDbg と SOS.dll を使用したマネージ コードのデバッグ
- WinDbg を使用したデバッグ。アプリケーションのデッドロック。
- WINDBG による管理されたデバッグ。はじめにと索引
- 起動時にクラッシュするアプリケーションに対して Windbg で .NET ブレークポイントを設定する
スクリプト (C#、PS、Python、WinDBG)
- KDAR (カーネル デバッガー アンチ ルートキット)
- WinDBG スクリプトのコレクション - Sysnative BSOD スクリプト/処理アプリ
- WinDBG スクリプト ライブラリ
- WinDBG スクリプトのコレクション - MDbg および DbgHostLib のスクリプト作成
- マネージ コードでマネージ デバッガー (MDBG) と DbgEng をスクリプト化できるようにします。 - ExtCS
- C# スクリプト経由で WinDBG を制御できるようにします - パワーDBG
- Powershell スクリプト経由で WinDBG を制御できるようにします
- パイクド
- Python スクリプト経由で WinDBG を制御できるようにします - ウィンドブグリブ
- immlib を模倣した、WinDBG の pykd 拡張機能の Python ラッパー ライブラリ (元々 Immunity Debugger 用に書かれたスクリプトを使用できます)
dbgeng.dll API を使用するデバッガー/ツール/WinDBG ツール
- シンプルな DBGENG ベースのユーザー モード デバッガー
- Acorns.NET デッドロック検出器のデバッグ (cdb.exe を使用します) (ダウンロード)
- CLR マネージド デバッガー (MDBG)
- DbgHost - デバッグ エンジンを制御する方法
- デバッグ診断ツール v1.2 (デバッグダイアグ)、 バージョン2.0 + デバッグダイアグのブログ
- ディナモリオ - WinDBG と対話できる動的バイナリ インストルメンテーション ツール
- アイダ + WinDBGプラグイン
- GUI WinDBG
- リークシェル (管理されたリークを見つける)
- mdbglib - マネージド デバッグ API
- PyDbgEng
- Windows デバッグ エンジン用の Python ラッパー - SOSNET - SOS 拡張機能の使用に重点を置き、C# スクリプトをサポートする WinDBG フォーク/代替シェル
- SOSNET O2 フォーク - C# REPL (read-eval-print-loop) スクリプト エンジンに Rosyln を使用する SOSNET のフォーク
- VDB/生体解剖 (kenshoto) - WinDBG 上に階層化されたクロスプラットフォーム デバッグ API を提供します
- WinAppDbg + Heappie-WinAppDbg
- 基本的な Windows デバッガの作成
事後分析用のクラッシュ ダンプ ファイルを生成するさまざまな方法
- デバッグダイアグ 2.0
- ダンプチートシート
- Hyper-V、VMWare ESX、および XenServer VM からダンプを生成する方法が含まれます。 - Citrix システムダンプ
- キーボードのキー入力の組み合わせ
- ミニダンプ書き込みダンプ
- (アプリケーション内の WIN32 API 呼び出し経由)。 (C#アプリケーションの例) - NMIスイッチ, 、 または (ここ)
(NMI を生成するハードウェア ベースの機能...通常はハイエンド サーバーにあります。 HP または、アドイン PCI カードを入手できます。 「ユニバーサルPCIダンプスイッチ」)。マイクロソフト NMI テクノロジー 背景. - プロダンプ
- システム|システムの詳細設定|起動と回復
(レジストリ情報),
(完全 (フル) メモリ ダンプを構成する方法),
(完全なメモリダンプを有効にする方法),
(PC に大量のメモリが搭載されている場合に Windows 7 で完全メモリ ダンプを有効にする方法...通常、メモリが 2GB を超える場合は使用できません) - タスクマネージャー「ダンプファイルの作成」
- ユーザーダンプ, 説明書 (非常に古いツール)
- ユーザーモードプロセスダンパー, 説明書
- Visual Studio「ダンプを名前を付けて保存…」
- WER (Windows エラー報告....ローカル ダンプ)
- WinDBG
ダンプ分析ツール
- ブルースクリーンビュー - BSOD 後に Windows によって保存されたミニダンプ .dmp ファイルを検索し、クラッシュの原因に関する情報を抽出します。
- デバッグアナライザー (ダンプ ファイルを分析でき、プラグインは .NET で作成できます)
- 悲しい - ダンプ後のシンプルな (死後分析装置)
- ボラティリティ - ダンプファイルに記録された「メモリ」を分析するためのフレームワーク (カンニングペーパー)
ダンプ関連ツール
- Citrix dumpcheck - ダンプ ファイルの整合性をチェックします (放棄されたようです) リンク + リンク)
- ダンチク (デバッグ ツールの一部) - ダンプ ファイルの整合性をチェックします。
- MoonSols Windows メモリ ツールキット (以前は 風) - さまざまな生のメモリ ダンプ ファイルを WinDBG 互換の dmp ファイルに変換します
- vm2dmp - Microsoft Hyper-V VM 状態からメモリ ダンプへのコンバータ
- vmss2コア - VMWare スナップショット ファイルをコア ダンプ ファイルに変換します (ダウンロード), (説明書)
カーネルの仮想マシンのデバッグ
動画
- .NET クラック 101 #2 - WinDbg の基本
- 運用環境の .NET デバッグ (Channel9)
- dotnetConf - WinDbg と SOS を使用した高度なデバッグ
- David Truxall「WinDBG によるデバッグ」
- Mike Taulty のメモリ リークのデバッグ
- oredev 2009 セッション:WinDbg を使用した .NET アプリケーションのデバッグ
- Pluralsight の高度な Windows デバッグ
(その他にも Pluralsight にあるもの) - テス フェランデス WinDBG (チャンネル 9)
ブログ
一部のブログ (ネイティブ コードとマネージ コードのデバッグが混在)。
- 高度な .NET デバッグ
- あなたの基地はすべて私たちのものです (サーシャ・ゴールドシュタイン)
- 分析-v
- ASP.NETのデバッグ
- サイベリアフリーク (スレッド化と高度な Windows プログラムとデバッグ)
- デバッグアナライザー.NET
- デバッグとその先へ
- デバッグ エキスパート マガジン オンライン
- デバッグツールボックス (ソフトウェアの問題を切り分けるのに役立つ Windbg スクリプト、デバッグおよびトラブルシューティングのツールとテクニック。)
- 私の世界を解読する
- gregm のウェログ
- Junfeng Zhang の Windows プログラミング ノート
- クリストファーの豆知識
- マーク・ルシノビッチのブログ
- Mike Stalls の .NET デバッグ ブログ
- ナヴィーンのブログ
- デバッガーを疑うな (カルロ)
- 暗い隅からのメモ
- Ntdebugging ブログ (マイクロソフト グローバル エスカレーション サービス チーム)
- ニーナエブ。Windows のデバッグとリバース エンジニアリングの冒険
- 現場向けの PFE 開発者ノート
- Visual Studio デバッガー チーム
- WinDbg by Volker von Einem
高度な記事とチュートリアル リソース
- WinDbg の高度なデバッグ手法
- MS.Net および Windows 用アプリケーションのデバッグ (Powerpoint スライド)
- WinDbg を使用した STL コンテナのデバッグ
- デバッグ チュートリアル 1 ~ 7 (CodeProject-Toby Opferman)
- デバッグ.tv
- 開発者または WinDBG タグ付けされた記事
- Dr Fu のセキュリティ ブログ - マルウェア分析チュートリアル - リバース エンジニアリング アプローチ
- エクスプロイト作成チュートリアル パート 5:デバッガー モジュールとプラグインが基本的なエクスプロイト開発をスピードアップする方法
- ハンティングルートキット
- Dell Windows Debugger Utility (DWDU) を使用したリモート Microsoft Windows Server OS カーネルのデバッグ (DELL(TM) Windows(R) デバッガー ユーティリティ 1.1 README)
代替デバッガ
- 木剣 - (イングマ) (レーダー用の GUI)
- バグデータベース
- デバッグ++ (まだリリースされていません)
- デバッグ
- 変色したリング 0 デバッガー (ダウンロード)
- エドブ (Linux)
- FDBG
- ゴーバグ
- Hades (アンチデバッガー検出戦略を備えたリング 3 デバッガー)
- ホッパー (Linux、OSX、および Windows) (Windows のデバッグは現在実装されていません)
- ハイパーデータベース
- IDAデバッガー
- イミュニティデバッガー
- ナノマイト
- Obsidian (非侵入型デバッガー)
- オリーDBG
- PE閲覧
- レースVB6 (VB6 Pコードデバッガ)
- レーダー
- レーダー2ui (レーダー用の GUI)
- ラスタリング0デバッガー (RR0D)
- Syser カーネル デバッガー
- TRW2000 (W9x 頃の非常に古いデバッガー) + ディオンズプラグインアーカイブ
- VisualDux デバッガー
- ウィントルーダー (拡張可能なデバッガ)
- WKTVデバッガー (Visual Basic P-Code のデバッガー) (ダウンロード)
- x64_dbg
- ゼータ デバッガー
その他のリンク
- 共同 RCE ツール ライブラリ
- デバッガおよびシステムレベルのツールの膨大なコレクション - cr4zyserb
- プラグインやその他のデバッグ ツールの膨大なコレクション - Windows デバッガーの作成方法のリファレンス (Devon Straw)
- 独自のデバッガを作成する場合に必要となる詳細情報を提供するリンクの大規模なコレクション。PDBファイル形式、.DMPファイル形式、PEファイル構造、スタックトレースの記録方法など - タッツフォーユー
- アンパッカー、IDA、OllyDBG、Immunity Debugger プラグインなど。
これは本当に幅広い質問です。
- 最初のステップは、ダンプ ファイルを WinDbg インスタンスにロードすることです。
- 次に、シンボルが設定されていることを確認する必要があります。
- 最後に、コマンドを実行できます
!analyze -v
基本的な分析を実行します。ダンプ ファイルを価値のあるものにするには、コードで使用できるシンボル情報が必要です。
ウェブサイト メモリ ダンプ、ソフトウェア トレース、デバッグ、マルウェア、被害者ウェア、およびインテリジェンス分析ポータル 私にとってとても参考になりました。私も本がとても楽しかったので、 高度な Windows デバッグ マリオ・ヒューワードとダニエル・プラヴァト著。
テスFerrandezは素晴らしいを持っていますWindbgのを始めるためにの基本的なチュートリアルとラボのセット。私は非常にそれらをお勧めします。