visual-studio-2008 - 将一个断点的命中计数用于另一个断点的条件

标签 visual-studio-2008 debugging conditional-breakpoint

我在 C# 代码上使用 Visual Studio 2008。

如果另一个断点被击中(并被打破),我只想在一个断点上中断。有没有办法做到这一点?

我想作为一个子问题,访问调试器拥有的信息会很好。

这样做的基本原理是我只对给定某个调用堆栈的某个断点感兴趣(以及在调用堆栈中执行这些函数之一的某个点)。也许我应该改用调用堆栈?另一个原因是对调试器知道的内容进行编程访问会很有趣。

谢谢。

最佳答案

使用局部变量

创建这样一个条件断点的最简单方法是创建一个新的线程静态变量(或者如果它应该是全局的就只是静态变量)。假设我们的代码如下所示:

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");
    }
}

现在让我们假设您在 Console.WriteLine("test1"); 上设置了一个断点 1和断点 2 位于 Console.WriteLine("test2"); .只有当断点 1 被击中 2 次时,您才希望在断点 2 处中断。在这种情况下,您需要设置 Hit Count...断点 1 的属性到 break when the hit count is equal to 2 .然后在 When Hit...属性(property)检查Print a message并在文本框中输入:{breakVariable = 1} :

when break

然后设置属性Condition...断点 2 到 breakVariable == 1并检查 Is true :

condition

如果您希望 breakpoint2 在被击中后变为非事件状态,您可以再次使用 When Hit...属性设置其 Print a message值到 {breakVariable=0} .

使用宏

这种方法要困难得多,尤其是如果您不喜欢 VBA(如我:)),但您可能会感兴趣,因为它不需要对应用程序代码进行任何更改。让我们定义两个宏:

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

现在对于断点 1,您仍然要设置 Hit Count...属性和以前一样,但现在在 When Hit...属性而不是检查 Print a message检查 Run a macro并选择 SetMyBreakpoint程序。在 Breakpoints.Add 中提供代码文件的完整路径非常重要。方法和正确的行(您可以检查 API 以找到其他设置断点的方法,例如在函数上而不是代码文件上)。这里有一个小小的警告——我观察到第二个断点的自动删除并不总是有效——但也许是我的 Visual Studio。

使用调用堆栈

您可以再次使用 Condition断点的属性 - 看看 this question找到一些细节。

关于visual-studio-2008 - 将一个断点的命中计数用于另一个断点的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8424226/

相关文章:

c# - 在Visual Studio 2008中调试多线程C#-C++/CLI-C++解决方案: What are these threads?

html - 奇怪的 IE 错误?

c++ - VS 调试器中未正确显示具有嵌套类型的 QList

c++ - 在 VS2008 中编译 boost property_tree 给出 fatal error C1001

debugging - 如何在 Juno(Julia 编辑器)中启用调试消息

gdb - 如何在gdb中的 “something is printed to the terminal”上设置断点?

c++ - 是否每个应用程序都使用依赖于 VC++9 运行时的东西来嵌入 list ?

.net - 如何在Visual Studio 2008的WATCH列表中保存/打印值?

perl - 我可以从程序中有条件地启用 `$DB::single =1` 断点吗?