簡體   English   中英

在發布配置中運行時,是否應該在Visual Studio的輸出窗口中看到調試輸出?

[英]Should I see debug outputs In Visual Studio's output window when running in a release configuration?

我想知道在發布模式下運行時是否會在Debug輸出中看到任何內容?

下圖是我在Release配置中運行時輸出窗口的屏幕截圖。 在此處輸入圖片說明

看到調試的東西使我覺得我實際上不是在運行發行版編譯器,是否可以確定我確實在運行發行版模式?

簡短答案

這些似乎是Trace消息 ,而不是Debug消息 ,因此它們甚至出現在發行版中。

長答案

讓我們通過在這里研究術語“調試”的各種上下文含義來了解發生了什么。

“調試”構建配置

首先,在Visual Studio中具有“ Debug”和“ Release”選項的下拉菜單的上下文。 這些選項是構建配置 要了解此選項的重要性,請雙擊項目的“屬性”節點,然后轉到“構建”頁面。

C#項目屬性中的“生成”頁面

該頁面(以及其他一些頁面)可以具有特定於特定構建配置的設置。 您可以通過頁面上的下拉菜單查看每個配置的設置(默認為您當前使用的任何構建配置)。

名稱“ Debug”和“ Release”沒有什么特別的-這些只是默認配置,具有針對這些方案的默認設置。 您可以更改配置的設置。 您也可以定義自己的構建配置,但這超出了此答案的范圍。 最后,這些設置也可以由類似的目標平台(例如“ AnyCPU”,“ x86”等)進行參數設置,但是對於此答案,我將假定所有構建都使用相同的平台設置。

“ DEBUG”條件編譯符號

C#具有條件編譯功能-能夠根據編譯時已定義或未定義的符號來編譯代碼的不同部分。 例如,如果定義了MY_SYMBOL_NAME ,則此常數的值為“ A”,否則為“ B”。

        public const string MyConst =
#if MY_SYMBOL_NAME
      "A";
#else
      "B";
#endif

項目“構建”頁面上的前三個設置控制這些符號。 特別是“ Define DEBUG常量”和“ Define TRACE常量”,它們實際上是指編譯符號。 通過檢查這些內容,所選的構建設置將分別使用定義的DEBUGTRACE符號進行編譯。

默認情況下,“ Debug”和“ Release”配置都定義TRACE ,但恰好只有“ Debug”定義DEBUG

Debug

條件編譯專門擴展到System.Diagnostics.DebugSystem.Diagnostics.Trace類的成員:僅在定義了適當的符號時,才編譯對這些類的方法的調用。 所以這:

Debug.WriteLine("!");

被這樣對待:

#if DEBUG
    Debug.WriteLine("!");
#endif

這些方法寫入所謂的“跟蹤偵聽器”, 可以在代碼或應用程序配置文件中對其進行配置

因此,如果您看到的文本是通過調用Trace編寫的,那么即使在Release配置中,您仍然會看到它。 當然,這意味着此日志記錄將保留在出廠版本中,除非您明確禁用“定義TRACE常量”設置。

開始調試與不進行調試就開始

那么,為什么Visual Studio仍會顯示這些內容? 因為有“調試”之一, 更多的含義:你是否已經開始與Visual Studio的調試器的應用程序連接,還是不行。 VS的“調試”菜單欄中列出了兩個啟動選項:“啟動調試”和“不調試啟動”。 這與您使用的構建配置正交:您可以在不連接調試器的情況下運行Debug構建,並且可以在連接調試器的情況下運行Release構建(盡管這樣做可能沒有幫助,因為在某些情況下可能不會遇到斷點例)。

使用調試器時,“輸出”窗口將顯示寫入默認跟蹤偵聽器的消息。 這被標記為“調試”,但其中包含所有內容,包括對Trace調用(默認情況下包含在Release版本中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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