2008-12-11 71 views
57

我正在尋找.NET(2.0,特別是C#)源代碼的方式來觸發調試中斷,就好像在此時設置了斷點一樣,而不必記住在調試器中設置特定斷點並且不會干擾生產運行時。.NET源代碼可以硬編碼一個調試斷點嗎?

我們的代碼需要在生產中吞下異常,所以我們不會中斷連接到我們的客戶端應用程序,但我正在設置它,以便在出現這種錯誤時會彈出來進行分析在調試器中運行,否則將被安全忽略。

我嘗試使用Debug.Assert(false)已經不太理想,我假設Debug.Fail()的行爲方式是一樣的。它在理論上應該在生產中沒有任何作用,並且在調試時它會成功停止,但是通過設計,如果你想忽略那個錯誤,就沒有辦法繼續執行,就像你可以用一個實際的斷點,就像它會在我們吞下錯誤的生產中一樣。它顯然也打破了對變量狀態的評估,因爲調試器在本地系統代碼中實際停止運行,而在我們的系統代碼中停止運行,所以它的調試幫助是有限的。 (也許我錯過了一些回到事物的方式來看待變量等發生的地方???)

我希望有像Debug.Break(),但它似乎並不存在(除非可能在更高版本的.NET中),並且其他任何Debug方法都不適用。

更新:儘管ctacke的回答是我所尋找的最佳匹配,但我也從Debug.Assert()中發現了一個技巧 - 在調試器中運行時 - 暫停調試器,轉到Debug.Assert調用掛起的代碼(以綠色突出顯示,因爲它在框架代碼中處於關閉狀態),並按下Step-Out(shift-F11),然後在斷言對話框中單擊Ignore。這將使得調試器在斷言返回時暫停(並且能夠繼續執行,因爲它沒有發生,因爲它被忽略)。可能還有其他方法可以做同樣的事情(難道直接嘗試更直接嗎?),但這種方式很直觀。

回答

109

你可能是這樣的事情後:

if(System.Diagnostics.Debugger.IsAttached) 
    System.Diagnostics.Debugger.Break(); 

當然這仍然會在Release版本中編譯。如果你想讓它更象調試對象,其中的代碼只是一個發佈版本不存在,那麼你可以做這樣的事情:

[Conditional("DEBUG")] 
void DebugBreak() 
{ 
    if(System.Diagnostics.Debugger.IsAttached) 
    System.Diagnostics.Debugger.Break(); 
} 

然後在你的代碼的調用添加到它。

+2

你也可以使用#if DEBUG ... #endif代替 – 2008-12-12 02:52:56

+10

當然,但它比條件式更醜陋,因爲你必須用預編譯器指令來包裝每個調用方法。 – ctacke 2008-12-12 04:24:17

+0

澄清,從MSDN:`當標記爲有條件的方法被調用時,指定的預處理符號的存在或不存在決定是否包含或省略調用。如果定義了符號,則包含呼叫;否則,該調用被省略.`以及`條件方法必須是類或結構聲明中的方法,並且必須具有void類型的返回類型。' – Kiruse 2017-07-18 20:50:30

11

System.Diagnostics.Debugger.Break?

+0

(最初在2008年12月作爲另一個答案回覆,我知道我可以對自己的問題的答案發表評論):Ahhh,謝謝shahkalpesh。 System.Diagnostics.Debugger.Break()是一個好開始!這就是我在調試器而不是調試下所缺少的。它看起來會中斷並要求附加一個調試器,我可能想避免這種情況。但它看起來像... if(Debugger.IsAttached)Debugger.Break(); ......按照ctacke的建議,做我正在尋找的東西。 Debugger.Launch()可能適用於略有不同的場合,如果你想要一個調試器(如果沒有的話)。 – 2011-12-07 20:52:29

8

我遇到了一個情況,一旦這個地方沒有工作

System.Diagnostics.Debugger.Break(); 

但這並

System.Diagnostics.Debugger.Launch(); 
+0

如果調試器沒有連接,那麼你首先需要用Debugger.Launch()附加它,然後你可以使用Debugger.Break()。如果你想調試一個進程啓動另一個進程並且你想同時調試的解決方案,這是必要的。 – 2015-02-05 09:37:51

4

如何配置Visual Studio即使吞下它也會彈出調試程序?

這樣做:

  • 進入調試 - >例外...
  • 找到合適的異常,或增加它,如果它是你自己的
  • 檢查「時拋出」複選框例外

這將停在位置Visual Studio中拋出異常,不只是如果它沒有處理。

您可以查看更多信息here

+0

這是一個值得一提的技巧。它特別有助於確定問題首先發生的地方(並且仍然獲得成員狀態,而不僅僅是異常堆棧跟蹤?)。但在這種情況下,我希望信息來源提醒我們例外,我們並不特別期望發生並且不能設置。 – 2008-12-12 16:13:25

3

我發現一個不錯的技巧是將Debugger.Break()放入Exception的ctor中。

+0

酷招。當然,對於系統異常沒有好處,但我們可以使用我們自己的異常類型來嘗試,這取決於靜態成員或兩個靜態成員,因此我們可以打開和關閉它,並檢查Debugger.IsAttached;一個設置可能Break()/ Launch()即使沒有IsAttached,另一個只有它是。 – 2008-12-12 15:54:15

1

在Visual Studio 2010中,點擊Debug.Assert對話框中,重試會帶您進入失敗的調試斷言,就像您有斷點一樣。

4

如果你想擁有的代碼,而不是4只有一條線,包裝

#if DEBUG 
     if (Debugger.IsAttached) 
      Debugger.Break(); 
#endif 

public static class DebugHelper 
{ 
    [DebuggerHidden] 
    [Conditional("DEBUG")] 
    public static void Stop() 
    { 
     if (Debugger.IsAttached) 
      Debugger.Break(); 
    } 
} 

,並使用

DebugHelper.Stop(); 

DebuggerHiddenAttribute被添加到防止調試器停止Stop方法和fr的內部代碼om用F11進入方法。