#navi_header|技術| WinDBG参考図書: #amazon||> ||< #amazon||> ||< - "AWD"公式HP : Welcome to Advanced Windows Debugging, windows debugging portal, ... -- http://advancedwindowsdebugging.com/ - Windowsデバッグの極意 -- http://ascii.asciimw.jp/books/books/detail/978-4-04-867608-3.shtml ※"AWD"サンプルコードのシンボルパスについて 本書中で紹介されているURLは2011年1月の時点でアクセス不能になっている。 http://www.advancedwindowsdebugging.com/symbols/symstore.pri このため、"AWD"公式HPからダウンロードしたプライベートシンボルファイルをローカルPC上に展開し、そちらへのパスをシンボルパスに設定する必要がある。 ---- WinDBGやWindowsデバッグ関連参考サイト: - Driver Developer Resources: Debugging Tools for Windows -- http://www.microsoft.com/whdc/devtools/debugging/default.mspx - Ntdebugging Blog - Site Home - MSDN Blogs -- http://blogs.msdn.com/b/ntdebugging/ - Welcome to WinDbg.info -- http://windbg.info/ --- 日本語訳された"WinDbg From A to Z!"は分かりやすいし、"Common WinDbg Commands"は使い始めの頃は印刷して手元で確認出来ると便利。"CrashMe"はWinDbgに入門する時のサンプルアプリに使う。 ---- #outline|| ---- * 簡単なBATファイルを作っておくと便利 デバッグ対象のEXEのあるディレクトリなど、適当なディレクトリにそのプロジェクト専用のWinDbg起動用BATファイルを作っておくと便利かもしれない。"_NT_"で始まる実行イメージやソース、シンボルディレクトリの環境変数を定義したり、windbgのコマンドラインオプションを埋め込んでおく。 windbg.bat: #pre||> @echo off cd /d %~dp0 set PATH=C:\WinDDK\7600.16385.1\Debuggers;%PATH% set _NT_SYMBOL_PATH=cache*C:\temp\symcache;srv*http://msdl.microsoft.com/download/symbols;. set _NT_EXECUTABLE_IMAGE_PATH=. set _NT_SOURCE_PATH=. set _NT_DEBUG_LOG_FILE_APPEND=windbg.log start windbg.exe -srcpath %_NT_SOURCE_PATH% -loga %_NT_DEBUG_LOG_FILE_APPEND% -WF foo.wew debugee.exe arg1 arg2 ... ||< "_NT_SYMBOL_PATH"については各自の環境に応じて調整する。cacheを入れておくと良い。 わざわざ"-srcpath"を指定しているのは、環境変数で"_NT_SOURCE_PATH"を指定してもGUI("File" -> "Source File Path ...")に反映ず、"-srcpath"で指定すればちゃんと反映されたため。 "-WF"でWorkspace設定を読み込ませるようにしているが、WinDbg終了時に"File" -> "Save Workspace"を実行しておかないと保存されない=意味無しので注意。終了時に自動保存してくれると楽なんだけど。 * VMware上のゲストWindowsOSのカーネルデバッグ接続(Named Pipe) : ホストOS側での設定 : VMwareマシンの設定でシリアルポートを追加する。「接続」で「名前付きパイプを使用する」を設定。「この端末はサーバです。」「接続先はアプリケーションです。」の組み合わせに設定する。 : ゲストOS側での設定 : [[706]] を参考にゲストOS側を COM1 でカーネルデバッガの接続を有効にして起動する。 : 接続 :#block||> ホストOS側: windbg -k com:pipe,port=\\.\pipe\xxxxyyyy ||< * カーネルデバッグ中にEXEファイルのシンボルをロードしたい AWDの第三章では、プロセスが例外やDebugBreakし、カーネルデバッガに制御が渡るシナリオが紹介されています。 サンプルとして提示されているコマンド実行結果では、バックトレースの中に例外を発行した02sample.exeのシンボルが表示されています。 実際に試してみると、カーネルデバッガにブレークした時点では特定のプロセスのEXEファイル(今回なら02sample.exe)のシンボルをロード出来ませんでした。こんなエラーになっちゃいます: #pre||> kd> !reload -f 02sample.exe "02sample.exe" was not found in the image list. Debugger will attempt to load "02sample.exe" at given base 00000000. Please provide the full image name, including the extension (i.e. kernel32.dll) for more reliable results.Base address and size overrides can be given as .reload =,. DBGENG: 02sample.exe - Partial symbol image load missing image info ... Unable to add module at 00000000 ||< 色々試行錯誤してみたところ、".thread"メタコマンドに"/p"オプションを付けてコンテキストを切り替えると上手くいきました。 多分、特定プロセスのコンテキストに切り替わったためにEXEのメモリイメージを認識し、シンボルファイルを検索できるようになったんだと思います。 例:"AWD"第二章で使われている02sample.exeのシンボルファイルをKD上でロードしてみます。 1.まずスレッドアドレスを見つけます。 #pre||> kd> !process 0 4 02sample.exe PROCESS 81e4c020 SessionId: 0 Cid: 0474 Peb: 7ffdf000 ParentCid: 0278 DirBase: 09bc0420 ObjectTable: e1837878 HandleCount: 7. Image: 02sample.exe THREAD 8203a810 Cid 0474.0ee0 Teb: 7ffde000 Win32Thread: 00000000 WAIT ^^^^^^^^^^^^^^^ ||< 2.".thread /p"でコンテキストを切り替えます。ついでに"/r"も付けて、ロード出来るシンボルファイルはロードさせちゃいます。 #pre||> kd> .thread /p /r 8203a810 Implicit thread is now 8203a810 Implicit process is now 81e4c020 .cache forcedecodeuser done Loading User Symbols .... (ntdll.dllのシンボルファイルのロードメッセージ。 "!sym noisy"に設定してたから出力されたのかも。) ||< 3.バックトレースの表示をトリガーにして、02sample.exeのシンボルをロードしてみる。 #pre||> kd> k *** Stack trace for last set context - .thread/.cxr resets it ChildEBP RetAddr b1f5a42c 80502cf0 nt!KiSwapContext+0x2e b1f5a438 804fbd72 nt!KiSwapThread+0x46 b1f5a460 8063afc4 nt!KeWaitForSingleObject+0x1c2 b1f5a540 8063c099 nt!DbgkpQueueMessage+0x17c b1f5a564 8063c1cb nt!DbgkpSendApiMessage+0x45 b1f5a5f0 804feccc nt!DbgkForwardException+0x8f b1f5a9b0 8050245b nt!KiDispatchException+0x37e b1f5ad34 80542ec1 nt!KiRaiseException+0x175 b1f5ad50 8053f668 nt!NtRaiseException+0x31 b1f5ad50 7c812afb nt!KiFastCallEntry+0xf8 (kernel32.dllのシンボルロードメッセージ) 0006ff04 77bd272c kernel32!RaiseException+0x53 (02sample.exeのシンボルロードメッセージ) 0006ff44 010016eb msvcrt!_CxxThrowException+0x36 0006ff58 01001d63 02sample!RaiseCPP+0x1b [c:\awd\chapter2\sample.cpp @ 50] 0006ff70 01001c7b 02sample!AppInfo::Loop+0xb3 [c:\awd\common\menu.h @ 47] 0006ff7c 01002038 02sample!wmain+0x1b [c:\awd\chapter2\sample.cpp @ 228] 0006ffc0 7c817077 02sample!__wmainCRTStartup+0x102 [d:\vistartm\base\crts\crtw32\dllstuff\crtexe.c @ 711] 0006fff0 00000000 kernel32!BaseProcessStart+0x23 ||< 02sampleのシンボルがロードされシンボル解決出来たことが分かりました。 #navi_footer|技術|