[WinDbg/CDB] 不明なシンボル名をワイルドカードで検索する

例) USER32 モジュールにある(はず)の GetDC という文字がつく関数を探す

0:000> x user32!*getdc*
77d053c3 USER32!xxxBNGetDC = <no type information>
77d0c595 USER32!NtUserGetDCEx = <no type information>
77cf86c7 USER32!NtUserGetDC = <no type information>
77d1cfd9 USER32!LBGetDC = <no type information>

Windowsでダンプファイルを取得する

windbg のコマンドプロンプトからプロセスのダンプ(ミニダンプ)を取得できる

0:00> .dump /ma <ダンプのパス>

例)

0:00> .dump /ma C:\myapp.dmp

※ 「/ma」 はミニダンプを取得するオプション。
ちなみに「/f」はフルユーザーモードダンプを取得するオプションだが、名前に反してミニダンプの方が情報量は多いのでこちらを取るほうがよい。

[WinDbg/CDB] 特定のアドレスでブレークを仕掛けてメモリ値やレジスター値を変更する

0:00> bp 6d137998 "R eax = 1;g"

ダブルクォートの中に、ブレイク後に実行したいコマンドを書きます。最後の「;g」は 「再開」の指示です。

  • アドレス 6d137998 でブレークし、アドレス 6d137900 の値を 0x00ff に変更して再開する
0:00> bp 6d137998 "ew 6d137900 0x00ff;g"
  • 関数SomeFuncでブレークし、スタックを一行だけ表示して再開する
0:00> bp Module!SomeFunc "kvn 1;g"

「1」はスタックの行数を表しています。

[WinDbg/CDB] プロセスのトータルCPU時間を表示

0:00> .time
Debug session time: Mon Oct 19 10:38:47.000 2009 (GMT+9)
System Uptime: 0 days 1:28:25.006
Process Uptime: 0 days 0:12:56.000
  Kernel time: 0 days 0:00:17.000
  User time: 0 days 0:02:39.000

別の時間でダンプを取ることにより、その間にどれくらい CPU 時間を占有していたかを知ることもできる。

0:00> .time
Debug session time: Mon Oct 19 10:39:25.000 2009 (GMT+9)
                               ^^^^^^^^^ 38ms 後
System Uptime: 0 days 1:29:00.312
Process Uptime: 0 days 0:13:34.000
Kernel time: 0 days 0:00:18.000
                    ^^^^^^^^ 1秒
User time: 0 days 0:02:40.000
                  ^^^^^^^^^^^ 1秒