Visual Studio 2010のデバッグのヒント

これは、VS 2010および.NET 4に関する一連の出版物の26番目の出版物です。



今日の投稿では、Visual Studioで適用できる便利なデバッグのヒントを紹介します。 私の友人であるScott Cate(彼のブログに VSの素晴らしいVSのヒントとトリックを投稿しました)は最近、Visual Studioを使用する多くの開発者が知らない良いヒントに注目しました以前のバージョンから長い間)。



まだそれらについて知らない場合、この出版物がそれらについて学ぶのを助けることを望みます。 それらはすべて簡単に習得でき、時間を大幅に節約できます。



カーソルまで実行(Ctrl + F10)



多くの場合、次のようにアプリケーションをデバッグしている人々を観察します。彼らは、興味のある場所よりもはるかに早くブレークポイントを設定し、その後、F10 / F11を使用して、本当に探索したい場所に到達するまでコードを通過します。 場合によっては、通過する各式を慎重に調べます(そのような場合、F10 / F11を使用するのは理にかなっています)。 しかし、多くの場合、人々は実際に関心のあるコード行にすばやくジャンプしようとします-そのような場合、F10 / F11を使用することはそのような目標を達成するための最良の方法ではありません。

代わりに、デバッガーでサポートされている「カーソルまで実行」機能を使用できます。 アプリケーションを実行するコード行にカーソルを置き、Ctrl + F10を同時に押します。 これにより、アプリケーションはこの行まで実行され、デバッグモードに切り替わり、ここに到達するためにF10 / F11を複数回押すことに費やす時間を節約できます。 これは、取得したいコードが、現在デバッグしている場所に関連する別のメソッドまたはクラスにある場合でも機能します。



条件付きブレークポイント



よく見られるもう1つの一般的な状況は、開発者がブレークポイントを設定し、アプリケーションを実行し、特定の入力を確認し、ブレークポイントに到達してから、デバッグモードでさらに検討を進めるかどうかを決定する前に条件が真かどうかを手動で確認する場合です。 スクリプトが次に実行するものと一致しない場合、F5を押してアプリケーションを続行し、他の入力を確認して、プロセスを手動で繰り返します。



条件付きブレークポイントを設定するVisual Studioの機能は、これを実現するはるかに簡単な方法を提供します。 条件付きブレークポイントを使用すると、割り当てられた特定の条件に到達した場合にのみ、デバッグモードに切り替えることができます。 条件付きブレークポイントを使用すると、コードをさらに実行して手動で調査する必要がなくなります。また、デバッグプロセス全体を手動で行う必要がなくなり、退屈な作業を省くことができます。



条件付きブレークポイントを有効にする方法



条件付きブレークポイントの設定は、実際には簡単です。 F9コードを押して、特定の行にポイントを設定します( 約Per。また、ブレークポイントを設定する行レベルでエディターウィンドウの左の境界をクリックすることで、ブレークポイントを設定することもできます )。



画像



次に、エディターウィンドウの左側にあるブレークポイントの赤い円を右クリックし、コンテキストメニュー「Condition ...」(「Condition ...」)を選択します。



画像



これにより、特定の条件が満たされた場合にのみブレークポイントを起動するように指定できるダイアログボックスが表示されます。 たとえば、次の式を記述することにより、ローカルpaginatedDinnersリストのサイズが10未満の場合、デバッグを開始する必要があることを示すことができます。



画像



これで、アプリケーションを再起動して検索を実行すると、10回未満のランチを返す検索を実行した場合にのみ、デバッガーが有効になります。 10を超える夕食がある場合、ブレークポイントに到達しません。



ヒットカウント機能



条件がN回真である場合にのみデバッガを停止する必要がある場合があります。

たとえば、すでに5回の検索で10回未満の夕食が返された場合にのみ停止します。



この動作を有効にするには、ブレークポイントを右クリックし、メニュー項目「ヒットカウント...」(「ヒット数...」)を選択します。



画像



これにより、条件に到達した場合にブレークポイントにN回だけ到達するか、到達したときにN回ごとに、またはN回発生するたびにブレークポイントに到達するかを指定できるダイアログボックスが表示されます。



画像



マシン/スレッド/プロセスによるフィルタリング(マシン名/スレッド/プロセス)

ブレークポイントを右クリックして、コンテキストメニューから[フィルター...]を選択して、デバッグプロセスが特定のマシンまたは特定のマシン上にある場合にブレークポイントに到達することを示すこともできます。プロセスまたは特定のスレッドで。



TracePoints-ブレークポイントでヒットしたときのカスタムイベント



多くの人が知らないデバッガー機能は、 TracePointsを使用する機能です。 トレースポイントは、ユーザーイベントがトリガーされる到達点のブレークポイントです。 この機能は、デバッグを停止せずにアプリケーションの動作を追跡する必要がある場合に特に役立ちます。



シンプルなコンソールアプリケーションを使用して、トレースポイントの使用方法を示しています。 以下は、フィボナッチ数列の再帰的な実装です



画像



上記のアプリケーションでは、Console.WriteLine()を使用して、特定の範囲値の最終行値を出力します。 実際に停止または停止することなく、デバッグと同時にフィボナッチ数列の再帰シーケンスを追跡したい場合はどうでしょうか? トレースポイントは、これを簡単に行うのに役立ちます。



トレースポイントの設定(TracePoint)



F9キーを使用してコード行にブレークポイントを設定し、ブレークポイントを右クリックしてコンテキストメニューから[ヒット時...]を選択すると、トレースポイントを有効にできます。



画像



これにより、ブレークポイントに到達したときの動作を指定できるダイアログボックスが表示されます。



画像



ブレークポイント条件に到達するたびにトレースメッセージを表示することを上記で示しました。 ローカル変数「x」の値をメッセージの一部として出力するよう指示したことに注意してください。 ローカル変数は、{variableName}構文を使用して参照できます。 トレースメッセージに一般的な値を出力するために使用できる組み込みコマンド($ CALLER、$ CALLSTACK、$ FUNCTIONなど)もあります。



上記では、下部の「実行を継続する」の横のボックスもチェックしました。これは、デバッガーでアプリケーションを停止する必要がないことを示しています。 それどころか、ブレークポイントの条件に到達するたびにカスタムトレースメッセージが表示されるという違いを除いて、引き続き実行されます。



そして今、アプリケーションを実行すると、カスタムトレースメッセージがVisual Studioウィンドウの「出力」に自動的に表示され、アプリケーションの再帰的な動作を監視できることがわかります。



画像



上記の方法の代替として、アプリケーションのユーザートレースリスナーを作成できます。この場合、トレースポイントで生成されたメッセージは、VS出力ウィンドウの代わりにリダイレクトされます。



TracePoints-カスタムマクロの実行



先週ロンドンで行った会話の中で、聴衆の誰かが、TracePointに達したときにローカル変数を自動的に表示できるかどうか尋ねました。



この機能はVisual Studioに組み込まれていませんが、カスタムマクロを使用して有効にし、そのポイントに到達したときにマクロを呼び出すようにトレースポイントを設定できます。 これを行うには、Visual Studio内でマクロの統合環境を開きます([ツール]-> [マクロ]-> [マクロIDE]メニューコマンド)。 次に、プロジェクトブラウザーのMyMacrosノードの下で、モジュールを選択するか、新しいモジュールを作成します(たとえば、「UsefulThings」という名前で)。 その後、次のマクロコードをVBにモジュールに挿入して保存します。



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




* This source code was highlighted with Source Code Highlighter .









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




* This source code was highlighted with Source Code Highlighter .









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




* This source code was highlighted with Source Code Highlighter .














C#

void DumpLocals() {

EnvDTE.OutputWindow outputWindow;

outputWindow = DTE.Windows.Item[EnvDTE.Constants.vsWindowKindOutput].Object;

EnvDTE.StackFrame currentStackFrame;

currentStackFrame = DTE.Debugger.CurrentStackFrame;

outputWindow.ActivePane.OutputString(( "*Dumping Local Variables*" + "\r\n" ));

foreach (EnvDTE.Expression exp in currentStackFrame.Locals) {

outputWindow.ActivePane.OutputString((exp.Name + ( " = "

+ (exp.Value.ToString() + "\r\n" ))));

}

}




* This source code was highlighted with Source Code Highlighter .









void DumpLocals() {

EnvDTE.OutputWindow outputWindow;

outputWindow = DTE.Windows.Item[EnvDTE.Constants.vsWindowKindOutput].Object;

EnvDTE.StackFrame currentStackFrame;

currentStackFrame = DTE.Debugger.CurrentStackFrame;

outputWindow.ActivePane.OutputString(( "*Dumping Local Variables*" + "\r\n" ));

foreach (EnvDTE.Expression exp in currentStackFrame.Locals) {

outputWindow.ActivePane.OutputString((exp.Name + ( " = "

+ (exp.Value.ToString() + "\r\n" ))));

}

}




* This source code was highlighted with Source Code Highlighter .









void DumpLocals() {

EnvDTE.OutputWindow outputWindow;

outputWindow = DTE.Windows.Item[EnvDTE.Constants.vsWindowKindOutput].Object;

EnvDTE.StackFrame currentStackFrame;

currentStackFrame = DTE.Debugger.CurrentStackFrame;

outputWindow.ActivePane.OutputString(( "*Dumping Local Variables*" + "\r\n" ));

foreach (EnvDTE.Expression exp in currentStackFrame.Locals) {

outputWindow.ActivePane.OutputString((exp.Name + ( " = "

+ (exp.Value.ToString() + "\r\n" ))));

}

}




* This source code was highlighted with Source Code Highlighter .














上記のマクロコードは、現在のスタックを循環し、すべての変数を出力ウィンドウに表示します。



カスタムDumpLocalsマクロを使用する



次に、カスタムマクロ「DumpLocals」を使用して、以下に示す単純な追加アプリケーションを作成できます。



画像



F9キーを使用して、メソッドのreturn式にブレークポイントを設定します

上記の「追加」。 次に、ブレークポイントを右クリックして、コンテキストメニューから[ヒット時]コマンドを選択します。



画像



これにより、次のダイアログボックスが表示されます。 「メッセージの印刷」フラグを使用し、表示する変数を手動で定義した以前のコードとは異なり、今回は代わりに「マクロの実行」フラグを選択します上記で作成したUsefulThings.DumpLocalsマクロを示します。



画像



「継続実行」チェックボックスを選択したままにして、トレースポイントに達した後もプログラムが実行を継続するようにします。



アプリケーションの起動



そして今、F5キーを押してアプリケーションを起動すると、Addメソッドが起動されたときにVisual Studioの「出力」ウィンドウに次の出力が表示されます。 トレースポイントに達したときに、マクロがリスト内の各変数の名前と値を自動的に表示する方法に注意してください。



画像



まとめ



Visual Studioデバッガーは非常に豊富な機能を備えています。 その可能性をすべて真に探求する時間を確保することを強くお勧めします。 上記のヒントやコツは、人々が実際に気付いていない機能のほんの一部にすぎません。



前回ブログでVS 2010デバッガーの他の改善点(データの種類に関するヒントの出力(DataTip)、ブレークポイントのインポート/エクスポート、変数の最新値の保存など)について書いた。 VS 2010の新機能であるIntellitraceと、ダンプファイルのデバッグのサポートについて、ブログで引き続き書いていきます。 出版物アプリケーションのデバッグをさらに簡単にすることができる追加のクールな新機能を説明します。



また、優れたScott KatシリーズVisual Studio 2010のヒントとコツをチェックして、Visual Studioの最適な使用方法を確認してください。 彼には、比類のない無料のビデオとブログ投稿があります。



これがお役に立てば幸いです、



スコット



PSブログの投稿に加えて、Twitterを使用して迅速な更新とリンク交換を行うようになりました。 フォローしてください:twitter.com/scottgu



All Articles