Kernel Debug一覧

Windows10 (AU) で USB 3.0 経由でカーネルデバッグ

Windows10 アニバーサリーアップデート (1607) が一段落したので、この環境に対してカーネルデバッグができるかをテストしてみました。

以前にも USB 3.0 でカーネルデバッグのやり方についてはご紹介しました。
今回の内容その情報のアップデートとなります。以前には判明しなかった注意点を列挙したり使えるボードについて紹介を入れてあります。

環境について

今回は以下の環境で実験しています。

・デバッガが動くホスト側
Windows10 Pro(x64) 都合により 1511 を使用。
デバッガ(WinDBG)を導入済み

・デバッグ対象であるターゲット側
Windows10 Pro(x64) 1607 を使用。
古い機械のため USB 3.0 を持たない機器のため、PCI-Express で増設しました(大事)

続きを読む


RPI2 の Windows10 IoT Core のカーネルデバッグ

Windows10 IoT Core アニバーサリーアップデートを適用した RPI2 で、カーネルデバッグができるように環境を構築してみました。

必要なもの

必要なものは以下の通りです

  • Win10 IoT Core 導入済み RaspberryPI2
  • LANケーブル
  • USB-シリアル変換ケーブル

自分が使用している USB シリアル変換ケーブルは以下のものです。
ちょっとドライバ導入に手間があったりしますが、使えています。


準備(WinDBG)

WinDBG を使う必要があるのでこれを入手します.
これは Windows SDK か Windows Driver Kit に含まれています。
Windows SDK のほうは WinDBG だけインストールも行うことができます。これは インストーラーでどの機能をインストール選択するかの際に、 “Debugging Tools for Windows” のみ選択で、 WinDBG のみをインストールできました。

ドライバの開発という点では Windows Driver Kit を使用しますが、デバッグ目的であれば Windows SDK を選択するのでよいのかなと思います。なお今回使用した Windows Software Development Kit は,Windows 10.0.14393.33 というバージョンのものとなっていました。
続きを読む


USB 3.0 Kernel Debugging のための準備

Windows8 で カーネルデバッグを行うのに USB 3.0 が使えます。
ただしこのUSB 3.0で接続をするには、PCとPCを USBケーブルで接続しないといけません。
そして、PCは基本的にホスト側であることを想定されているため、タイプA形状のコネクタを持っています。
つまり、A-Aのケーブルが必要になります。

今までの USB 2.0 の場合は、特殊な機器を購入してそこに2台からのUSBケーブルを差し込む形になっていたようです。

さて、この接続するためのケーブルについてが特殊なので今回のネタとなっています。
WinDbgのヘルプには、こうあります。
「A USB 3.0 debug cable. This is an A-A crossover cable that has only the USB 3.0 lines and no Vbus」

これを読み解くと、USB3のラインだけ接続されたクロスオーバーのデバッグケーブルで、接続するとなります。
また、色々と調べてみてわかったのですが Universal Serial Bus Specification を紐解くとターゲットOSのデバッグ用の接続についても考慮された仕様が決められていました。
これらの情報から、デバッグケーブルを自作してみました。

デバッグケーブルを自作する

ケーブルの一部を切り開いて加工し、最後に一応シールド用としてアルミを当ててそっとケーブルを閉じてみました。

こうやって作成したケーブルで試したところ、先日のWindows8をターゲットとしてWindows Kernel Debugができた、というわけです。

簡単にケーブルを作成していますが、この状況にもっていくまでに何本かは失敗しています。
シールドの問題や、加工のしやすさ(&慣れ)、といった部分から失敗前提でチャレンジが必要かもしれません。
自作にチャレンジされる方は、パーツ数に余裕を持っておいたほうがよいとおもいます。

使用したもの

加工に向いたケーブルがなかなか見つかりませんでした。上記のものは amazon で購入した以下のケーブルを使っています



Windows8時代のKernel Debugging USB 3.0編

前回はネットワーク経由によるWindows Kernel Debugの接続方法を説明しました。今回は USB 3.0によるカーネルデバッグの設定方法となります。

環境

ホスト
Windows7 もしくは Windows8 がインストールされており、WinDbgが起動可能なように準備されていること。
VisualStudio 2012 + WDK の環境もOK

※ 後述しますが、Windows8のほうが問題がないので、望ましいです。Win7でも概ね問題なく使えるのですが。

ターゲット
Windows8がインストールされたPC。

共通
試す内容から当然ですが、両者 USB 3.0のポートを備えており、ドライバのインストールが完了していること。
自分の実験環境では、ターゲットにはそもそも USB 3.0 をマザーボードに持っていなかったため、玄人志向の USB 3.0 拡張ボードをさして本実験を行っております。

USB 3.0経由のカーネルデバッグの設定

USB 3.0でのカーネルデバッグ設定方法を説明していきます。
ターゲットの(管理者の)コマンドラインでbcdeditを起動して、設定するだけで終了です。簡単です。

c:\>bcdedit /dbgsettings usb targetName:usb3
c:\>bcdedit /debug on

targetName:以降の名前については、任意の物が使用可能です。設定したら再起動を行います。
このときに ホストとターゲットをUSB 3.0のケーブルで接続しておきます。

続いてホスト側の設定です。
WinDbgなら起動して、メニューから、 File / Kernel Debug を選択し、USBタブを開いて、TargetNameの部分に、先ほど指定した usb3 を入力して待ち受けるだけです。

接続されると以下のようにログが出てきます。(ここからスクリーンショットはWindows8のホストに切り替えてます。ターゲットのWin8ではない点に注意)

ターゲットを再起動してもこの通り(注意点参照)。

うまく動いているようです。

気になる点は、このようにうまく動いているのにもかかわらず、Debuggee not connected と出ているタイミングがあることや、
デバイスマネージャー上で USB 2.0 のデバッグデバイスだ と主張している点です。そう見えているのだろうか…。

注意点

たまにUSB3.0のチップが複数搭載されているケースがあります。この場合、自分が試した範囲では Intelチップ側のほうが正常に動くようです。また拡張ボードで使用しているチップは、Renesas の μPD720202 チップでした。

また、Windows7をホストとして使用している場合、現時点までにわかっている妙な不具合として、以下の点があります。

  • ホストでデバッグ接続したまま、ターゲットを再起動すると次回起動時にパケット送受信エラーのようになる
  • この場合、ホストの方も再起動するまで使用不可能になる
  • ターゲットを再起動する際には、ホストのほうのデバッグ接続を一度切っておけば、問題はなさそうに見える

Windows8だとターゲットを再起動しても問題なく再コネクション行って以下のようにログが出てきます。

まとめ

Windows8ではUSB 3.0によるカーネルデバッグ接続も受け入れてくれるので、選択肢が広がりました。
今のところ Networkと並んで有力候補となるのではないかと考えています。
上記で何気なく説明しているケーブルが実はくせ者だったりするので、これについて次回以降ちょっと記事にしたいと思います。

設定の情報元
マイクロソフトのSetting Up Kernel-Mode Debugging over a USB 3.0 Cable Manually


Windows8時代のKernel Debugging

最近、WindowsのKernel Debugが出来るように準備を進めていました。古い人の話だと、カーネルデバッグはシリアル接続で!という話みたいですが、今やその接続方法も色々と選べるようで、しばらくこの接続方法について記事を書いておきたいと思います。

なお、自分は最近始めたばかりのにわかです。Kernel Debugging で出来ることはこれから学んでいこうと思っています。

さて、Windows8 になってさらにカーネルデバッグの接続方法は増えました。
特に、ネットワーク経由によるもの、USB 3.0 経由によるものの2つが増えました。
USBは 2.0 なら従来からサポートされていたようですが、特殊な機器が必要となっていたようです。
またこれが日本では販売しておらず、輸入の形で入手するしかなかったそうです。

他の方法では、COMによるシリアル接続、IEEE1394による接続、とあるようです。
ただ最近は両者のインターフェースを備えるマザーボードも減ってきているし、将来を考えるとこの方法は未来が無いなと思います。
Microsoftが Windows8 で出来るようにしてきた2つの方法はしばらくはメインの方法として生き残っていくのではと期待しています。

Windows8 をインストールして、デバイスマネージャーを見てみると実は、Microsoft Kernel Debug Network Adapter というものが存在しています。
これがまさにカーネルデバッグ時に使えるアダプタとなります。

環境

ホスト
開発者が操作するPC側をホストと呼びます。こちらは Windows7 を想定して、VisualStudio 2012 がインストールされているとします。
WDKがインストールされているか、WinDbgが使用可能状態になっていることも条件です。
ターゲット
デバッグされる側のPCのことをここではターゲットと呼びます。Windows8 がインストールされているものとします。

ネットワーク経由のカーネルデバッグの設定

LANでのカーネルデバッグを説明します。
ターゲットの(管理者の)コマンドラインでbcdeditを起動して、設定するだけで終了です。簡単です。

c:\>bcdedit /dbgsettings net hostip:ww.xx.yy.zz port:PortNo
Key=**********************************
c:\>bcdedit /debug on

上記のコマンドを実行の際に、ネットワークのキー情報が出力されます。これをメモしておく必要があります。
hostipにはホストPCのIPアドレスを記入し、PortNo の部分にはポート番号(50000以降の値にしておく)を指定しておきます。
この設定は次回の起動から有効になります。

ただこの設定が有効化されると対象となる物理的なネットワークアダプタは見えなくなる点に注意が必要です。
普段の通信には、Microsoft Kernel Debug Network Adapter が有効化された別アダプタが見えてくることになります。
こちらにIPをきちんと割り当てておけば、Windowsのファイル共有も使えますし、問題にはならないでしょう。
問題になるとすれば、実は対応するネットワークアダプタには制限がある、ということです。
こちらのほう(対応リスト)に対応しているチップセットが書いてあります。

とりあえず最近のマザーボードにのっていることの多い Realtek製が含まれている点で問題にはなりにくそうです。またIntelの入手しやすいチップも対応しているようなのでこれも問題ないでしょう。
RTL8168, RTL8169, RTL8136, ICH8からICH10とか、Intel Gigabit CT desktop adapterとか使える点がいいですね。

ホスト側では WinDbg を起動して、ターゲットの接続待ち状態にしておきます。
NETタブを開いて、先ほどメモしたKeyを入力し、ポート番号をあわせておきます。

問題なければ、接続が確立されWindowsの起動とともに情報が出てくると思います。
VisualStudio2012と現在のWDKは統合されて便利になったようで、わざわざWinDbgを起動しなくても Visual Studio からカーネルデバッグもできるようになっているようです。

この場合には、”プロセスにアタッチ” を選び、トランスポートに Windows Kernel Mode Debuggerを選びます。
そして、検索ボタンを押して出てくるダイアログで、Add New Computer を選択します。
ターゲットの設定は既に終わっているので、その後の画面ではManually Configure … を選んでおきます。

その後の設定画面では、下記の画面のようになるので、キー&ポート情報を入力します。
ここでのHost IPはこのVisual Studioを起動しているPCのアドレスとなるため間違えないようにします。

まとめ

特殊な機器を不要としてのカーネルデバッグが出来るようになってきたのは、これから始める自分みたいな人にとっていいことだと思います。
さらにはネットワーク経由なので、ちょっと物理的に機器同士が離れていても問題なくなったのがすばらしい。
ちょっと手元の機器で試してみて、今のところどれでも動いているようなので相性とか問題はないのかもと思います。

今回説明しなかった USB 3.0 についても近いうちに記事にしたいと思います。
日本語ではなかなか記事がないため苦労しましたが、ネタとしてはなかなかおもしろいためご期待下さい。

今回の設定方法元
Microsoftのページ: Setting Up Kernel-Mode Debugging over Network Cable Manually