[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

Windows で Core をはかせる

Debugging Tools for Windows をインストールすると入っている ADPlus ツールを使う。

  • 稼動中のプロセスのダンプを取る
    C:\> adplus -hang -p <pid>
    
  • ACCESS VIORATION などによりクラッシュしたさいにダンプを取るように設定する
    C:\ adplus -crash -p <pid>
    

    ダンプファイルはデフォルトでは WinDbg? のインストールディレクトリ以下にフォルダが作成され、その下に置かれる。

C:\Program Files\Debugging Tools for Windows (x86)\Hang_Mode__Date_01-07-2017__Time_22-11-4141

GDB/CDB デバッグコマンド早見表

処理 cdb gdb
ファイルオープン C:\> cdb -z <file>  
プロセスにアタッチ C:\> cdb -p <pid>
プロセスをデタッチ    
スタックトレース kvn where
全スタックトレース  ~*kvn thread apply all bt
フレームの移動 .frame <frame#> f <frame#>
スレッド一覧  ~* info thread
スレッドの移動  ~<thread#>s thread <thread#>
データの表示(4bytes) dd <addr> x/wx <addr>
データの10つ表示(4bytes) dd <addr> L10 x/10wx <addr>
一行のデータ数を指定 dd /c<#> <addr>
データの表示(8bytes)   x/gx <addr>
シンボル値の表示 x <symbol> p <symbol>
変数、関数のアドレスの表示   info var <var regexp>
ローカル変数の表示 dv  
命令のデコード u <addr> x/i <addr>
関数のディスアセンブル uf <func> disas <func>
クラスフィールドの表示 set print pretty on
print *((‘Pkg::ClassName’ * ) 0x189956e0)
関数一覧の表示   info functions
レジスタの表示 r info reg
ヘルプの表示 ? help
ブレーク(デバッグ開始) Ctr+C Ctr+C
ブレークの設定(関数) bp <addr> stop in <func>
ブレークの設定(アドレス)   break *0x449506
ブレークの設定(ソース行)   break <file>:<line>
ブレークの設定(クラス名+関数) break <class>::<func>()
ブレークの設定(コマンド指定) bp <func> “<cmd> ;g”  
ブレークポイント一覧 bl info breakpoints
ブレークポイントの一時無効化 bd <break#>  
ブレークポイントの削除 bc <break#> delete <break#>
ブレークポイントを全削除 bc *  
実行/再開 g run/cont
ステップイン t  step, stepi
ステップオーバー p  next, nexti
ステップアウト   finish
値の設定    
フレームの移動   frame <frame#>
フレームの情報表示   info frame <frame#>
ソースの表示 list