我经常发现自己在代码中的某处设置断点,并在此断点被触发时手动启用一个或多个断点。一个典型的情况是我在调试单元测试时并不关心前面的测试。
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
?
答案 0 :(得分:23)
通过使用一些全局存储来保存将启用相关断点的标记,您甚至可以在不更改代码的情况下获取相关断点。
我发现的最容易访问的存储之一是应用域自定义属性。它们可以通过System.AppDomain.CurrentDomain.GetData和SetData方法访问。
因此,在第一个断点处,您可以使用以下命令定义“命中时”设置:
{System.AppDomain.CurrentDomain.SetData( “突破”,真)}
在从属断点上,将命中条件设置为:
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”)行停止,但您可以启用或禁用断点,这实际上将启用其他断点。
请注意,条件断点语句会在调试时严重降低应用程序的性能。