チュートリアル : マネージ コードとネイティブ コードの両方を含むソリューションのデバッグ
更新 : 2007 年 11 月
このチュートリアルでは、マネージ .NET Compact Framework コンポーネントとネイティブ コンポーネントの両方を含むソリューションをデバッグする手順を説明します。Visual Studio では、このようなデバイス アプリケーションの相互運用デバッグがサポートされていません。つまり、ネイティブ デバッガとマネージ デバッガを同時にアタッチしておくことはできません。
ネイティブ要素とマネージ要素の両方を組み込んだソリューションをデバッグする場合は、特定のセクション (たとえば、マネージ セクション) に必要なデバッガをアタッチし、その後、他のデバッガが必要になったときに、そのデバッガをデタッチして他のデバッガをアタッチします。プログラムをステップ実行するには、必要に応じてデタッチとアタッチの手順を繰り返してください。
メモ : |
---|
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。 |
このチュートリアルは、[Visual C# 開発設定] を使用して記述されています。このチュートリアルは、次のセクションで構成されています。
マネージ デバッガのアタッチの有効化
アプリケーションの起動
ネイティブ コードでのブレークポイントの設定
ネイティブ デバッガとのアタッチ
ネイティブ ブレークポイントまでの実行
マネージ デバッガとのアタッチ
マネージ コードでのブレークポイントの設定
マネージ ブレークポイントまでの実行
まとめ
前提条件
このチュートリアルは、「チュートリアル : Hello World: スマート デバイスの COM 相互運用の例」という別のチュートリアルでビルドしたソリューションに基づいています。このチュートリアルが正常にビルドおよび実行されていることを確認してください。
マネージ デバッガのアタッチの有効化
デバイス (エミュレータを含む) では、既定で、マネージ デバッガは、既に実行中のプロセスにアタッチできません。既に実行中のプロセスにマネージ デバッガをアタッチするのは、マネージ コードとネイティブ コードの両方が含まれているデバイス ソリューションを操作する場合です。
最初の手順では、既に実行中のプロセスにマネージ デバッガがアタッチできるようにデバイスを設定します。この操作を行うには、デバイスのレジストリ キーを設定します。
メモ : |
---|
キーの設定は、既に実行中のマネージ プロセスへのアタッチのみに影響します。[デバッグ開始] (F5 キー) を使用してプロジェクトを起動する場合には影響しません。ただし、[デバッグ開始] の後にデタッチした場合に、再度アタッチしてデバッグを開始するには、キーの設定が必要になります。 |
実行中のプロセスにマネージ デバッガがアタッチできるようにするには
Windows の [スタート] ボタンをクリックし、[すべてのプログラム] をポイントします。次に [Microsoft Visual Studio 2008] をポイントし、[Visual Studio Remote Tools] をポイントして、[リモート レジストリ エディタ] をクリックします。
[Windows CE デバイスの選択] ウィンドウで、[Windows Mobile 5.0 Pocket PC SDK] を展開し、[Windows Mobile 5.0 Pocket PC エミュレータ] をクリックします。このチュートリアルでは、これが対象のデバイスになります。
[OK] をクリックします。
[デバイスに接続中] 進行状況ウィンドウが開き、デバイス エミュレータおよび Windows CE リモート レジストリ エディタが開きます。
レジストリ エディタで、[Windows Mobile 5.0 Pocket PC エミュレータ] を展開し、HKEY_LOCAL_MACHINE\SOFTWARE\Microsot\.NETCompactFramework\Managed Debugger キーを作成します。
キーを作成するには、[.NETCompactFramework] を右クリックし、[新規作成] をポイントして、[キー] をクリックします。
"Managed" と "Debugger" の間にはスペースがあることに注意してください。
AttachEnabled という名前の DWORD を作成します。
DWORD を作成するには、[Managed Debugger] を右クリックし、[新規作成] をポイントして、[DWORD 値] をクリックします。
[名前] を [AttachEnabled] に、[値] を 1 に設定します。
メモ : このデバイスのデバッグ キーを設定すると、パフォーマンスが大幅に低下します。デバッグをしていない場合は、データ値を 0 にリセットしてこの機能を無効にします。
残りの手順でレジストリの設定を保持するために、デバイス エミュレータを開いたままにしておきます。レジストリ エディタは閉じても問題ありません。
アプリケーションの起動
次の手順では、InteropSolution アプリケーションを起動します。
アプリケーションを起動するには
「チュートリアル : Hello World: スマート デバイスの COM 相互運用の例」で作成したソリューションを開きます。
ツール バーの [ターゲット デバイス] ボックスに [Windows Mobile 5.0 Pocket PC エミュレータ] が表示されていることを確認します。
Visual Studio で、[デバッグ] メニューの [デバッグ開始] をクリックするか、F5 キーを押します。
この手順により、ユーザーが操作する必要なく、HelloCOMObject というネイティブ プロジェクトが直ちにエミュレータに配置されます。
[SayHello の配置] ダイアログ ボックスが表示されたら、[Windows Mobile 5.0 Pocket PC エミュレータ] を選択し、[配置] をクリックします。
この手順により、マネージ プロジェクトが配置されます。
エミュレータでアプリケーションが開きます。まだボタンをクリックしないでください。
ネイティブ コードでのブレークポイントの設定
次の手順では、ネイティブ デバッガをアタッチできるようにネイティブ コードにブレークポイントを設定します。
ネイティブ コードにブレークポイントを設定するには
ソリューション エクスプローラで [Hello.cpp] を右クリックし、[コードの表示] をクリックします。
*text で始まる行で、コード エディタの左の余白をクリックし、ブレークポイントを挿入します。
このブレークポイント シンボルは、感嘆符付きの白丸として表示され、ブレークポイントが現在解決できないことを示します。これは、この時点で適切なシンボルおよびソースが欠けているためです。
Visual Studio で、[デバッグ] メニューの [ウィンドウ] をポイントし、[モジュール] をクリックします。
[モジュール] ウィンドウでは、これまでに読み込まれたすべてのモジュール (SayHello.exe マネージ アプリケーションなど) が表示されます。アプリケーション内のボタンをクリックしていないため、ネイティブな HelloCOMObject.dll はまだ読み込まれていません。
ネイティブ デバッガによるアタッチ
次の手順では、ネイティブ デバッガでアタッチできるようにマネージ デバッガをデタッチします。デバイス プロジェクトでは、両方のデバッガを同時にアタッチできないことを思い出してください。マネージ デバッガからネイティブ デバッガへの切り替えが必要な場合に使用する手順を次に示します。
ネイティブ デバッガでアタッチするには
Visual Studio で、[デバッグ] メニューの [すべてデタッチ] をクリックします。
この手順により、マネージ デバッガはデタッチされますが、アプリケーションは引き続き実行できます。
[デバッグ] メニューの [プロセスにアタッチ] をクリックします。
[トランスポート] ボックスで、[スマート デバイス] を選択します。
[修飾子] ボックスを設定するには、[参照] をクリックします。
[デバイスへの接続] ダイアログ ボックスで、[Windows Mobile 5.0 Pocket PC エミュレータ] を選択し、[接続] をクリックします。
[アタッチ先] ボックスを設定するには、[選択] をクリックします。
[コードの種類の選択] ダイアログ ボックスで、[次のコードの種類をデバッグする] を選択します。[マネージ] チェック ボックスをオフにし、[ネイティブ] チェック ボックスをオンにして、[OK] をクリックします。
[選択可能なプロセス] ボックスで、[SayHello.exe] を選択し、[アタッチ] をクリックします。
これで、ネイティブ デバッガでアタッチされます。
ネイティブ ブレークポイントまでの実行
これで、ネイティブ コードに設定したブレークポイントまで進む準備ができました。再び [モジュール] ウィンドウを確認すると、ネイティブ モジュールが存在することがわかります。ただし、まだ button1 をクリックしていないため、HelloCOMObject.dll は読み込まれていません。
メモ : |
---|
以前にこのチュートリアルを実行したことがある場合は、デバッグ シンボルが既に読み込まれている可能性があるため、この手順を省略できます。まだ実行していない場合は、次のセクションの手順を実行して、デバッグ シンボルを読み込みます。 |
ネイティブ ブレークポイントまで実行を進めるには
デバイス エミュレータのフォームで、button1 をクリックします。
"Hello World!" メッセージがフォーム上に表示され、hellocomobject.dll が [モジュール] ウィンドウに表示されます。
hellocomobject.dll の [シンボルの状態] 列に [読み込まれたシンボル] が表示されていない場合は、次の手順を実行します。
hellocomobject.dll を右クリックし、[シンボルの読み込み] をクリックします。
[シンボル検索] ダイアログ ボックスで、InteropSolution\HelloCOMObject\Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\Debug\HelloCOMObject.pdb に移動します。
[開く] をクリックします。
[シンボルの状態] 列が [読み込まれたシンボル] に変更され、ブレークポイント インジケータはブレークポイントが解決されたことを示します。
デバイス エミュレータのフォーム上で、[Hello World!] ウィンドウの [OK] をクリックし、再度 button1 をクリックします。
ブレークポイント インジケータは、実行がブレークポイントで停止したことを示します。
[デバッグ] メニューの [ステップ イン] をクリックするか、F11 キーを押します。
実行が次の行に移動することに注意してください。これは、ソリューションのネイティブ セクションをステップ実行できることを示します。
マネージ デバッガによるアタッチ
次の手順では、マネージ デバッガにアタッチできるように、ネイティブ デバッガをデタッチします。デバイス プロジェクトでは、両方のデバッガを同時にアタッチできないことを思い出してください。ネイティブ デバッガからマネージ デバッガへの切り替えが必要な場合に使用する手順を次に示します。
マネージ デバッガでアタッチするには
Visual Studio で、[デバッグ] メニューの [すべてデタッチ] をクリックします。
この手順により、ネイティブ デバッガはデタッチされますが、アプリケーションは引き続き実行されます。
[デバッグ] メニューの [プロセスにアタッチ] をクリックし、[トランスポート] ボックスに [スマート デバイス] が表示されていることを確認します。
[修飾子] ボックスを設定します。この設定を行うには、[選択] をクリックし、[Windows Mobile 5.0 Pocket PC エミュレータ] を選択して、[接続] をクリックします。
[アタッチ先] ボックスを設定するには、[選択] を選択し、[次のコードの種類をデバッグする] を選択します。[マネージ] チェック ボックスをオンにし、[ネイティブ] チェック ボックスをオフにして、[OK] をクリックします。
マネージ デバッグとネイティブ デバッグに互換性のないことを示すメッセージが表示されたら、[OK] をクリックします。
[選択可能なプロセス] ボックスで、[SayHello.exe] を選択し、[アタッチ] をクリックします。
ここで、マネージ デバッガがアタッチされます。
マネージ コードでのブレークポイントの設定
次の手順では、マネージ デバッガをアタッチできるようにマネージ コードにブレークポイントを設定します。
マネージ コードにブレークポイントを設定するには
ソリューション エクスプローラで [Form1.cs] を右クリックし、[コードの表示] をクリックします。
string text; という行にブレークポイントを挿入します。
マネージ ブレークポイントまでの実行
これで、マネージ コードに設定したブレークポイントまで進む準備ができました。
マネージ ブレークポイントまで実行を進めるには
デバイス エミュレータで、button1 をクリックします。
ブレークポイントで実行が中断されます。
まとめ
パフォーマンス上の理由により、既に実行中のプロセスにマネージ デバッガをアタッチする必要がなくなったら、デバイスのレジストリ キーを 0 にリセットすることを忘れないでください。