![](/img/trans.png)
[英]How can I detect whether a debugger is attached *and* a breakpoint has been set or hit?
[英]Enable breakpoint B if breakpoint A has been hit
我經常發現自己在代碼中的某處設置了一個斷點,並在遇到這個斷點時手動啟用一個或多個斷點。 一個典型的情況是我在調試單元測試時並不關心前面的測試。
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 result = a.add(b);
將是一個開始調試的自然場所。 現在假設錯誤位於Number::add
內部的某個地方,所以我們並沒有真正對在Numbers::add
中發生的事情感興趣。 我想要做的是在Numbers::add
中的某處設置一個斷點,只有當我在testAddNegativeNumber()
test中時才會觸發。
有沒有什么辦法來自動啟用斷點B
當斷點A
被打?
通過使用某個全局存儲來保存將啟用相關斷點的標記,即使不更改代碼,也可以獲取相關斷點。
我發現的最容易訪問的存儲之一是應用程序域自定義屬性。 它們可以通過System.AppDomain.CurrentDomain.GetData和SetData方法訪問。
因此,在第一個斷點上,您可以使用以下命令定義“命中時”設置:
{System.AppDomain.CurrentDomain.SetData( “破發”,真)}
在依賴斷點上,將命中條件設置為:
System.AppDomain.CurrentDomain.GetData(“break”)!= null
這是我認為你可以做到的最好的,但它甚至嘗試都是一個太大的黑客,因為它涉及添加一個變量......
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”)行停止,但您可以啟用或禁用斷點,這實際上將啟用另一個斷點。
請注意,條件斷點語句會在調試時嚴重降低應用程序的性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.