2009-10-21 84 views
56

我應該可能已經知道這一點,但我不知道,我沒有看到它的記錄。System.Diagnostics.Debug.WriteLine在生產代碼

我在開發過程中經常使用System.Diagnostics.Debug.WriteLine,以便能夠在調試代碼時跟蹤對變量或異常的更改。這是爲了使開發和理解發生的事情更容易只有在開發過程中。我通常要麼註釋掉代碼,要麼在我投入生產時將其刪除。

我想知道如果我忘記評論代碼會發生什麼。例如,假設在開發週期中,我使用Debug.Write Line跟蹤可能記錄連接到輸出窗口的錯誤信息。這在開發過程中顯然是可以的,但是我想知道我是否能夠上場,如果這裏有風險。有人可以將調試器附加到我的活動可執行文件並捕獲此輸出嗎?還是僅僅在Visual Studio中產生輸出?

當我們從調試切換到發佈時呢?如果我們編譯發佈,此代碼是否會被編譯器忽略?

+1

謝謝大家誰回答。@Pil Devaney,@Mitch Wheat和@ Agent_9191在不同的措辭中都給出了幾乎相同的答案,所以我給你們投票,但我只能接受一個答案。我會和誰先回答,但這看起來是米爾奇和菲爾之間的一個聯繫,所以沒有進攻,米奇,但我會把它交給菲爾,他們的積分要低一些。 – David 2009-10-21 14:08:22

+0

對於搜索以下內容的其他人[發佈版本中的Debug.WriteLine](http://stackoverflow.com/questions/5419534/debug-writeline-in-release-build)也可能會令人感興趣。 – 2015-02-16 18:54:25

回答

66

Debug類中的所有成員都標有ConditionalAttribute,所以呼叫站點不會被編譯到發佈版本中。

+23

我希望每次同事發出帶有Debug版本的生產安裝程序時,我都有一美元。 – MusiGenesis 2009-10-21 14:30:38

17

System.Diagnostics.Debug只有在定義了「DEBUG」條件編譯符號時纔會出現方法調用。默認情況下,「DEBUG」符號僅爲調試版本定義。支持 ConditionalAttribute

編譯器忽略對 調用這些方法,除非「調試」被定義爲條件編譯 符號 。

+1

+1爲離開此處輸入代碼:) :) – 2012-07-12 23:15:51

11

由於調試方法對它們都有[Conditional(「DEBUG」)]屬性,如果您從Debug切換到Release,您將不必擔心它,因爲對這些方法的調用將被刪除與Release版本的其他優化)。

+2

更具體地說,不要定義'DEBUG'。如果你創建一個「Release」版本(最小符號,優化代碼等),但是定義了DEBUG,那麼調試方法仍然會被調用,對吧? – 2012-07-12 23:15:18

2

提供了編譯沒有/d:DEBUG選項或#define DEBUG,您的WriteLine調用不會實際存在於你的發佈代碼;任何第三方都無法從這些調用中恢復任何信息,因爲它們在發佈版本中實際上並不存在。

更多細節在這裏:當你在調試模式運行Debug Class (System.Diagnostics) on MSDN