[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秒

WinDgb/CDBでシンボルパスをセットする

ネットワークにつながっていれば以下のいずれかの設定でオンラインでシンボルを検索できます。以下に出てくる「C:\symbols」はネットワーク上からダウンロードしてきたシンボルファイルをローカルで保管しておく場所です。
パス名は任意ですがあらかじめ作成しておく必要があります。

  • 環境変数として設定する場合
  1. コントロールパネル->システム
  2. 「詳細設定タブ」
  3. 「環境変数」
  4. ユーザ環境変数、もしくはシステム環境変数の「新規」をクリックし、以下変数名と値をセット

    変数名 変数値
    _NT_SYMBOL_PATH SRV*C:\sybmols*http://msdl.microsoft.com/download/symbol
  1. File->Symbol File Path …
  2. テキストボックスに以下を入力
    SRV*C:\sybmols*http://msdl.microsoft.com/download/symbols
  • cdb 起動時にオプションでシンボルパスを設定する場合
C:\> cdb -y SRV*C:\symbols*http://msdl.microsoft.com/download/symbols 
  • cdb 起動後に .sympath コマンドを使ってシンボルパスを設定する場合
0:00> .sympath SRV*C:\symbols*http://msdl.microsoft.com/download/symbols

MS 以外から提供されているシンボルファイルをローカルで持ち、そちらも参照するようにしたい場合にはシンボルパスにセミコロン(;)で区切って指定することもできます。

0:00> .sympath C:\product\x64\Release;SRV*C:\symbols*http://sym.example.com/symbols;SRV*C:\symbols*http://msdl.microsoft.com/download/symbols -z