連載:Visual Studioデバッグ手法

第1回 Visual Studio 2010のデバッグ機能をまとめる

亀川 和史
2010/06/09
Page1 Page2 Page3

Visual Studio 2010を使用したデバッグ作業の基本

Visual Studioでデバッグ実行とブレークポイント

 それではVisual Studioのデバッグ機能を使ってみよう。ソリューション・ファイルを読み込み、次の画面のようにメニューバーから[デバッグ]−[デバッグ開始]を選択すると、デバッグ実行が始まる。ファンクション・キーの[F5]を押してもデバッグ実行が開始されるため、「[F5]キーでデバッグ実行」を覚えておくといいだろう。

Visual Studioのメニューバーの[デバッグ]−[デバッグ開始]

 ただし、このままでは「デバッガから実行している」だけで、デバッガを使用しない実行と何ら変わらない。正常に実行できるプログラムであれば、一回も停止せずにそのまま終わってしまう。そうならないように、プログラムのどこかで停止させたい場所(=ブレークポイント)を設定しよう。

 Visual Studioではコード・エディタ上の停止させたい行をクリックして入力カーソルを置き、次の画面のようにメニューバーから[デバッグ]−[ブレークポイントの設定/解除]を実行する。また、[F9]キーを押すと、ブレークポイントの設定のON/OFFを切り替えられるので、これも覚えておくといいだろう。

Visual Studioのメニューバーの[デバッグ]−[ブレークポイントの設定/解除]

 Visual StudioのExpress Editionでは利用できない機能だが、特定の関数に入ったタイミングで停止させたい場合、次の画面のようにメニューバーの[デバッグ]−[ブレークポイントの作成]−[関数でブレーク]を選択する。

Visual Studioのメニューバーの[デバッグ]−[ブレークポイントの作成]−[関数でブレーク]

 ブレークポイントは、実行可能な場所であれば自由に設定できる。例えばメソッドの先頭や末尾でも設定できる。次の画面はC#のコード・エディタの例だが、えんじ色で反転している行がブレークポイントである。

えんじ色で反転している行がブレークポイント

 この例ではMainメソッドが呼び出された直後と、Mainメソッドが終了するタイミングでデバッガに制御が移り、実行停止状態となる。デバッグ実行を継続したい場合は、次の画面のようにメニューバーから[デバッグ]−[続行]/[ステップ イン]/[ステップ オーバー][ステップ アウト]のいずれかを選択すればよい。使い分けは次で解説する。

Visual Studioのメニューバーの[デバッグ]メニューにある4種類のステップ実行

デバッグ実行継続の使い分け

 前述のように一度ブレークポイントで止まった後、デバッグ実行を継続するには、以下の4種類の選択がある。

  • 続行([F5]キー)
  • ステップ・イン([F11]キー)
  • ステップ・オーバー([F10]キー)
  • ステップ・アウト([Shift]+[F11]キー)

 [F5]キーは(先ほど説明した)[デバッグ開始]と同じショートカット・キーで、次のブレークポイントまでデバッグ実行を続行する。それ以外は状況によって使い分ける必要がある。

 ステップ・インとは、現在の関数から呼び出し先の関数も含めて1行ずつ実行する処理だ。ただし、ステップ・インの対象になる個所は、ソース・コードがあるもの(=つまり、アセンブリのみではないもの)に限られる。.NET Framework自身のソース・コードは一部公開されているので、設定を行えばステップ・インの対象になる(具体的な方法は「Visual Studio 2008で見る.NET Frameworkのソース・コード」を参考にしてほしい)。

 次の画面の例でいえば、ステップ・インでは赤線〜青線の各行を1行ずつ逐次実行する。SourceメソッドからMulメソッドを呼び出した場合、Mulメソッドの中まで1行ずつ実行するのがステップ・インとなる。つまり、下の画面でのソース・コードでSourceメソッドのMulメソッドからステップ・イン実行を行うと、Sourceメソッドから抜け出すまでに計6回、[F11]キーを押すことになる。

デバッガによるステップ・イン実行(青線)/ステップ・オーバー実行(赤線)

 ステップ・オーバーは、ステップ・インとは異なり、現在のメソッドから呼び出している呼び出し先のメソッド内の行のステップ実行を行わない。上の例でいえば、赤線のみが実行される(青線はステップ実行されない)。従って、Sourceメソッド内のMulメソッドの呼び出しでブレークポイントを停止させた後、[F10]キーを押せば、2回のステップ実行でSourceメソッドから脱出することになる。

 ステップ・アウトは、ステップ・インの「逆」で、「ステップ・インした関数から抜ける」場合に使用する。例えば、Sourceメソッド内のMulメソッドで停止させている状態から、[Shift]+[F11]キーを押してステップ・アウトを実行すると、Sourceメソッド内でのそれ以降の行ステップ実行は行われず、直ちにSourceメソッドのを呼び出し、元の行で停止される。メソッド内のこれ以降のコードは明らかにデバッグに不要であることが分かりきっているような状況で便利だろう。

 もちろんステップ・アウト実行しても、Sourceメソッド内のそれ以降の行にブレークポイントを設定している状態では(例えば上の画面のコードでは、Console.WriteLineメソッドにブレークポイントを設定しているような場合にステップ・アウト実行したとき)、当然そのブレークポイントで停止される。

ブレークポイントの活用

 ブレークポイントを設定すれば、任意の場所で実行を停止できる。これは逆にいえば、そのブレークポイントで「必ず」停止されることを意味する。例えば1000回実行されるループの中にブレークポイントを設定すると、1000回も[F5]キーを押さなくてはならない。特定の条件のときだけ停止させたいといった目的がある場合であれば、これは非効率的である。

 このような場合に活用できる「特定の条件を満たした場合に停止する」という機能が、ブレークポイントには用意されている。これを利用すれば、上記のような目的のケースではデバッグの効率が飛躍的に向上するだろう。

 残念ながら、Visual C#、Visual Basic、Visual Web DeveloperのExpress Editionでは特定の条件で停止させる機能は使えない。Visual C++のExpress Editionでのみ使用可能となっている。

 特定の条件で停止させる機能の使い方を説明しよう。コード・エディタ上のブレークポイントを設定した行で右クリックして、表示されるコンテキスト・メニューから[ブレークポイント]を選択すると、下の画面のようなメニューが表示される。

[ブレークポイント]のコンテキスト・メニュー

 このコンテキスト・メニューから[条件]を選択すると、次のダイアログ・ボックスが表示される。

[ブレークポイントの条件]ダイアログ・ボックス

 [ブレークポイントの条件]ダイアログ・ボックスの[条件]テキストボックスには、C#プロジェクトの場合、C#と同じ構文で条件式を書くことができる。例えば、

int i = 0;
string s = “test”;

というコードが、ソース・コード上に記述されていれば、ブレークポイントの条件として例えば以下のような形式が有効である。判定の自由度はかなり高い。

  • i == 0
  • s == “test”
  • s.Substring(0,1) == “t”
  • String.IsNullOrEmpty(s) == true

 次の画面のように[条件]テキストボックスの入力中でもIntelliSenseが有効であるため、ブレークポイントの判定で、データの一部分を加工しなくてはならない場合でも、コード・エディタ上でソース・コードを書くときと同様に簡単な入力が行える。

[条件]テキストボックスの入力中で働くIntelliSense

 条件が設定されたブレークポイントのマークは、中心が「+」の白抜きになり、マウス・オーバーしたときに設定した条件がツールチップとして表示される。

ツールチップとして表示されているブレークポイント条件の内容

 [ブレークポイントの条件]ダイアログ・ボックスで[true の場合]ラジオボタンを選択した場合は、設定した条件に一致した場合に実行が停止されるというのは分かりやすい。しかし、[変更された場合]ラジオボタンを選択した場合は、「どんな値になるか分からないが、変更された場合」に実行が停止される。これはどのようなケースで使用できるだろうか?

 例えば、マルチスレッドやマルチプロセスのプログラムで1つの共有領域を複数の処理が変更してしまう状況において、意図しないタイミングで変更される場合を検知したいタイミングなどが考えられる。

 そのほかの機能として、[ブレークポイント]のコンテキスト・メニューの[ヒット カウント]は「何回このブレークポイントを通過したか」というタイミングを設定するためのものである。例えば、数万件のファイルを逐次処理しているが、ループで20000回処理したタイミングで停止させたいという場合役に立つ。

 ブレークポイントの条件でも同様の条件を設定できるが、ヒット・カウントでは回数のリセットが可能であるため、「まずは1000回、次はリセットして3000回経過するまで待つ」といった、「何回で問題の現象が出るか分からないけど、ポイントとなる回数までは繰り返し実行する」という状況で役に立つだろう。

 続いて、トレースポイントを説明しよう。


 INDEX
  [連載]Visual Studioデバッグ手法
  第1回 Visual Studio 2010のデバッグ機能をまとめる
    1.デバッグの事前準備:バグ情報の収集方法
  2.Visual Studio 2010を使用したデバッグ作業の基本(1)
    3.Visual Studio 2010を使用したデバッグ作業の基本(2)

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


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 -

注目のテーマ

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

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