2012-10-03 65 views
2

我有這個問題,一直給我一天的大部分時間,然後一些悲傷。
基本上我的Debug.WriteLine工作了一下,然後神奇地停止了輸出。調試器仍在工作,因爲我可以在線上放置一個斷點,並且它會中斷,我可以跨越Debug.WriteLine並觀察它不輸出。vs2010 Debug.WriteLine停止工作

現在我已經檢查了我能想到的所有東西。我試圖從各個崗位的東西,如

Debug.Writeline is Not printing anything

Debug.Writeline stops working

Visual Studio 2010 suddenly stops displaying Debug output

,但沒有奏效。澄清

  • 我正在使用vs2010 pro sp1。
  • 這些項目使用.net4框架。
  • 我有調試常量集。
  • 調試器仍然附加,因爲我可以設置斷點,它們被擊中。
  • 這兩個項目都設置爲建立在「任何CPU」(我試過既爲X86並沒有幫助)
  • 我在Windows 7 64位

以及所有下面的建議後運行,我沒有修復。上述那些帖子都沒有得到真正的答覆。

那麼,如何解決這個問題?

我想我會創建一個單獨的解決方案來重現此問題。

您可以下載我的解決方案,在這裏再現https://drive.google.com/uc?export=download&confirm=&id=0B0SLafLeQj5GOGxORThMWWhYV28

所以我做了2級窗口的應用程序的bug,並設定他們都開始在同一時間。在每個應用程序中,我啓動一個線程,並在線程中執行Debug.WriteLine

它似乎會導致某種死鎖並停止寫入輸出。這似乎是Visual Studio中的一個錯誤,我對此非常驚訝。我是否應該相信,有兩個線程在同一時間執行Debug.WriteLine的項目是不可能的?

再次,我需要一種解決方法,仍然得到調試輸出。 哦,我也嘗試了將輸出重定向到即時窗口的選項,但都沒有成功。

回答

5

在視覺工作室似乎有一個錯誤。我使用.net反射器挖掘CLR並發現它的鎖定似乎只能在每個進程級別上工作。所以當你只有1個項目運行時,DefaultTraceListener看起來可以很好地與Multithreading一起工作,但是隻要你有多個項目運行它就會造成某種死鎖並停止工作。

我通過爲Debug.WriteLine創建一個封裝器來解決這個問題,然後我實現了一個Global Mutex作爲鎖定寫入的鎖。互斥體是一個win32互斥體的包裝,因此可以跨越系統的流程級別工作。

看到這裏我的代碼,我把一個IIb類,我在這兩個項目的參考,而使用普通的Debug.WriteLine下System.Diagnostics程序裏面:

public class Debug 
{ 
    #if DEBUG 
     private static readonly Mutex DebugMutex =new Mutex(false,@"Global\DebugMutex"); 
    #endif 

    [Conditional("DEBUG")] 
    public static void WriteLine(string message) 
    { 
     DebugMutex.WaitOne(); 
     System.Diagnostics.Debug.WriteLine(message); 
     DebugMutex.ReleaseMutex(); 
    } 

    [Conditional("DEBUG")] 
    public static void WriteLine(string message, string category) 
    { 
     DebugMutex.WaitOne(); 
     System.Diagnostics.Debug.WriteLine(message,category); 
     DebugMutex.ReleaseMutex(); 
    } 

} 

希望這有助於!

駿馬。

+0

你是我的英雄!這一直折磨着我的年份! –

5

驗證輸出窗口的上下文菜單是否已選中「程序輸出」。我的調試語句沒有跟蹤。即使我沒有取消選中該選項,該選項仍未被選中。檢查它爲我修好了。

+0

我正在尋找相同的問題,這正是爲什麼我的輸出消息不見了 - 謝謝:) –

+0

修復了我的問題。我想我一定是在輸出窗口中點擊時意外切換了它。 –