7

C#コードでVisualStudio2008を使用しています。

別のブレークポイントがヒットした(そしてブレークした)場合にのみブレークポイントをブレークしたいのですが、それを行う方法はありますか?

サブ問題として、デバッガーが持っている情報にアクセスできると便利だと思います。

これの理論的根拠は、特定のコールスタックが与えられた場合(およびコールスタック内のそれらの関数の1つの実行の特定の時点で)、特定のブレークポイントでのみブレークすることに関心があるためです。おそらく、代わりにコールスタックを使用する必要がありますか?もう1つの理由は、デバッガーが認識しているものにプログラムでアクセスできることは興味深いことです。

ありがとう。

4

1 に答える 1

7

ローカル変数の使用

このような条件付きブレークポイントを作成する最も簡単な方法は、新しいスレッド静的変数(または、グローバルである必要がある場合は静的)を作成することです。コードが次のようになっているとします。

class Program
{
#if DEBUG
    [ThreadStatic]
    static int breakVariable = 0;
#endif

    static void Main(string[] args)
    {
        TestMethod2();

        TestMethod1();
        TestMethod2();

        TestMethod2();

        TestMethod1();
        TestMethod2();
    }

    static void TestMethod1()
    {
        Console.WriteLine("test1");
    }

    static void TestMethod2()
    {
        Console.WriteLine("test2");
    }
}

ここで、ブレークポイント1をに設定し、ブレークポイント2をに設定するConsole.WriteLine("test1");としますConsole.WriteLine("test2");。ブレークポイント1が2回ヒットした場合にのみ、ブレークポイント2でブレークしたいとします。この場合Hit Count...、breapoint1のプロパティをに設定する必要がありますbreak when the hit count is equal to 2。次に、When Hit...プロパティチェックPrint a messageとテキストボックスに次のように入力します{breakVariable = 1}

休憩時

Condition...次に、breakpoint2のプロパティをに設定しbreakVariable == 1てチェックしIs trueます。

調子

ヒット後にbreakpoint2を非アクティブにしたい場合は、When Hit...プロパティを使用してそのPrint a message値をに設定することができます{breakVariable=0}

マクロを使用する

このアプローチは、特にVBAが気に入らない場合(私のように:))ははるかに困難ですが、アプリケーションコードを変更する必要がないため、興味があるかもしれません。2つのマクロを定義しましょう。

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module Module1

    Public Sub SetMyBreakpoint()
        Dim bps As EnvDTE.Breakpoints
        bps = DTE.Debugger.Breakpoints.Add(File:="C:\MyProject\ConsoleApplication1\Program.cs", _
                                           Line:=25)
        Dim bp As EnvDTE80.Breakpoint2
        For Each bp In bps
            bp.Tag = "mytag"
            ' Add this line only if you want the breakpoint to be removed on hit
            ' Although I don't know why - it does not always worked :(
            bp.Macro = "Macros.MyMacros.Module1.RemoveMyBreakpoint"
        Next
    End Sub

    Public Sub RemoveMyBreakpoint()
        Dim bp As EnvDTE.Breakpoint
        For Each bp In DTE.Debugger.Breakpoints
            If (bp.Tag = "mytag") Then
                bp.Delete()
            End If
        Next
    End Sub
End Module

ここで、breakpoint1については、Hit Count...以前と同じようにプロパティを設定しますが、チェックをチェックしてプロシージャを選択するWhen Hit...代わりに、プロパティに設定します。メソッドにコードファイルのフルパスと正しい行を指定することが非常に重要です(APIをチェックして、コードファイルの代わりに関数などでブレークポイントを設定する他の方法を見つけることができます)。ここでの1つの小さな注意点(2番目のブレークポイントの自動削除が常に機能するとは限らないことを確認しました)が、おそらくそれは私のVisualStudioでした。Print a messageRun a macroSetMyBreakpointBreakpoints.Add

コールスタックの使用

Conditionブレークポイントのプロパティを再度使用できます。詳細については、この質問をご覧ください。

于 2011-12-08T12:58:04.167 に答える