home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

技術/Windows/WinDbgメモ (v2)

技術/Windows/WinDbgメモ (v2)

技術 / Windows / WinDbgメモ (v2)
id: 706 所有者: msakamoto-sf    作成日: 2010-07-13 23:53:23
カテゴリ: WinDBG Windows プログラミング 

WinDBG参考図書:

※"AWD"サンプルコードのシンボルパスについて
本書中で紹介されているURLは2011年1月の時点でアクセス不能になっている。

http://www.advancedwindowsdebugging.com/symbols/symstore.pri

このため、"AWD"公式HPからダウンロードしたプライベートシンボルファイルをローカルPC上に展開し、そちらへのパスをシンボルパスに設定する必要がある。


WinDBGやWindowsデバッグ関連参考サイト:



簡単なBATファイルを作っておくと便利

デバッグ対象のEXEのあるディレクトリなど、適当なディレクトリにそのプロジェクト専用のWinDbg起動用BATファイルを作っておくと便利かもしれない。"_NT_"で始まる実行イメージやソース、シンボルディレクトリの環境変数を定義したり、windbgのコマンドラインオプションを埋め込んでおく。

windbg.bat:

@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側での設定
技術/Windows/WinDbgメモ を参考にゲストOS側を COM1 でカーネルデバッガの接続を有効にして起動する。
接続

ホストOS側:

windbg -k com:pipe,port=\\.\pipe\xxxxyyyy

カーネルデバッグ中にEXEファイルのシンボルをロードしたい

AWDの第三章では、プロセスが例外やDebugBreakし、カーネルデバッガに制御が渡るシナリオが紹介されています。
サンプルとして提示されているコマンド実行結果では、バックトレースの中に例外を発行した02sample.exeのシンボルが表示されています。

実際に試してみると、カーネルデバッガにブレークした時点では特定のプロセスのEXEファイル(今回なら02sample.exe)のシンボルをロード出来ませんでした。こんなエラーになっちゃいます:

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 <image.ext>=<base>,<size>.
DBGENG:  02sample.exe - Partial symbol image load missing image info
...
Unable to add module at 00000000

色々試行錯誤してみたところ、".thread"メタコマンドに"/p"オプションを付けてコンテキストを切り替えると上手くいきました。
多分、特定プロセスのコンテキストに切り替わったためにEXEのメモリイメージを認識し、シンボルファイルを検索できるようになったんだと思います。

例:"AWD"第二章で使われている02sample.exeのシンボルファイルをKD上でロードしてみます。

1.まずスレッドアドレスを見つけます。

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"も付けて、ロード出来るシンボルファイルはロードさせちゃいます。

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のシンボルをロードしてみる。

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のシンボルがロードされシンボル解決出来たことが分かりました。



プレーンテキスト形式でダウンロード
表示中のバージョン : 2
現在のバージョン : 4
更新者: msakamoto-sf
更新日: 2011-04-02 16:20:23
md5:dc936f4efed6d2de72776e612961be45
sha1:1477dc3cfb10743898783584b16f47c8ab9cfc48
コメント
コメントを投稿するにはログインして下さい。