無法輸出訊息至 Visual Studio Output Window (輸出視窗)

同事想要 debug 某段程式碼,但不想中斷程式碼執行,並打算在執行過程中紀錄各個 method 實際執行的時間點。要符合同事的需求可以使用 log ,但如果透過 System.Diagnostics.Debug 或是 System.Diagnostics.Trace 來執行更簡單一點,不用安裝 log 套件也不需要設定

但同事使用上卻總是無法成功顯示 log 資訊,協助 debug 順手紀錄一下

關於 DebugTrace

  • 相同處

    1. 皆位於 System.Diagnostics 命名空間下
    2. 有相同方法

      • WriteLine
      • WriteLineIf
      • Indent
      • Unindent
      • Assert
      • Flush
    3. Debug Solution Configuration 時皆會輸出訊息

    4. 內容會輸出至 Visual Studio Output Windows 的 Debug 視窗中

      1outputdebug

    5. 可以透過新增 Listener 將訊息寫至其他目標

      • Console
      • 檔案
      • nlog
      • …..其他
    6. Listener 是共用的

      無論新增 Listener 至 Debug or Trace,還是都會蒐集 DebugTrace 訊息

  • 相異處

    1. Release Solution Configuration 下,預設只有 Trace 內容會被輸出

      可以透過 project properties 來修改

      2enabledebug

如何使用?

  1. 加入引用

    using System.Diagnostics;
    
  2. 加上所需 log

    • Debug

      Debug.WriteLine("Test");
      
    • Trace

      Trace.WriteLine("Test");
      

檢查相關設定

  1. 檢查訊息是輸出至 Output 視窗還是即時運算視窗

    • Visual Studio 主選單 Tools –> Options…

      3toolsoptions

    • Debugging –> Redirect all output window text to the immediate window

      4redirect

      • 想要在 Output 視窗看到訊息,請保持未選取的狀態
  2. 檢查專案設定

    • 專案 上按右鍵 –> Properties

      5properties

    • 選擇所需 Configuration –> Build tab –> 確認 “Define DEBUG constant” 及 “Define TRACE constant” 狀態

      6buildconfig

      • 預設 Debug configuariton :”Define DEBUG constant” 及 “Define TRACE constant” 都會勾選

        才可以使用 DebugTrace 輸出訊息

      • 預設 Realease configuariton :只有 “Define TRACE constant” 勾選

        才可以使用 Trace 輸出訊息

  3. 檢查 Output 視窗設定

    • Output 視窗 –> Show output from:Debug

      7outputdebug

    • Output 視窗空白處按右鍵 –> 勾選 Program output

      7programoutput

      • 預設所有選項都已勾選

        8allprogramoutput

其他原因?

經過一番檢查確認後,同事還是無法正確地輸出訊息到 output 視窗,後來看到 web.config 有用了 NLogTraceListener,猜測可能是 nlog 的設定問題,檢查 web.config

  • 原始 web.config

    <system.diagnostics>
        <sharedListeners>
            <add name="nlog" type="NLog.NLogTraceListener, NLog" />
        </sharedListeners>
        <trace autoflush="true">
        <listeners>
            <add name="nlog" />
            <remove name="Default" />
        </listeners>
        </trace>
    </system.diagnostics>
    
  • 需要移除 <remove name="Default" />

    這行設定將原本會將訊息輸出至 output 的行為移除了

    <system.diagnostics>
        <sharedListeners>
            <add name="nlog" type="NLog.NLogTraceListener, NLog" />
        </sharedListeners>
        <trace autoflush="true">
        <listeners>
            <add name="nlog" />
        </listeners>
        </trace>
    </system.diagnostics>
    

心得

這次除錯最大的心得就是團隊應該使用團隊成員有共識的專案設定及套件,避免其他同事接手時,為了小問題需要額外花費很多時間

參考資訊

  1. HOW TO: Visual C# .NET 中的 Trace 和 Debug 類別
  2. Debug.WriteLine shows nothing
  3. NLogTraceListener