連載:Visual Studioデバッグ手法

第3回 Visual Studio 2010による高度なデバッグを極める

亀川 和史
2010/10/01

 前回までVisual Studioのデバッガ機能を紹介してきた。そこで説明した[F5]キーによる通常のデバッグ実行で、すべてが問題なくデバッグできるケースも多いが、通常のデバッグ実行ではうまくデバッグできない例もある。

 本稿では、そういった通常のデバッグ実行では十分にデバッグできないプロジェクト例を6つほど示し、それぞれにおいて実際にデバッグを行う手法を紹介する。

(1).dllファイル(=アセンブリ)のデバッグ
(2)リモート・デバッグ
(3)別サーバのIIS上で実行されるプロジェクトのデバッグ
(4)コードからのデバッガ制御
(5)Internet Explorer 8の拡張機能デバッグ
(6)並列プログラムの可視化機能

.dllファイル(=アセンブリ)のデバッグ

通常のクラス・ライブラリのデバッグ手法

 1つのソリューションに実行可能ファイル(=.exeファイル)とクラス・ライブラリ(=.dllファイル)のアセンブリが存在しており、そのクラス・ライブラリのデバッグを行うには、.exeファイル側プロジェクトの参照設定にクラス・ライブラリを設定しておくだけでよい。この状態で.exeファイルのコードをステップ実行すると、そのコードからクラス・ライブラリのコードが呼び出されたタイミングで、自動的にクラス・ライブラリ側のソース・コードがVisual Studioのコード・エディタに表示されて、デバッグできる。

クラス・ライブラリのデバッグ
この例では、.exeファイル側の「obj.caller();」というコードがステップ実行されると、.dllファイル側のcallerメソッドが呼び出され、「public void caller (){ …… }」というコードをデバッグできる。

 このデバッグ手法は説明不要だろう。それでは、ほかの人が作成した.exeファイルから自作のクラス・ライブラリ(=.dllファイル)が呼び出される場合、(その.exeファイルなしで)クラス・ライブラリのみをデバッグする方法はご存じだろうか?

ソリューション内のクラス・ライブラリをデバッグする方法

 まず、ソリューション内にアプリケーション(=.exeファイル)とクラス・ライブラリのプロジェクトが含まれている場合に、そのクラス・ライブラリをデバッグする場合のソリューション・プロパティの設定方法を振り返っておこう。

 クラス・ライブラリをデバッグするには、デバッグ対象のプロジェクトがデバッグ実行時に最初に起動されるように、スタートアップ・プロジェクトに設定しておく必要がある。

 これには、[ソリューション エクスプローラー]でソリューション項目を右クリックすると表示されるコンテキスト・メニュー(=右クリック・メニュー)から[プロパティ]を選択すればよい(もしくは、[ソリューション エクスプローラー]でソリューション項目を選択して状態で[Alt]キーを押しながら[Enter]キーを押してもよい)。これにより、以下の画面(=ソリューションのプロパティ・ページ)が表示されるので、そこでスタートアップ・プロジェクトを設定する。

ソリューションのプロパティ・ページでのスタートアップ・プロジェクトの設定
左側のツリー表示から[共通プロパティ]−[スタートアップ プロジェクト]を選択して、デバッグ対象にしたいクラス・ライブラリのプロジェクトをスタートアップ・プロジェクトに設定しているところ。
  デバッグ実行時に単一のプロジェクトのみでデバッグが可能な場合は、[シングル スタートアップ プロジェクト]ラジオボタンを選択する。デバッグ対象としたクラス・ライブラリのプロジェクトをコンボボックスから選択する。
  デバッグ実行時に複数のプロジェクトを実行させたい場合や異なるプロセスが起動していなくてはならない場合には、[マルチ スタートアップ プロジェクト]ラジオボタンを選択する。この機能については、次章「リモート・デバッグ」で解説する。

 もしくは、[ソリューション エクスプローラー]で、デバッグ対象にしたいプロジェクト項目の右クリック・メニューから[スタートアップ プロジェクトに設定]を選択してもよい。

デバッグ対象のプロジェクトを[スタートアップ プロジェクトに設定]するための[ソリューション エクスプローラー]のプロジェクト項目の右クリック・メニュー

対象のクラス・ライブラリのみをデバッグする方法

 では、アプリケーションのプロジェクトが含まれていないソリューション内にクラス・ライブラリのプロジェクトのみを作成して、それをデバッグする場合にはどうすればよいのだろうか?

 これも(先ほどのスタートアップ・プロジェクトの設定で行ったことと)基本は変わらない。先ほどのようにクラス・ライブラリをスタートアップ・プロジェクトに指定して、デバッグ起動時にクラス・ライブラリを読み込む外部のアプリケーション(=ソリューションに含まれていない、外部に存在する.exeファイル)を、プロジェクト・プロパティの[外部プログラムの開始]に設定すればよい。

プロジェクト・プロパティでのクラス・ライブラリを呼び出す.exeファイルの設定
[ソリューション エクスプローラー]でプロジェクト項目の右クリック・メニューから[プロパティ]を選択すれば、このようなプロジェクト・プロパティが表示される。そこで、左側から[デバッグ]タブを開き、プログラムの実行を開始する外部のアプリケーション(=クラス・ライブラリを読み込む.exeファイル)を指定する。この指定は、構成(DebugやReleaseなど)ごとに指定する必要がある。

 この設定でクラス・ライブラリをデバッグ実行すると、デバッガにクラス・ライブラリのプロジェクトが読み込まれるので、適宜(クラス・ライブラリのソース・コードに)ブレークポイントを設定しておけば、その設定場所で実行を停止させられる。

【コラム】Visual Studioホスティング・プロセスにご注意

 筆者がデバッグ実行で少しはまったのが、Visual Studioホスティング・プロセスだ(参考:「.NET TIPS:VSホスト・プロセス(*.vshost.exe)とは何か?」「.NET TIPS:.vshost.exeファイルと.pdbファイルが生成されないようにするには?」)。

 そのときは、クラス・ライブラリと呼び出し元プロセス(=.exeファイル)という構成で、デバッグを行っていた。そのクラス・ライブラリ内で、呼び出し元の実行モジュール名を判定する必要があったので、その判定処理を組み込んでいたが、なぜかその処理が誤った判定を行ってしまう。その原因を確認したところ、Visual Studioホスティング・プロセスが有効になっていたため、起動プロセス名がホスティング・プロセスの名前(例えば「ConsoleApplication1.vshost.exe」)になっていたためであった。

 下記のコードは、モジュール名を列挙するコンソール・アプリケーション用のサンプル・コードである。

var modules = Process.GetCurrentProcess().Modules;
Console.WriteLine(
  "現在読み込まれているアセンブリ数:{0}個A", modules.Count);
foreach (var module in modules) {
  Console.WriteLine(module.ToString());
}
Dim modules = Process.GetCurrentProcess().Modules
Console.WriteLine( _
  "現在読み込まれているアセンブリ数:{0}個A", modules.Count)
For Each _module In modules
  Console.WriteLine(_module.ToString())
Next
モジュール名を列挙するサンプル・コード(上:C#、下:VB)

 このプログラムを実行すると、次の画面に示すように、ホスティング・プロセスの有効/無効で結果が異なる。

ホスティング・プロセスを有効にした場合

ホスティング・プロセスを無効にした場合

 ホスティング・プロセスが有効な場合の実行モジュール名が「ConsoleApplication1.vshost.exe」なのに対して、無効な場合は「ConsoleApplication1.exe」となっている。ホスティング・プロセスを有効にした状態でデバッグする場合には、こういう問題にはまらないように注意してほしい。



 INDEX
  [連載]Visual Studioデバッグ手法
  第3回 Visual Studio 2010による高度なデバッグを極める
  1. .dllファイル(=アセンブリ)のデバッグ
    2. リモート・デバッグ
    3. 別サーバのIIS上で実行されるプロジェクトのデバッグ
    4. コードからのデバッガ制御/Internet Explorer 8の拡張機能デバッグ
    5. 並列プログラムの可視化機能

インデックス・ページヘ 「連載:Visual Studioデバッグ手法」

@IT Special

- PR -

TechTargetジャパン

Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

ホワイトペーパーTechTargetジャパン

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH