カーネルデバッガーを利用する [WinVista]
Windowsの機能の一つであるカーネルデバッガー(KD)を遠隔利用(*1)してみようと思います。
ブルースクリーンのエラーを解析するのに役に立つかもしれません。(*2)
※1 : デバッグモードを有効にさえすればローカルでもカーネルデバッガーを利用することができますが、Windows起動処理中はデバッグできないことに加え、カーネルに対してBreakすることができないのは言うまでもなく、ローカルのカーネルに対するデバッグはあまり意味がありません。
※2 : Windows上で動作するアプリケーションが原因のエラーを解決することには役に立ちません。
○必要なもの
・リモート、ホストとなる2台のPC
・ホスト側PCにDebugging Tools for Windowsがインストールされていること
現在Debugging Tools for WindowsはWindows SDKに含まれています。
さらに以下のいずれかの方法でリモート-ホスト間を接続する必要があります。
・RS-232Cケーブル(リバース)
リモート・ホストOS : Windows NT 4.0以降
備考 : 最近のPCではシリアルポートを標準装備していないことが多い。
・IEEE 1394ケーブル
リモート・ホストOS : Windows XP以降
備考 : 低価格モデルを中心にIEEE 1394ポートを装備しない機種が存在する。
・USB2.0デバッグケーブル(http://www.intel.com/technology/usb/download/DebugDeviceSpec_R090.pdf)
リモートOS : Windows Vista以降
ホストOS:Windows 2000以降
備考 : 「USB2.0デバッグケーブル」はUSB規格外のケーブル。日本国内では販売されていないらしい。
ご覧の通りどの接続方法もひと癖あり、環境によってはリモートデバッグができないことがあるかもしれません。
ここではホスト側PC(Windows XP)とリモート側PC(Windows Vista)をIEEE 1394ケーブルで接続することにします。
以下さらっと解説。
○ホスト側PCの設定
Debugging tools for Windowsに含まれる WinDbg を起動して「File」→「Kernel Debug...」を開く。
接続方法に合わせて適当に設定を行う。
OKをクリックするとおそらくドライバーのインストールが行われ、無事にドライバーが組み込まれると接続待機状態に入る。
○リモート側PCの設定
・Windowsが起動可能な場合
「msconfig.exe」を開き、「ブート」タブ→「詳細オプション」を開く。
ホスト側PCの設定に合わせて設定を行う。
設定後に再起動する。
・Windowsが起動できない場合
電源投入後からWindowsの起動が始まるまで「F10」キーを押し続ける。
Windowsブートマネージャーが無事に動作すれば「ブートオプションの編集」(winload.exeのオプション指定)という画面が表示される。
ここで参考サイト(http://msdn.microsoft.com/en-us/library/ff556253.aspx)を参考にしながら [ ] にブートオプションを記述する。
今回の例では「/debug /debugport=1394 /channel=1」を加えることになる。
下の画面の例ではあらかじめ付けられていたオプション「/NOEXECUTE=OPTIN /PAE」(データ実行防止機能関連のオプション)に続いて入力している。
キーボードレイアウトがUS仕様になっているため日本語キーボードで"="を入力するときは"^"キーを押さなければならない。
ちなみに「F8」キーで表示される詳細ブートオプションの「デバッグモード」を選択すると、カーネルデバッガーはシリアルポートのCOMx (xは最も大きい数、COMポートを2つもつ機種ならCOM2) から19200bpsでの接続を試みる。
○デバッグを行う
カーネルデバッガーの起動・接続に成功するとホスト側PCのWinDbgコンソール画面に「Kernel Debugger connection established.」と出力される。
リモート側PCの画面表示は通常起動時と同じでバーのアニメーションの後にログオン画面に移るだけで、あんまり面白くない。
↓試しにホスト側からBreakを実行してコールスタックの一覧を表示したところ
カーネルに対するデバッグなので当然だが、Break中はリモート側PCが壊れたかのようにフリーズする。
ホスト側PCで「Debug」→「GO」(F5キー)を押すとリモート側PCが何事もなかったかのように処理を再開する。
ここから先は通常通りデバッグ作業を行うだけですので省略しておきます (というか浅学な私にデバッグ作業について語れることなんてありませんが。)
一つだけ留意点を挙げておくと、IEEE1394接続を使用してのカーネルデバッガー起動中はIEEE1394ホストコントローラーが使用できなくなるため、リモート側PCではIEEE1394で接続する機器を使用することができません。
旧ブログでのコメント
AUTHOR: のぶ
URL:
DATE: 2012/08/30 23:23:27
最近のノートPCは、COMも1394もないです
COMポートUSB変換機やEXカードを利用した1394でもデバック可能でしょうか?
AUTHOR: akm
URL:
DATE: 2012/08/31 18:26:45
Re: 最近のノートPCは、COMも1394もないです
USB/シリアル変換器はUSBデバイスドライバによってCOMポートとして使えるのであって、Windows起動前のカーネルデバッガー実行時はドライバが読み込まれる前なので使えません。拡張カードで増設するタイプのシリアルポートも使えません。BIOSレベルでサポートするシリアルポート、つまりオンボードのシリアルポートのみ使えます。
シリアルポートがない場合、デスクトップPCではPCIなどの増設カードで1394ポートを増設する方法が有効でしょう。ノートPCのPCカードやExpressCardも本質はPCIバスなのでいけると思うのですが、試したことがないので断言できません。
1394ポートの増設が無理であればUSBデバッグケーブルを入手するしかありません。
Windows 8ではLAN経由でのカーネルデバッグに対応しています。対応するホストOSはWindows 8のみで、Windows 7以前を対象とするカーネルデバッグではこの方法は使えません。
AUTHOR: のぶ
URL:
DATE: 2012/09/01 18:15:26
Re: 最近のノートPCは、COMも1394もないです
kariさん。有益な情報ありがとうございました。 感謝!
最近、データ流失防止のためHDD暗号ソフト導入が増えたため、ダンプを作成することが出来ないケースに良く出会います。
そこでこのブログにたどり着きましたが、最近のノートPCにはCOMも1394もなく、なんとかならないかとコメントしました。
もうすぐ発売のWindows8への乗り換えはまだ先になりますので、機会があればExpressCardで1394増設を試してみます。