トレースポイント-ブレークポイントがヒットした時の独自のアクション
多くの人が知らないデバッグ機能がトレースポイントを使用する機能です。トレースポイントとは、ブレークポイントがヒットした時にトリガーされるいくつかの独自のアクションを持つブレークポイントです。この機能は、デバッガでブレークインせずにアプリケーション内の動作を確認したいときに特に便利です。
簡単なコンソールアプリケーションを使用してトレースポイントの活用方法例を紹介したいと思います。以下は、フィボナッチシーケンスの再帰実装です。
上記のアプリケーションでは、Console.WriteLine()を使って最後のフィボナッチシーケンスの値を特定の入力に対して出力します。もしそのフィボナッチ再帰シーケンスをデバッガ内で実際に実行されていく様子を、その実行を実質的に一時停止することなしに、観察したい場合は、トレースポイントにより簡単に行うことができます。
トレースポイントのセットアップ
トレースポイントは、F9を使用してコード行上にブレークポイントを設定した後、そのブレークポイント上で右クリックし、[ヒット時...]コンテキスト・メニュー・コマンドを選択すると有効化できます。
以下のダイアログが表示され、ブレークポイントがヒットした時に発生させる事柄を指定できます。
上記ではブレークポイントの条件が合致した時に、毎回トレースメッセージを表示するように指定しています。メッセージの一部としてローカル変数「x」の値を出力するように指定していることをご確認ください。ローカル変数は{variableName}文法を使用して参照できます。またビルトインコマンド($CALLER、$CALLSTACK、$FUNCTIONなど)もあり、トレースメッセージ内で共通の値を出力するのに使用できます。
上記では下方にある[続けて実行する]チェックボックスもチェックしています。これはアプリケーションをデバッガにブレークインさせたくないことを示しています。これで、ブレークポイントの条件が合致する度に独自のトレースメッセージが出力されるという違いはありますが、実行は継続されます。
今アプリケーションを実行すると、独自のトレースメッセージが自動的にVisual Studioの[出力]ウィンドウに表示されることがわかります。これにより、アプリケーションの再帰動作を追いかけることが可能です。
また独自のトレースリスナーをアプリケーションに接続することもできます。その場合、トレースポイントから表示されるメッセージは、VSの出力ウィンドウではなく接続先へ送られます。
トレースポイント-独自のマクロを実行
ロンドンで先週行った講演で、聴衆の方からトレースポイントがヒットした時にすべてのローカル変数を自動的に出力できるかどうかという質問を受けました。
この機能はVisual Studioにビルトインされていませんが、Visual Studioで独自のマクロを書いて、ヒットした時にそのマクロを呼ぶトレースポイントと接続することで有効化できます。これを有効にするために、マクロ IDEをVisual Studio内で開きます([ツール] - [マクロ] - [マクロ IDE]メニューコマンド)。
プロジェクト エクスプローラーのMyMacrosノードの下で、モジュールを選択するか新しく1つ作成します(例:「UsefulThings」という名前のものを追加)。そして、以下のVBマクロコードをそのモジュールに貼り付けて保存します。
Sub DumpLocals() Dim outputWindow As EnvDTE.OutputWindow outputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object Dim currentStackFrame As EnvDTE.StackFrame currentStackFrame = DTE.Debugger.CurrentStackFrame outputWindow.ActivePane.OutputString("*Dumping Local Variables*" + vbCrLf) For Each exp As EnvDTE.Expression In currentStackFrame.Locals outputWindow.ActivePane.OutputString(exp.Name + " = " + exp.Value.ToString() + vbCrLf) Next End Sub
上記のマクロコードは現在のスタックフレームでループして、すべてのローカル変数を出力ウィンドウにダンプします。
独自のDumpLocalsカスタムマクロを使用
そうすると以下の簡単な追加アプリケーションを使用して独自の「DumpLocals」マクロが活用できるようになります。
F9を使用して上記の「Add」メソッド内でreturnステートメント上にブレークポイントを設定します。そして、ブレークポイント上で右クリックし、[ヒット時]メニューコマンドを選択します。
これにより次のダイアログが表示されます。前とは違って、[メッセージを表示する]チェックボックスオプションを使用して出力したい変数を手動で指定していたところを、今回は[マクロを実行する]チェックボックスを選択して、上記で作成した独自のUsefulThings.DumpLocalsマクロをポイントします。
[続けて実行する]チェックボックスは選択したままにしておき、プログラムがトレースポイントがヒットした時でも継続して実行するようにします。
アプリケーションの実行
今F5を押してアプリケーションを実行すると、Addメソッドが引き起こされた時にVisual Studioの「出力」ウィンドウに次の出力が表示されます。トレースポイントがヒットした時にどのようにマクロが各ローカル変数の名前と値を自動的に一覧化するのかをご確認ください。
まとめ
Visual Studioのデバッガは非常にリッチです。時間をとってすべての機能をきちんと習得することを推奨します。上記のチップスやトリックは多くの機能の中でほんのわずかなものですが、実際ほとんどの人が気づいていないことを提供するものです。
以前に、その他のVS 2010デバッガの改善点についてブログ投稿(データチップのピン止め、ブレークポイントのインポート/エクスポート、変数の最後の値の保存などを含む)しました。新しいVS 2010のIntelliSenseおよびダンプ・ファイル・デバッグのサポートについても、今後もっとブログ投稿しようと思っています。これらは、アプリケーション(本番のものを含む)のデバッグをかなり簡単でより強力にする多くのクールな新しい機能を提供します。
またScott Cate氏の素晴らしいVisual Studio 2010のチップスとトリックのシリーズも忘れないようにチェックしてVisual Studioを最大限に活用する方法を習得してください。彼は、本当に最高の無償ビデオ一式やブログ投稿を行っています。
そしてJim Griesmer氏による素晴らしいVisual Studio デバッグのチップスとトリックシリーズも注目です。彼は活用できる素晴らしいチップスとトリックを数多く持っています。
Hope this helps,
Scott
P.S. ブログに加え、現在Twitterを使って簡単な更新やリンク共有を行っています。twitter.com/scottguで、私をフォローしてください。