WinDbgを使用してダンプファイルを分析するにはどうすればよいですか?
4 に答える
ここにあなたをあなたの道に連れて行くいくつかの一般的なステップがあります:
まず、リリースビルドの場合でも、PDBファイルを作成するようにコンパイラの設定を変更する必要があります。それ以降のバージョンのVisualC++コンパイラはデフォルトでこれを実行しますが、多くのバージョンのVisualC++では自分でこれを実行する必要があります。プログラムデータベースファイルを作成し、アプリケーションの各ビルドとともにそれらのファイルのアーカイブを保持します。アプリケーションのすべてのビルドに独自のPDBのセットがあることが重要です。たとえば、ビルド10で作成したものと同じものを再利用して、ビルド15で生成されたダンプを調べることはできません。プロジェクトの存続期間中、大量のPDBが作成されることになりますので、そのための準備をしてください。
次に、ダンプファイルを生成したアプリケーションの正確なバージョンを識別できる必要があります。独自のMiniDumpを作成する場合(たとえば、 MiniDumpWriteDump()を呼び出す場合)、これを行う最も簡単な方法は、MiniDumpのファイル名の一部をアプリケーションの完全なバージョン番号にすることです。これを機能させるには、適切なバージョン番号付けスキームを用意する必要があります。私のショップでは、autobuilderがビルドを作成するたびに、すべてのブランチのビルド番号を1ずつ増やします。
顧客からダンプファイルを受け取ったので、ダンプを作成したアプリケーションの正確なバージョンがわかり、このビルドのPDBファイルが見つかりました。
次に、ソース管理の履歴を調べて、この正確なバージョンのソフトウェアのソースコードを見つける必要があります。これを行う最良の方法は、ビルドを行うたびにブランチに「ラベル」を適用することです。ラベルの値を正確なバージョン番号に設定すると、履歴で見つけやすくなります。
WinDbg / VisualC++を起動する準備がほぼ整いました。
- そのバージョンのアプリケーションの完全なソースツリーを取得します。
c:\app_build_1.0.100
たとえば、アプリケーションバージョン1.0ビルド#100の場合は、ハードドライブの別の場所に置きます。 - アプリケーションの正確なバージョンのバイナリを取得し、ハードドライブのどこかに配置します。そのバージョンのアプリケーションをインストールしてバイナリを取得するのが最も簡単な場合があります。
- 手順2のバイナリと同じ場所にPDBファイルを配置します。
これで、ダンプファイルを表示するための2つのオプションがあります。VisualStudioまたはWinDbgを使用できます。Visual Studioの使用は簡単ですが、WinDbgの方がはるかに強力です。ほとんどの場合、VisualStudioの機能で十分です。
Visual Studioを使用するには、プロジェクトのようにダンプファイルを開くだけです。開いたら、ダンプファイルを「実行」し(F5デフォルト)、すべてのパスが正しく設定されている場合は、クラッシュしたコードに直接アクセスしたり、コールスタックを提供したりします。
WinDbgを使用するには、いくつかのフープをジャンプする必要があります。
- WinDbgを起動します
- ダンプファイルを開きます。(Ctrl+Dデフォルト)
- WinDbgに、正しいMicroSoftシンボルファイルを取得するように指示します。タイプ
.symfix
。これは、インターネットから大量のデータを取得するため、少し時間がかかる場合があります。 - シンボル(PDBファイル)がどこにあるかをWinDbgに伝えます。パス名をPDB
.sympath+ c:\pdblocation
ファイルに置き換えて、と入力します。と記号の間に空白を入れずにプラス記号を入力してください。そうしない.sympath
と、+
手順3が失敗します。 - WinDbgにソースコードがどこにあるかを伝えます。
.srcpath c:\app_build_1.0.100
このバージョンのソフトウェアを、ソース管理からコードを取得したパスに置き換えて入力します。 - WinDbgにダンプファイルを分析するように指示します。タイプ
!analyze -v
しばらくして、すべてが正しく構成されている場合、WinDbgはクラッシュの場所に直接移動します。この時点で、アプリケーションのメモリスペース、クリティカルセクション、ウィンドウなどの状態を深く掘り下げるための100万のオプションがあります。しかし、それはこの投稿の範囲をはるかに超えています。
幸運を!
(以下の「ダンプ」セクションを参照してください)
WinDbgを使用するための基本的なチュートリアルとデモンストレーション
WinDBGを「開始」/アタッチするさまざまな方法
ワークスペース
ワークスペースがどのように機能するかを理解する...
Cmdtree
「cmdtree」を使用すると、デバッガコマンドの「メニュー」を定義して、簡潔なコマンド名を覚えていなくても、頻繁に使用するコマンドに簡単にアクセスできます。
すべてのコマンド定義を同じcmdtreeテキストファイルに入れる必要はありません....必要に応じて、それらを別々に保持し、複数のコマンド定義をロードできます(その後、独自のウィンドウが表示されます)。
- すばらしいヘルパー.cmdtree
- WinDBGで起動時にcmdtreeウィンドウドックを作成するにはどうすればよいですか?
- .cmdtreeを使用してwindbgの.netダンプをデバッグしやすくする
- Microshaoft Cmdtree
- 特別なコマンド-.cmdtreeを使用してカスタマイズされたユーザーインターフェイスからコマンドを実行します
スタートアップスクリプト
コマンドラインで-cオプションを使用すると、WinDBGの起動時にWinDBGスクリプトを自動的に実行できます。
DML(デバッガーマークアップ言語)モードをオンにし、特定の拡張機能をロードし、.NET例外ブレークポイントを設定し、カーネルフラグを設定する機会を提供します(たとえば、カーネルデバッグ時に、トレース情報が表示されるようにDbgPrintマスクを変更する必要がある場合があります.... ed 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チートシート(Art of Dev)
- WinDbgカーネルモード拡張コマンドフラッシュカード
拡張機能
「拡張機能」を使用すると、WinDBG内でサポートされるコマンド/機能の範囲を拡張できます。
- bigLasagne(bldbgexts&blwdbgue)
-アセンブリ構文の強調表示とドライバーマッピングツール) - BigLibナンバーリーダー
- Byakugan-アンチ
デバッグメソッドの検出、ビスタヒープの視覚化/エミュレーション、メモリ内のバッファの追跡 - コールフローアナライザー+KnExt
- CmdHist-
デバッグセッションで実行したすべてのコマンドを記録するため、簡単に再実行できます - コアアナライザー
-ヒープ構造の破損をチェックし、スレッドによって共有されているオブジェクトを検出します。 - dom WinDBG拡張機能
-(!stlpvector、!idt、!unhex、!grepなど) - dumppe-
メモリからPEファイルをダンプします - 画像ビューア拡張機能(ウラジーミル・ヴキチェビッチ)
- IntelUEFI開発キットデバッガツール
-UEFIファームウェアのデバッグ
- リークトラップ
-リーク検出を支援するGDI/USERハンドルトラッカー - モナ(PyKDが必要)
-高度な分析/エクスプロイトの検索を支援するコマンドのセット - MSEC-
自動化されたクラッシュ分析とセキュリティリスク評価を提供します - narly
-SafeSEH、ASLR、DEP、/ GS(バッファセキュリティチェック)を使用しているかどうかなど、ロードされたモジュールに関する情報を一覧表示します - netext(Rodney Viana)
-(!wservice-WCFサービスオブジェクトの一覧表示、!wconfig-.config行の表示、!whttp-HttpContextの一覧表示、!wselect /!wfrom-配列に対するSQLのようなクエリのサポート) - ODbgExt-
デバッガー拡張機能を開く - OllyMigrate-
再起動せずにdebuggeeを別のデバッガーに渡します - Psscor2
-.NET2.0マネージコードのデバッグを支援するためのSOSのスーパーセット - Psscor4
-.NET4マネージコードのデバッグを支援するためのSOSのスーパーセット - PyDBGExt
-Pythonスクリプトを使用できるようにします
- PyKD
-Pythonを使用してWinDBGをスクリプト化できるようにします - sdbgext(Nynaeve)
-(!valloc、!vallocrwx、!heapalloc、!heapfree、!remotecall、!remotecall64、!loaddll、!unloaddll、!close、!killthread、!adjpriv、!ret) - SieExtPub-
レガシー拡張...ext.dllのWinDBGに組み込まれました - SOSEX-マネージドNET2.0
または4.0コードのデバッグを支援するためのその他のコマンド - SPT / SDBGExt2(Steve Niemitz)
-(!DumpHttpContext、!DumpASPNetRequests、!DumpSqlConnectionPools、!DumpThreadPoolなど) - Uniqstack-
デバッガー拡張機能のソース(アクセスするにはOSR Onlineアカウントが必要です) - viscope-
コードカバレッジグラフ - Wait Chain Traversal / wct.dll(Codeplex Debugging Extensions-
アプリケーションスレッドの待機チェーンを表示します(デッドロックの検出に役立ちます) - windbgshark
-Wiresharkプロトコルアナライザーを統合してVMトラフィックの操作と分析を可能にします - WinDBG拡張機能(Sasha Goldstein)
-トレーサー、WCT、heap_stat、bkb、traverse_map、traverse_vector) - WinDBGハイライト(ColorWindbg.dll)[Google翻訳を使用してリンクを翻訳する]-asm
構文のハイライト
独自の拡張機能を作成する
WinDBGを使用したマネージコードのデバッグ
- 例外を破る
- 特定のCLR例外を破る
- Windbg内での.NetFrameworkソースコードのデバッグ
- Windbgを使用したマネージコードの例外のデバッグ
- WinDbgとSOS.dllを使用したマネージコードのデバッグ
- WinDbgを使用したデバッグ。アプリケーションのデッドロック。
- WINDBGによる管理されたデバッグ。はじめにと索引
- 起動時にクラッシュするアプリケーションのWindbgでの.NETブレークポイントの設定
スクリプティング(C#、PS、Python、WinDBG)
- KDAR(Kernel Debugger Anti Rootkit)
-WinDBGスクリプトのコレクション - SysnativeBSODスクリプト/処理アプリ
- WinDBGスクリプトライブラリ-WinDBGスクリプト
のコレクション - MDbgとDbgHostLib
のスクリプト作成-マネージコードでマネージドデバッガー(MDBG)とDbgEngのスクリプトを作成できます - ExtCS
-C#スクリプトを介したWinDBGの制御を可能にします - PowerDBG
-Powershellスクリプトを介してWinDBGを制御できます
- Pykd
-Pythonスクリプトを介してWinDBGを制御できます - windbglib
-WinDBGのpykd拡張機能を囲むPythonラッパーライブラリ。immlibを模倣しています(Immunity Debugger用に作成されたスクリプトを使用できます)。
dbgeng.dll API/WinDBGツールを使用するデバッガー/ツール
- シンプルなDbgengベースのユーザーモードデバッガー
- Acorns.Debugging NET Deadlock Detector(cdb.exeを使用)(ダウンロード)
- CLRマネージドデバッガー(MDBG)
- DbgHost-デバッグエンジンを制御する方法
- デバッグ診断ツールv1.2(DebugDiag)、Ver 2.0 + DebugDiagブログ
- Dynamorio -WinDBGと対話できる動的バイナリ計測ツール
- IDA + WinDBGプラグイン
- GUI WinDBG
- LeakShell(管理されたリークを見つける)
- mdbglib-マネージドデバッグAPI
- PyDbgEng
-Windowsデバッグエンジン用のPythonラッパー - SOSNET -SOS拡張機能の使用に集中し、C#スクリプトをサポートするWinDBGフォーク/代替シェル
- SOSNET O2フォーク-C#REPL(read-eval-print-loop)スクリプトエンジンにRosylnを使用するSOSNETのフォーク
- VDB / Vivisect(kenshoto)-WinDBG上に階層化されたクロスプラットフォームのデバッグAPIを提供します
- WinAppDbg + Heappie-WinAppDbg
- 基本的なWindowsデバッガーの作成
事後分析用のクラッシュダンプファイルを生成するさまざまな方法
- DebugDiag 2.0
- ダンプチートシート
-Hyper-V、VMWare ESX、およびXenServerVMからダンプを生成する方法が含まれています。 - Citrix SystemDump
- キーボードのキー押下の組み合わせ
- MiniDumpWriteDump-
(アプリケーション内のWIN32 API呼び出しを介して)。(C#アプリケーションの例) - NMIスイッチ、または(ここ) (NMIを生成するためのハードウェアベースの機能...通常はHP
などのハイエンドサーバーにあります。または、アドインPCIカード「UniversalPCI DumpSwitch」を入手できます)。MicrosoftNMIテクノロジの背景。 - Procdump
- システム|高度なシステム設定|起動と回復
(レジストリ情報)、
(完全な(完全な)メモリダンプを構成する方法)、
(完全なメモリダンプを有効にする方法)、
(PCにたくさんの場合にWindows7で完全なメモリダンプを有効にする方法メモリの...通常、2GBを超えるメモリの場合は使用できません) - タスクマネージャ「ダンプファイルの作成」
- UserDump、手順(非常に古いツール)
- UserModeProcessDumper、命令
- VisualStudio「名前を付けてダンプを保存…」
- WER(Windowsエラー報告....ローカルダンプ)
- WinDBG
ダンプ分析ツール
- BlueScreenView -BSOD後にWindowsによって保存されたミニダンプ.dmpファイルを検索し、クラッシュの原因に関する情報を抽出します
- Debug.Analyzer(ダンプファイルを分析でき、プラグインは.NETで記述できます)
- SAD-ダンプ後のシンプル(事後分析)
- 揮発性-ダンプファイル(チートシート)に記録された「メモリ」を分析するためのフレームワーク
ダンプ関連ツール
- Citrix dumpcheck-ダンプファイルの整合性をチェックします(リンク+リンクが破棄されたように見えます)
- dumpchk(デバッグツールの一部)-ダンプファイルの整合性をチェックします
- MoonSols Windowsメモリツールキット(以前のワインド)-さまざまなrawメモリダンプファイルをWinDBG互換のdmpファイルに変換します
- vm2dmp -MicrosoftHyper-VVM状態からメモリダンプへのコンバーター
- vmss2core -VMWareスナップショットファイルをコアダンプファイルに変換します(ダウンロード)、(手順)
仮想マシンのカーネルデバッグ
- VMKD-仮想マシンKD拡張機能
- VirtualKD-(VMWare / VirtualBoxでホストされているOSのカーネルデバッガーのサポート)
ビデオ
- .NET Cracking 101#2-WinDbgの基本
- 実稼働環境(チャネル9)の.NETデバッグ
- dotnetConf-WinDbgおよびSOSを使用した高度なデバッグ
- DavidTruxall「WinDBGを使用したデバッグ」
- MikeTaultyによるメモリリークのデバッグ
- oredev 2009セッション:WinDbgを使用した.NETアプリケーションのデバッグ
- Pluralsight Advanced Windows Debugging
(およびPluralsightの他のさまざまなデバッグ) - Tess Ferrandez WinDBG(Channel9)
ブログ
一部のブログ(ネイティブコードとマネージコードのデバッグの混合)。
- 高度な.NETデバッグ
- あなたのすべての基地は私たちのものです(Sasha Goldshtein)
- 分析-v
- ASP.NETデバッグ
- Cyberiafreak(スレッド化と高度なWindowsプログラムおよびデバッグ)
- Debug Analyzer.NET
- デバッグとその先
- ExpertsMagazineオンラインのデバッグ
- ツールボックスのデバッグ(Windbgスクリプト、ソフトウェアの問題を特定するのに役立つデバッグおよびトラブルシューティングのツールと手法)
- 私の世界を解読する
- greggmのウェブログ
- JunfengZhangのWindowsプログラミングノート
- クリストファーの一口
- マーク・ルシノビッチのブログ
- MikeStalls.NETデバッグブログ
- Naveenのブログ
- あなたのデバッガーを疑うことはありません(Carlo)
- ダークコーナーからのメモ
- Ntdebuggingブログ(Microsoftグローバルエスカレーションサービスチーム)
- ニーネーブ。Windowsのデバッグとリバースエンジニアリングの冒険
- フィールド向けのPFE開発者向けメモ
- VisualStudioデバッガーチーム
- VolkervonEinemによるWinDbg
高度な記事とチュートリアルリソース
- WinDbgの高度なデバッグ手法
- MS.NetおよびWindows用のアプリケーションのデバッグ(パワーポイントスライド)
- WinDbgを使用したSTLコンテナのデバッグ
- デバッグチュートリアル1〜7(CodeProject-Toby Opferman)
- Debugging.tv
- 開発者WinDBGタグ付き記事
- フー博士のセキュリティブログ-マルウェア分析チュートリアル-リバースエンジニアリングアプローチ
- エクスプロイト作成チュートリアルパート5:デバッガモジュールとプラグインが基本的なエクスプロイト開発をどのようにスピードアップできるか
- ルートキットのハンティング
- Dell Windows Debugger Utility(DWDU)を使用したリモートMicrosoft Windows Server OSカーネルデバッグ(DELL(TM)Windows(R)Debugger Utility 1.1 README)
代替デバッガー
- 木刀-(イングマ)(レーダー用GUI)
- BugDbg
- Debug ++(まだリリースされていません)
- デバッグ
- 変色したリング0デバッガー(ダウンロード)
- edb(Linux)
- FDBG
- GoBug
- Hades(アンチデバッガー検出戦略を備えたリング3デバッガー)
- ホッパー(Linux、OSX、Windows)(Windowsデバッグは現在実装されていません)
- Hyperdbg
- IDAデバッガー
- ImmunityDebugger
- ナノマイト
- 黒曜石(非侵入型デバッガー)
- OllyDBG
- PEBrowse
- RaceVB6(VB6 Pコードデバッガー)
- レーダー
- radare2ui(radareのGUI)
- ラスタリング0デバッガ(RR0D)
- Syserカーネルデバッガー
- TRW 2000(W9x前後の非常に古いデバッガー)+ dionsプラグインアーカイブ
- VisualDuxデバッガー
- Wintruder(拡張可能なデバッガー)
- WKTVDebugger(Visual Basic Pコード用のデバッガー)(ダウンロード)
- x64_dbg
- ゼータデバッガ
その他のリンク
- コラボレーティブRCEツールライブラリ
-デバッガーおよびシステムレベルのツールの膨大なコレクション - cr4zyserb-
プラグインやその他のデバッグツールの膨大なコレクション - Windowsデバッガーリファレンスの作成方法(Devon Straw)
-独自のデバッガーを作成する場合に必要となる詳細情報を提供するリンクの大規模なコレクション(PDBファイル形式、.DMPファイル形式、PEファイル構造、スタックの記録方法など)トレースなど。 - Tuts4You-アン
パッカー、IDA、OllyDBG、ImmunityDebuggerプラグインなど。
これは本当に幅広い質問です。
- 最初のステップは、ダンプファイルをWinDbgインスタンスにロードすることです。
- 次に、シンボルが設定されていることを確認する必要があります。
- 最後に、コマンド
!analyze -v
を実行して、基本的な分析を実行できます。ダンプファイルを価値のあるものにするには、コードでシンボル情報を利用できるようにする必要があります。
Webサイトのメモリダンプ、ソフトウェアトレース、デバッグ、マルウェア、被害者およびインテリジェンス分析ポータルは、私にとって非常に有益でした。また、 MarioHewardtとDanielPravatによるAdvancedWindowsDebuggingという本も本当に楽しかったです。
Tess Ferrandezには、Windbgを使い始めるための基本的なチュートリアルとラボの素晴らしいセットがあります。私はそれらを強くお勧めします。