Hyper-V 仮想マシンへのネットワーク経由のカーネルデバッガ接続方法

Hyper-V 仮想マシンに仮想 COM ポート経由のカーネルデバッガ接続方法では、レスポンスが遅く感じられたことはありませんか?今回は、Hyper-V 仮想マシンへのネットワーク経由のカーネルデバッガ接続方法をご案内します。これにより、読者の方のデバッグの作業効率が上がれば幸いです。   今回は、例として、WinDbg を動作させるホストPC では Windows 10 1803 x64、カーネルデバッガを接続される仮想マシンではWindows 10 1803 x86 が動作しています。ホストPC 側には、WDK 10 1803 がインストールされているものとします。仮想マシンは、第一世代のものを使用しています。   ホストPC と仮想マシンをネットワーク接続します。   仮想スイッチは、以下の図のように、以下の3点を満たす必要があります。 ・外部ネットワーク ・「管理オペレーティングシステムにこのネットワークアダプターの共有を許可する」にチェック ・VLAN ID を無効     この仮想スイッチ(図の例では、External という名前にしています) を、仮想マシンのネットワークアダプタ―に設定しています。     ホストPC のIP アドレスを確認します。   ホストPC 側でコマンドプロンプトを起動し、ipconfig を実行してIP アドレスを確認します。   >ipconfig   Windows IP 構成     イーサネット アダプター vEthernet (External):…


カーネルモード デバッガで UMDF ドライバをライブデバッグする

UMDF ドライバをデバッグする際に、ユーザーモード デバッガでWUDFHost.exe にアタッチしてライブデバッグするだけではデバッグしきれなくて困ったことはありませんか?   例えば、OS のシャットダウン中の処理をデバッグしたい場合、ユーザーモード デバッガを操作している画面がシャットダウン中になるため、デバッガをその画面から操作できなくなります。   そこで、今回は、カーネルモード デバッガ(windbg.exe) でUMDF ドライバをデバッグする方法をご紹介します。カーネルモード デバッガからであれば、画面がシャットダウン中であっても、UMDF ドライバのブレークポイントで止めて、ライブデバッグすることができます。   具体的には、以下の手順で進めます。   ターゲットPC へのUMDF2 ドライバのインストール ターゲットPC へのWDFVerifier.exe のコピー カーネルモードデバッガをターゲットPC にアタッチ WDFVerifier.exe によるターゲット PC の設定 動作確認   今回は、例として、デバッガのホストPC、ターゲットPC ともにWindows 10 (1703) x86 で行います。また、サンプルドライバをビルドする開発用PC はデバッガのホストPC と同一とします。   1.ターゲットPCへのUMDF2 ドライバのインストール   ターゲットPC にUMDF2 ドライバをインストールします。今回は、例として、UMDF2 のToaster Sample のwdffeaturedum.dll を使用します。   サンプルの入手とビルド方法は、以下のエントリの「1. サンプルの入手」と「2. サンプルのビルド」をご参照ください。…


ダンプファイルに保存されたイベントログを取り出す

エンドユーザー様環境で BSOD が発生したため、取り急ぎ ダンプファイルはいただいたものの、その後の調査でイベントログを確認したくなったことはありますか?   皆さん、こんにちは。Windows Driver Kit サポートチームの津田です。今回は、そんな皆様に、ダンプファイルからイベントログを取り出す方法をご案内します。   ただし、あくまでもダンプファイルに残っている範囲の情報になります。そのため、ダンプファイルから得られたイベントログからは有用なログは得られないけれども、実際のイベントログには有用な情報が得られるかもしれないという場合には、改めてエンドユーザー様に事情を説明して、イベントログの採取をお願いすることになります。(もしくは、このようなことにならないよう、ダンプファイルだけでなく予めイベントログのご採取もお願いしておくことも考えられます。)逆に、今回ご案内する方法によって、ダンプファイルから有用なイベントログが得られれば、ご自身やエンドユーザー様等実際の情報採取に関わる方々に、追加のご負担をお願いせずに済む、また、追加の情報採取をお願いする側も待たずに済む、というメリットがあります。   具体的な手順は以下です。   1.ダンプファイルを WinDbg でオープン 2. !wmitrace.strdump で確認したいログの Logger Id を確認 3. !wmitrace.logsave <Logger Id> <ファイル名>.evtx でイベントログを保存 4. イベントビューアーで .evtx ファイルを開いてログを確認   1.ダンプファイルを WinDbg でオープン   今回は例として、前回の記事「ダンプファイルに保存された ETW トレースログを表示する」<https://blogs.msdn.microsoft.com/jpwdkblog/2016/08/29/%e3%83%80%e3%83%b3%e3%83%97%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ab%e4%bf%9d%e5%ad%98%e3%81%95%e3%82%8c%e3%81%9f-etw-%e3%83%88%e3%83%ac%e3%83%bc%e3%82%b9%e3%83%ad%e3%82%b0%e3%82%92%e8%a1%a8/> で使用したダンプファイルをそのまま使います。ダンプファイルの開き方についても、この記事の「8. ダンプファイルを WinDbg でオープン」をご参照ください。   2. !wmitrace.strdump で確認したいログの Logger Id を確認   WinDbg 上の…


ダンプファイルに保存された ETW トレースログを表示する

ご自身が開発されているドライバについて、BSOD 発生時点のダンプファイルの情報からでは根本原因がわからず、BSOD 直前から発生までのドライバ内部の状態を知りたいと思ったことはありますか?   皆さん、こんにちは。Windows Driver Kit サポートチームの津田です。今回は、そんな皆様に、ETW トレースログを BSOD 発生時点のダンプファイルから参照する方法をご案内します。ETW についてご存じない方は、まずは、以前の「Event Tracing for Windows (ETW)」<https://blogs.msdn.microsoft.com/jpwdkblog/2011/12/27/event-tracing-for-windows-etw/> のエントリをご参照ください。   BSOD が発生するまでのトレースログがダンプファイルで参照できますと、以下の 4 点の事前準備は必要ですが、BSOD 発生時のメモリやレジスタの情報から逆アセンブリを追いかけるだけでは遡れなかった情報が取得できます。     (a) BSOD 発生時のダンプファイルで、根本原因特定のために知りたい変数や構造体を特定する。   (b) それがわかるよう、ETW トレースログをご自身のドライバのソースコードに埋め込む。   (c) そのドライバを、現象が再現する環境にインストールする。   (d) logman.exe でトレースログ採取を開始した後、現象を再現する。   これにより、根本原因が判明する可能性が高まります。しかも、ライブデバッグのように WinDbg をカーネルデバッグ接続してタイミングが変わったり、ソースコードのどこが原因なのか必ずしも特定できていない状況でステップ実行をするというような時間がかかったりするというデメリットを回避できます。   本ブログ エントリでは、以下の前提で進めます。     – (a),(b) は省略します。   – (c) として上述のブログ…


シリアルケーブルでのカーネルモードデバッグ設定手順

ユーザーモードのアプリケーションやドライバを開発しているからと言って、カーネルモードのデバッグをする必要がないと思っていませんか?   皆さん、こんにちは。WDK サポートチームの津田です。ユーザーモードのアプリケーションやドライバを開発していても、例えば、以下のようなトラブルシューティングのシナリオに遭遇することがございます。これらのシナリオのように一見カーネルモードのデバッグが必要ないように思われる件でも、必要に応じてカーネルモードのデバッグの設定をお願いすることがございます。   ・   一般的な CreateFile/ReadFile/WriteFile/DeviceIoControl 等の Win32 API が期待通りの動作をせず、エラーを返す場合 → カーネルモードで I/O マネージャが I/O リクエストパケット (IRP) に変換し、カーネルモードドライバーのスタックに送るので、その処理過程をライブデバッグする必要がある場合があります。   ・   スプーラサービスのように、Remote Procedure Call (RPC) で他のプロセス B からプロセス Aの関数が呼ばれた結果、ご自身のアプリケーションがプロセス A から API で取得する値が期待通りにならない。RPC の呼び出し元のプロセス B が何かを特定したい場合 → ユーザーモードデバッガで、プロセス A においてRPC の呼び出しが行われた呼び出し先の関数にブレークポイントを貼ります。現象再現時、ここにブレークします。その状態で、カーネルデバッガからブレークインすることで、他の全てのプロセスの各スレッドのコールスタックから、該当関数を呼び出しているものを確認します。これにより呼び出し元のプロセス B を確認できます。   ・   何らかのプロセスが、COM ポートなど特定のデバイスをオープンしているために、ご自身のアプリケーションはオープンできない。そのプロセスを特定したい場合 → 当該デバイスのドライバの IRP_MJ_CREATE コールバック関数でブレークポイントを貼り、再現させてブレークインすれば、どのプロセスでそのオープンが行われているか確認できる可能性があります。(システムスレッド経由など、複数のプロセスをまたがっていたりすると、もう少し調査が必要です。)   そこで、今回は、これまでカーネルモードのデバッグをする機会がなかった皆様のために、シリアルケーブルでのカーネルモードデバッグ設定手順をご案内いたします。大まかな流れは以下のようになりますが、それぞれのステップを図入りで解説します。   1.     ホスト PC…


デバッガ (WinDbg) をインストールする

(更新2018/05/09) – Windows SDK 1803 及び Windows 10 Version 1803 x64 環境を前提に更新しました。 カーネルモードもユーザーモードも、ライブデバッグもダンプ解析もできるのに、無償のデバッガ WinDbg をインストールしたことがありますか?   皆さん、こんにちは。WDK サポートチームの津田です。今回は、WinDbg をインストールしたことがない皆様のために、WinDbg をインストールする手順をご案内いたします。   今回は、インターネット接続された、Windows 10 Version 1803 x64 環境で、管理者権限を持つユーザーを前提に進めます。また、WDK 10 を既にインストールされている方は、Visual Studio 2017 と一緒にSDK 10 をインストールした際にすでに含まれていますが、今回はWinDbg 単体(スタンドアロンバージョン) でインストールしたいと思います。   以下のページから、「インストーラーをダウンロードする」のリンクをクリックしてください。   Windows 10 SDK < https://developer.microsoft.com/ja-jp/windows/downloads/windows-10-sdk >   インストーラーをダウンロードする < https://go.microsoft.com/fwlink/p/?linkid=870807 >   <補足> 上記を直接ご案内するのは、以下のサイトから WinDbg 単体(スタンドアロンバージョン)…


Kernel Debugger 接続インターフェース

カーネルデバッガを接続するときに、どんな接続インターフェースを利用できるのか気になったことはありませんか? 皆様、いかがお過ごしでしょうか。WDK サポートチームの石沢です。今回は Windows OS バージョンとカーネルデバッガの接続インターフェースの関係についてまとめてみました。ホスト及びターゲットに実装されているインターフェースおよび OS バージョンから使用可能な接続形式を選択ください。 接続インターフェース ホスト OS バージョン ターゲット OS バージョン RS-232C 任意のバージョン 任意のバージョン IEEE1394 任意のバージョン 任意のバージョン USB 2.0 任意のバージョン 任意のバージョン USB 3.0 Windows 8 以降 Windows 8 以降 Ethernet 任意のバージョン Windows 8 以降 ちなみに本ブログでは、USB 2.0、USB 3.0、Ethernet での具体的な接続方法をご案内差し上げておりますので、上記表にて接続インターフェースを選択いただき、以下の記事にて具体的な接続方法をご確認いただければ幸いです。 USB 2.0: USB 2.0 カーネル デバッグ 前編 USB 2.0 カーネル デバッグ 後編 USB…


WDF ソースコード公開

皆様、いかがお過ごしでしょうか。WDK サポートチームの石沢です。 今回の記事より Twitter アカウント MSDEVJP より更新をお知らせいただけることになりました!是非ご活用ください。また Twitter よりお越しの皆様、初めまして!本ブログではドライバ開発に関する記事を公開しております。今後とも何卒よろしくお願いいたします。 今回は Windows Driver Frameworks (WDF) に関するお話しです。 去年の 3 月に WDF のソースコードが GitHub 上に公開されました。  Windows Driver Frameworks これにより Windows 10 では WDF を含めたデバッグをできるようになったわけなのですが、今回はどのように設定すればソースコードデバッグできるのか具体的な手順を詳しく解説いたします。   <今回のメニュー> カーネルデバッグ開始 シンボルパスとソースパスの設定 ブレイクポイントを設定しよう Go! 上手くいかないときは   ■ 1.カーネルデバッグ開始 まずはカーネルデバッガ (Windbg) を接続しましょう。今回は Windows 10 バージョン 10586に接続しています。 バージョンは Windbg 接続時に以下のように表示されますので、把握しておくとよいでしょう。   Connected to Windows 10…


Hyper-V 第二世代仮想マシンの Guest OS への windbg 接続方法

久方ぶりです。まさかたです。   さて、以前、「Hyper-Vなどの仮想OSにwindbgをアタッチする方法」で、仮想 OS 上の COM ポートに名前付きパイプを割り当てる方法をご案内いたしました。この方法は、現在もご利用いただけますが、Windows 8.1/Windows Server 2012 R2 より導入された Hyper-V 第二世代仮想マシンの Guest OS には、デフォルトでは以下のように COM ポートが見えない状態になっているため、戸惑われる方がいらっしゃるかと思います。     そこで、今回は、第二世代仮想マシンの Guest OS でも従来通り名前付きパイプを COM ポートに設定して、windbg でカーネルデバッグを行っていただくための方法をご紹介いたします。   その前に前提として、そもそも Hyper-V 第二世代仮想マシンとは、Hyper-V マネージャーで仮想マシンを新規作成する際に、以下のように選択した仮想マシンのことです。     以前の第一世代と比べて、エミュレーションするハードウェアを新しくしたからこそできるいくつかの特徴がありますが、詳細は、下記ドキュメントに譲ります。     Generation 2 Virtual Machine Overview   http://technet.microsoft.com/en-us/library/dn282285.aspx   ここでは、あくまでもカーネルデバッグの設定をする上で必要な話として、BIOS ベースのファームウェアではなく UEFI ベースとなってセキュアブートがデフォルトとなっていることや、サポートするゲスト OS が現時点では以下の 4 種類であることを記載しておきたいと思います。  …


ネットワークケーブルを用いたカーネルデバッグ接続の設定手順

こんにちは、K里です。   今回はネットワークケーブルを用いたカーネルデバッグ接続の設定手順についてお話したいと思います。   これまでのカーネルデバッグ接続におけるインターフェースは RS-232C、IEEE1394、USB が使用されてきましたが、Windows 8 から新たにネットワークケーブルを使用したカーネルデバッグ接続が可能となりました。他のインターフェースを使用した接続状態と比較すると、ネットワークケーブルを使用した場合、ホストPC とターゲットPC がローカルネットワーク上に存在すればよいため、設置場所が制限されない(ホスト PC とターゲット PC を隣同士で並べる必要がなくなる) ことや、ホスト PC のデバッグポート数に依存することなく多くのターゲット PC を接続状態にできることが主なメリットになると思われます。   ネットワークデバッグ接続を行うための要件として、Windbg 等のデバッガを起動しデバッグを行うホスト PC は、Windows XP 以降の OS が対象となり、デバッグポートとするネットワークアダプターについては特に制限はありません。対してデバッグ対象となるターゲットPC は、Windows 8 と Windows Server 2012 のみが対象となり、また以下のネットワークアダプターについてデバッグ接続をサポートしています。   Title: Supported Ethernet NICs for Network Kernel Debugging in Windows 8 URL: http://msdn.microsoft.com/ja-JP/library/windows/hardware/hh830880   上記要件を満たすホスト PC とターゲット PC…