簡體   English   中英

如果已經命中斷點A,則啟用斷點B.

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM