よく使う重要コマンド        2018/12/20 [31]                           ■自動解析 (最初に実行するコマンド) x: kd> !analyze -v stopエラー自動解析 (メモリダンプ解析の時) x: kd> lmvm ドライバ名 ドライバのタイムスタンプ ■プロセスとスレッド x: kd> !pcr 実行スレッド(CurrentThread)、IdleThread、IDT、IRQL 表示。 x: kd> !prcb カーレントIRQL、IRQカウンタ x: kd> kb 現在のRUNNING thread のスタックを表示 x: kd> kb 900 現在のRUNNING thread のスタックを 900行 表示 x: kd> k スタックトレース(横縮小) x: kd> kf 「k」にスタックサイズ表示 x: kd> .kframes 900 「kb」でスタックトレース900行表示。デフォルトは20行。 x: kd> !apc Asynchronous Procedure Call (APC)待ち行列表示。(非同期) x: kd> !stacks 全体のアプリ、プロセス、スレッドを調査(Windows 2000以降) x: kd> !process 0 0 全プロセスのダンプ x: kd> !process 0 b7 シンボル解決で全スレッド ダンプ。 x: kd> !process 0 0 ??.exe x: kd> !process 実行中のプロセスのみ。 カーレントプロセス。 x: kd> .process /p /r xxxx 指定プロセスに移動しシンボルロード。 x: kd> !process xxxx 指定プロセスの待ち行列を調べる  (上p.350)インサイド書籍 x: kd> !process xxxx 4 指定プロセスのthreadリスト表示 x: kd> !peb xx プロセス環境ブロック(PEB) (!process xx でPEBのAdr確認)           ┌eprocess   ┌ethread           └┬kprocess  └┬kthread  カーネル空間:┌←[Process] →→→[Thread]→┐  ユーザ空間 :└→[PEB] ←←←←←←[TEB] ←┘ x: kd> !kdexts.locks カーネル空間のロック x: kd> !ntsdexts.locks 各ユーザ空間(各プロセス)のロック x: kd> !locks -v xxxx 各プロセスのロックのかかった起動側と実行側のスレッド x: kd> !thread 実行中のthreadのみ。 カーレントthread。 x: kd> .thread /p /r xxxx x: kd> !thread xxxx b7 指定のthread。(「.thread /p /r」 が不要) x: kd> !teb xx スレッド環境ブロック(TEB) (!thread xx でTEBのAdr確認) x: kd> dt _ethread xxxx Display ETHREAD structure x: kd> dt _kthread xxxx Display KTHREAD structure x: kd> !ipi 各CPUの interprocessor interrupt (各CPUの.trapなど) x: kd> ~0s CPU0に変更。 0: kd> !thread CPU0の実行threadを表示 0: kd> ~1s CPU1に変更。 「CPU 0/1/2/3 」も同様に可能。 1: kd> !thread CPU1の実行threadを表示             (シンボルが表示しない場合は .reload する) x: kd> !ready 1 レディ状態にあるスレッドを調べる(重要ではない) (上p.382) x: kd> !Object xxxx !handleの部分表示 (重要ではない) x: kd> !exqueue システム ワーカースレッド(重要ではない) x: kd> !handle ハンドル テーブル(重要ではない) 0:000> ~*kb ユーザダンプ「user.dmp」で全てのスレッドをダンプ          【図1】!stacksでの表示          [アプリケーション1.exe]          process x  thread  READY          process x  thread  Blocked           〜〜   〜〜   Blocked          [アプリケーション2.exe]          process b  thread  Blocked kbで表示するのは process b  thread  RUNNING 最後に実行した   〜〜   〜〜   READY threadのスタック  〜〜〜〜〜〜〜〜 です    [アプリケーションn.exe]多数あり          process z  thread  Blocked ■ドライバ関連 x: kd> lm ドライバ リスト x: kd> lmv ドライバ の版数一覧。★タイムスタンプ含む。 x: kd> lmvm ドライバ名 ドライバ の日付 x: kd> !irpfind IRP(I/O要求パケット)待ち行列 x: kd> !irpfind 0 0 thread xxxx 特定スレッドの隠れたIRPと「DevObj」 x: kd> !devstack [DevObj] !devstack [DevObj] x: kd> !DevNode [DevNode] DeviceNodeの遷移リスト x: kd> !irp xxxx f IRP(I/O要求パケット)の詳細 x: kd> !idt IRQ(割込要求)ベクタテーブル。IRQ処理プログラムを確認。 x: kd> !dpcs DPC(遅延フロシージャコール)待ち行列 x: kd> !timer DPC(遅延フロシージャコール)のタイマ待ち行列       ドライバ→(a)→IRP→IRQ→DPC→(a)  データ無しまで            └←←←←←←←←←┘   I/O処理を続ける。 x: kd> .load ndiskd ミニポートI/O動作状況(1) x: kd> !miniports ミニポートI/O動作状況(2) x: kd> !deadlock ドライバ(カーネル空間)のロック ■PCI関連 x: kd> !pci PCIリスト (Bus, Device, Function) (カーネルデバッガのみ?) x: kd> !pcitree PCI接続のデバイスをツリー表示 (2000以降) x: kd> !devnode 0 1 USBを含むデバイスをツリー表示 x: kd> !DevNode [DevNode] DeviceNodeの遷移リスト x: kd> !arbiter システムリソース( I/O, メモリ, IRQ, DMA, )表示 (2000以降) x: kd> !scsikd.classext Disk名称表示 x: kd> !driveinfo c: 「c:」ドライブ(Disk)の状態。「c:」は任意。 x: kd> !gle displays the last error (ユーザ空間) ■NMI と IRQ ベクタテーブル。 x: kd> .load kdex2x86 !idt などを有効にする (dllの関数を読込。下行の表記も有り) x: kd> !idt -a 割込テーブル(IDT)の一覧を表示。(Windows XP以降) ■メモリ管理 x: kd> !memusage memory usage 情報  「Invalid PTE エラー」の調査。 x: kd> !vm Virtual Memory Usage 情報 x: kd> !sysptes PTE調査 x: kd> !lookaside look-aside lists x: kd> !poolused 2 pool (2000以降) x: kd> !poolused pool (Windows XP 用) x: kd> !xpoolmap NP pool (XP) x: kd> !spoolused NP pool (XP) x: kd> !pte xxxx 指定アドレスのシステム ページテーブル エントリー(有効無効確認) ■CPU関連 x: kd> !cpuinfo CPUのマイクロコードを確認 x: kd> !cpuid コンピューターのCPUIDを表示 x: kd> !sysinfo cpuinfo CPU情報 x: kd> !sysinfo smbios BIOS情報 x: kd> !irql IRQLを出力。 (IRQL=00〜1F が正解。20以上は暴走。) x: kd> r cr2 ページフォルトの発生したアドレス。 cr2はCPUレジスタ。 ■カーネルデバッガ関連 x: kd> (Break) 「Break」ボタンでプログラムを止める。 x: kd> .crash クラッショダンプ取得:調査機をブルー画面でクラッショ。 (「.reload」の次に「.crash」を起動する) x: kd> .dump /m mini.dmp カーネルデバッガでミニダンプを取得。 x: kd> .reload /f シンボルを再ロード(カーネルデバッガの途中で立上で使用) x: kd> g プログラムを再実行。 x: kd> !thread デバッガで停止したスレッドを確認 x: kd> !process 0 0 xx.exe 指定アプリのプロセス、PID確認 x: kd> !bpid プロセスIDでデバッガをブレーク。(次に「.reload」する) x: kd> eb [a] xx xx xx メモリアドレス[a]からデータ「xx xx xx」を書き込む x: kd> bp xxxx アプリ空間でアプリのソフトブレーク。「ba e1 xxxx」は使用しない。 x: kd> ba e1 xxxx プログラムアドレスxxxxでハードブレーク。「e1」の1は固定値。 x: kd> ba e1 xxxx "r;dd esp |4;g" アドレスxxxxで「" "」の条件をトレース表示。 x: kd> ba r4 xxxx メモリアドレスxxxxの4バイトをR/Wでハードブレーク。r4 = r1/r2/r4 x: kd> ba w4 xxxx メモリアドレスxxxxの4バイトwriteでハードブレーク。w4 = w1/w2/w4 x: kd> ba i1 xxxx I/O 1バイトreadとwriteでハードブレーク。 x: kd> .echo 文字 文字をWinDbg画面に表示 x: kd> poi(ADR) ADR のデータをアドレスとする x: kd> dd poi(esp) espのアドレスのデータ内容をアドレスとし、その先のデータを表示。 x: kd> bp xx "bp yy \"zz"; " 二重条件文 x: kd> bl ブレークのリスト表示。 x: kd> bc x 指定番号のブレークを削除。(番号は bl で確認する) 注意:「bp」はソフトブレーク。「ba」はハードブレークでこちらを使用。 「ba」はDiskに退避しメモリに存在しない場合も使用可能。 x: kd> !handle 指定アプリの関連する操作中ファイル x: kd> !fileobj xxxxxxxx 操作中ファイルのデータ確認 0:001> sx アプリのイベントブレーク 0:001> !heap -l 「Memory Leaks」を自動判定する ■その他調査 x: kd> s -d 80000000 L4000000 xxxxxxxx アドレス80000000〜8fffffffでxxxxxxxx のデータ検索。 x: kd> !chkimg メモリ コラプション(陳腐化)(memory_corruption)の調査。 x: kd> !chkimg -lo 50 -d !nt OSのコラプション詳細 x: kd> !chkimg -lo 50 -d !win32k win32k.sysのコラプション詳細 x: kd> !for_each_module !chkimg @#ModuleName コラプション一括調査 x: kd> dd xxxx メモリの32Bit幅(ダブルワード)表示 (WinDbgでは専用ウィンドウ有り) x: kd> dds xxxx メモリの32Bit幅+シンボル表示(ポインタ形式) x: kd> dps xxxx メモリの64Bit幅+シンボル表示(ポインタ形式) x: kd> u [a] [b] アドレス[a]から[b]まで長い(大量)の逆アセンブルが可能。 x: kd> ub [a] アドレス[a]から後ろの方向に逆アセンブル。 x: kd> uf [a] アドレス[a]から正逆方向に逆アセンブル。 x: kd> x nt!Rlp* 指定ソフトのシンボルのリストの出力 (参考:「nt!」はOSを示す) x: kd> .exr -1 直近のトラップ(例外)を表示 x: kd> .trap xxxx xxxxはトラップのアドレス。 CPUレジスタとトラップのプログラムを表示。 (32Bit CPU):IRQ処理ではDS,ESは確認できない。NMIは表示可。 x: kd> !errlog エラーログ x: kd> !locks ロックのかかったリソースとスレッド x: kd> !locks -v ロックのかかったスレッド内容 x: kd> .logopen ファイル名 WinDbgコマンド出力をファイルに書込み。次、長いコマンド出力。 x: kd> .logclose 長いコマンド出力後に、ファイルに書込みを閉じる。 x: kd> !wmitrace.strdump ダンプよりイベントログの読取 x: kd> !wmitrace.logdump X :'EventLog-System'など X=7 x: kd> !gle displays the last error (ユーザ空間) x: kd> !reg openkeys 0 レジストリキー一覧表示 x: kd> !reg querykey 検索したいキー 指定指定レジストリの表示 x: kd> !!dflink xxxx リンク リスト ■コマンド一覧 (WinDbgコマンドは3種類あり) (印刷し手元に置く) x: kd> ? (1) 通常コマンド (一覧) x: kd> .help (2) メタコマンド   (一覧) x: kd> .chain (3) 拡張コマンド [path: C:\Program Files\Debugging Tools for Windows\winext\ext.dll] など。 x: kd> !ext.help (3) 拡張コマンド  (一覧) x: kd> .hh [command] コマンドの詳細説明 ・不明なコマンドは「WinDbg」→「help」→「Contents」で検索する。 ■ユーザダンプの自動解析コマンド群 !analyze -v ~*kb r lm ■カーネルダンプの自動解析コマンド群 「自動解析コマンド群」の資料による