如果断点 A 已被命中,则启用断点 B

Posted

技术标签:

【中文标题】如果断点 A 已被命中,则启用断点 B【英文标题】:Enable breakpoint B if breakpoint A has been hit 【发布时间】:2011-12-28 16:17:56 【问题描述】:

我经常发现自己在代码中的某处设置断点 A 并在命中该断点时手动启用一个或多个断点。一个典型的情况是我在调试一个单元测试并且不关心前面的测试。

void testAddZeros()

  Number a(0);
  Number b(0);
  Number result = a.add(b);
  assert((a + b) == Number(0))

void testAddOnes()

  Number a(1);
  Number b(1);
  Number result = a.add(b);
  assert((a + b) == Number(2));

void testAddNegativeNumber()

  Number a(1);
  Number b(-1)
  Number result = a.add(b);
  assert((a + b) == Number(0));

想象一下,如果 testAddZeros()testAddOnes() 运行良好,但 testAddNegativeNumber()。在这种情况下,在Number result = a.add(b); 设置断点将是开始调试的自然位置。现在想象错误位于Number::add 深处的某个地方,所以我们对Numbers::add 早期发生的事情并不真正感兴趣。我想要做的是在Numbers::add 内的某处设置一个断点,只有当我在testAddNegativeNumber()-test 内时才会触发。

有没有办法在断点A被命中时自动启用断点B

【问题讨论】:

你检查过条件断点吗?可能您可以使用断点 A 被命中的条件来启用“条件”断点 B。(在这种情况下,您可能不再需要断点 A) @ChristiaanV:是的,但我担心在这种情况下条件断点是不够的——至少一般情况下是这样。 您能否展示一个代码示例,您想在哪里使用它? 我唯一能想到的就是使用反射来查找在条件断点内调用的方法。像这样: new StackTrace().GetFrame(1).GetMethod().Name == "testAddNegativeNumber" 【参考方案1】:

即使不更改代码,您也可以获得依赖断点,方法是使用一些全局存储来保存启用依赖断点的标记。

我发现的最容易访问的存储之一是应用域自定义属性。它们可以通过 System.AppDomain.CurrentDomain.GetData 和 SetData 方法访问。

所以在第一个断点上,你定义了一个“当命中”设置:

System.AppDomain.CurrentDomain.SetData("break",true)

在依赖断点上,将命中条件设置为:

System.AppDomain.CurrentDomain.GetData("break") != null

【讨论】:

我想知道这种事情是否适用于跟踪点......现在我知道了。点赞! 在调试 C++ 代码时是否可以做到这一点?【参考方案2】:

这是我认为你能做的最好的事情,但它似乎太大了,甚至无法尝试,因为它涉及添加一个变量......

string breakpointToStopOn = string.Empty;
Console.WriteLine("HERE"); // You can set breakpoint A here, 
                           // with a condition (right click on the breakpoint, then selectCondition),
                           // that sets breakpointToStopOn = "A"
Console.WriteLine("B"); // and you can set your breakpoint here with this condition
                        // (breakpointToStopOn == "A");  

您实际上无法在 Console.WriteLine("HERE") 行上停止,但您可以启用或禁用断点,这实际上会启用另一个断点。

但请注意,条件断点语句会在调试时严重降低应用的性能。

【讨论】:

虽然这不是我想要的,但我想这是最好的(嗯,唯一的)建议。

以上是关于如果断点 A 已被命中,则启用断点 B的主要内容,如果未能解决你的问题,请参考以下文章

vs2010 C# 当前不会命中断点。还没有为该文档加载任何符号。 求解决

VS2017调试代码显示“当前无法命中断点,还没有为该文档加载任何符号”

为啥 Intellij 的调试器会为此 Scala 代码两次命中断点

当前不会命中断点,还没有为该文档加载任何符号

VS2019 创建程序以管理员运行后断点无法命中的问题

charles 启用/禁用断点