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

时间:2011-11-14 13:44:34

标签: .net visual-studio breakpoints visual-studio-debugging

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

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() - 测试时才触发。

当遇到断点B时,有没有办法自动启用断点A

2 个答案:

答案 0 :(得分:23)

通过使用一些全局存储来保存将启用相关断点的标记,您甚至可以在不更改代码的情况下获取相关断点。

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

因此,在第一个断点处,您可以使用以下命令定义“命中时”设置:

  

{System.AppDomain.CurrentDomain.SetData( “突破”,真)}

breakpoint condition

在从属断点上,将命中条件设置为:

  

System.AppDomain.CurrentDomain.GetData(“break”)!= null

答案 1 :(得分: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”)行停止,但您可以启用或禁用断点,这实际上将启用其他断点。

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