ネットワーク経由でのリモート ユーザーモード デバッグ

久方ぶりです。まさかたです。

ドライバー開発にデバッグはつきものだと思いますが、Windows 8 からは、デバイス アプリというドライバーに密接に関連したストア アプリも登場し、またプリンタードライバーや UMDF ドライバーのようにユーザーモードで動作するドライバーもありますので、ドライバーのデバッグを行う場合、必ずしもカーネルデバッグだけではなく、ユーザーモードデバッグも必要となる場面もあるかと思います。

また、実際にデバッグを行う場合、開発環境と同じ環境上でテストしてデバッグも可能な場合もあるかもしれませんが、開発環境とテスト環境が分かれる場合も多くあると思います。そんなリモートにあるターゲット環境に対してカーネルデバッグを行う方法については、以前 K里さんから「ネットワークケーブルを用いたカーネルデバッグ接続の設定手順」という記事で紹介されておりました。

そこで今回は、ユーザーモードのデバッグを、リモートからネットワーク経由で行う方法として、Visual Studio 2013 と windbg を使った例をご紹介したいと思います。

(1) Visual Studio Remote Debugging Monitor を使ったデバッグ

(2) Windbg.exe と Dbgsrv.exe を使ったデバッグ

なお、これらの方法は、ターゲットPC上にデバッグのための小規模なモジュールのインストールが必要になりますが、Visual Studio そのものや Debugging Tools for Windows 一式をターゲットPC上にインストールする必要がなく、また、シンボルやソースコードは、ホストPC側にだけ置いておけばいいので、ターゲットPC側の準備が比較的 楽というのもメリットだと思います。そういう点でもご活用いただけたら幸いです。

(1) Visual Studio Remote Debugging Monitor を使ったデバッグ

(1-1) ターゲット PC 側の準備

Visual Studio を使ったリモートデバッグには、ターゲットPC上に Visual Studio の Remote Tools がインストールされている必要があります。以下のドキュメントに書かれているように、Visual Studio 2013 の Update のバージョンと CPU アーキテクチャに応じた、Remote Tools をインストールしておきます。

Set Up Remote Debugging on the Device

<https://msdn.microsoft.com/ja-jp/library/bt727f1t.aspx>

VS 2013

Update version

X86

X64

ARM

RTM

Download

Download

Download

Update1

Download

Download

Download

clip_image002

そして、ターゲットPC上で、Remote Debugger を起動しておきます。Windows 8.1 をターゲットPCとした場合、スタート画面から検索して起動します。

clip_image003

起動すると、以下のような Remote Debugging Configuration のダイアログが出ますので、使用するネットワーク環境に応じて、Firewall の設定を行います。

clip_image005

起動すると、デスクトップ画面上に以下のようなウィンドウが表示され、ホストPCからの接続を待機する状態となります。

clip_image007

ちなみにこの画面から、[Tools] – [Options] と選べば、接続にする TCP/IP ポートの番号の変更や、接続の認証方法、接続をどのユーザーに許可するかなどを変更することができます。

clip_image008

clip_image010

(1-2) ホストPC側の準備

ホストPC側では、デバッグを行いたいアプリケーションのプロジェクトの設定を、リモートデバッグ用に変更する必要があります。

まず、リモートデバッグを行うため、VSのツールバー上で、デバッガの種類を、下記のように [リモート Windows デバッガー] にしておきます。

clip_image011

次に、[プロジェクト] メニューの [プロパティ] をクリックします。

clip_image012

プロジェクトのプロパティページで、[構成プロパティ] - [デバッグ] から、[リモート Windows デバッガー] の設定を以下のように変更した上で、OKボタンを押して、ページを閉じます。

① [リモートコマンド] に、ターゲットPC上で、アプリケーションを起動させるためのフルパスを指定します。

② [作業ディレクトリ] に、ターゲットPC上で、アプリケーションを動作させるフォルダのパスを指定します。

③ [リモートサーバー名] に、ターゲットPC名、もしくは、IPアドレスを指定します。

④ [デバッガーの種類] を、適宜変更します。

⑤ [配置ディレクトリ] に、ターゲットPC上で、アプリケーションを配置するフォルダを指定します。

⑥ [配置する追加ファイル] に、追加でターゲットPC上に配置したいファイルがあれば、ホストPC上のファイルパスを指定します。

以下の画面の例では、IP アドレス 192.168.1.23 のターゲットPC上の、”C:\RemoteTemp” フォルダの中に、デバッグ対象のアプリケーションとして、MyTestApp.exe を配置して、実行し、デバッグを行う想定をしています。

また、[デバッガーの種類] については、今回の場合は、VC++ のアプリケーションですので、”ネイティブ” のみとしました。ストアアプリのリモートデバッグについてはこちらを参照ください。

さらに追加のファイルとして、ホストPC上の “D:\Temporary\test.txt” も、ターゲットPC上の “C:\RemoteTemp” にコピーするようにしています。

なお、ターゲットPC上の “C:\RemoteTemp” フォルダは、事前に作成しておかなくても、ツールにより自動的に作成されます。

clip_image014

次に、Visual Studio の [ビルド] メニューから、[構成マネージャー] を選択し、デバッグを行う構成の [配置] チェックボックスにチェックを入れます。これで、アプリケーションがターゲットPC上の指定されたフォルダ(上記の例の場合は C:\RemoteTemp)に配置されるようになります。

clip_image016

それでは、実際に [F5] キーを押して、デバッグを開始してみると、ターゲットPC上でアプリケーションが起動して、”Remote Debugging Monitor” 上でも、ホストPCからの接続が行われたことが確認できます。

clip_image018

また、ホストPC上の Visual Studio からも、以下のようにローカルで実行している時のように、デバッグができるようになります。

clip_image019

ちなみに、[デバッグ] メニューの [プロセスにアタッチ] から、ターゲットPC上で既に起動済みのプロセスにアタッチすることもできます。

clip_image020

[プロセスにアタッチ] 画面の、[検索] ボタンから、”Remote Debugger Monitor” が起動済みのターゲットPCを検索することができます。

clip_image022

clip_image024

ターゲットPC上で動作しているプロセスの一覧から、目的のプロセスを選択して、[アタッチ] ボタンを押せば、先ほどと同様にホストPC上の Visual Studio からデバッグが可能となります。

clip_image026

[参考]

Remote Debugging in Visual Studio

<https://msdn.microsoft.com/en-us/library/y7f5zaaa.aspx>

Set Up Remote Debugging on the Device

<https://msdn.microsoft.com/ja-jp/library/bt727f1t.aspx>

Set Up Remote Debugging for a Visual Studio Project

<https://msdn.microsoft.com/ja-jp/library/8x6by8d2.aspx>

(2) Windbg.exe と Dbgsrv.exe を使ったデバッグ

こちらの方法では、(1) のように、アプリケーションの起動からアタッチさせることはできませんが、起動済みのプロセスへのアタッチが可能です。

(2-1) ターゲットPC側の準備

“Debugging Tools for Windows” に含まれている、”DbgSrv.exe” をターゲットPC上の任意の場所にコピーしておきます。

clip_image027

> DbgSrv.exe –t tcp:port= < ポート番号>

< ポート番号> には、デバッグの通信に使用する、TCP/IP のポート番号を指定します。すると、以下のように通信の許可をするかどうか、Firewall の設定を確認する画面が出ますので、許可します。

clip_image029

そして、ターゲットPC上で、デバッグ対象としたいアプリケーションを予め起動しておきます。

(2-1) ホストPC側の準備

ホストPC側では、windbg.exe を以下のようなコマンドで起動します。

> windbg.exe –premote tcp:server= < ターゲットPCの IP アドレス> ,port= < ポート番号>

< ターゲットPCの IP アドレス> には、ターゲットPCのIPアドレス、port= < ポート番号> には、先ほどターゲットPC上の dbgsrv.exe 起動時に指定したのと同じポート番号を指定します。

その後起動する windbg にて、[File] – [Attach to a Process…] を選択すると、以下のようにターゲットPC上のプロセスのリストが表示されますので、そこから目的のアプリケーションプロセスを選択すれば、あたかもターゲットPC上でユーザーモードデバッグを行っているかのように、デバッグを行うことが可能です。もちろん、シンボルやソースコードは、ホストPC側からアクセスできれば問題ありません。

clip_image031

clip_image033

[参考]

Process Servers (User Mode)

<https://msdn.microsoft.com/en-us/library/windows/hardware/ff553469(v=vs.85).aspx>

Choosing the Best Remote Debugging Method

<https://msdn.microsoft.com/en-us/library/windows/hardware/ff539110(v=vs.85).aspx>

以上、少しでも皆様のお役に立てましたら、幸いです。