2011-04-06 97 views
5

我已經創建了一個調試聽者重定向從調試/控制檯窗口到文件輸出(帶有調用棧)調試輸出重定向到一個文件,使用以下代碼:問題使用跟蹤偵聽

void SomeMethod() 
{ 
    // Create a file for output .txt. 
    Stream debugFile = File.Create(fileName); 

    // create TextWriterTraceListener named "file" 
    TextWriterTraceListener debugWriter = new TextWriterTraceListener(debugFile, "file"); 

    // add to debug listeners 
    Debug.Listeners.Add(debugWriter); 
    // set callstack to be shown 
    Debug.Listeners["file"].TraceOutputOptions |= TraceOptions.Callstack; 
    // set auto-flush 
    Debug.AutoFlush = true; 
} 

但輸出不會重定向到我指定的文件,它總是空的。

我從我的主窗體中的構造函數調用它。是我從一個問題中調用它的地方?

我在這裏想要實現的是將調試輸出窗口中的異常放置在具有調用堆棧的文件中,以便我可以找到並更正它們。

UPDATE:經過一番研究,我得出這樣添加新TraceListener到Debug Listeners收集不重定向從調試/控制檯輸出結論。它實際上只是響應Write,WriteLine等方法,就像缺省偵聽器一樣。 問題仍然存在:如何捕獲Debug/Console窗口的輸出以及如何獲取出現在那裏的異常的堆棧跟蹤?

任何人有任何想法?

+0

你確定你應該添加到Debug.Listeners?調用Console.WriteLine和Debug.WriteLine會產生不同的行爲。如果您將偵聽器添加到調試中,但調用控制檯,則可能會導致您正在報告的問題。 – JustLoren 2011-04-06 15:21:07

+0

@JustLoren - 我不確定你的意思。我在這裏要做的是在Visual Studio的調試控制檯窗口中將相同的輸出傳輸到一個文件,但是對於發生的每個異常都有一個調用堆棧。 – TheBoyan 2011-04-06 15:27:53

+0

您應該嘗試通過調用您的函數來設置它,然後調用Debug.WriteLine(「Debugger Initialized」)來手動寫入您的Debug偵聽器。這應該驗證一切正常。如果您只是依賴框架,則無法確定輸出窗口實際正在監聽哪個流。 – JustLoren 2011-04-06 15:29:18

回答

2

下面是回答我的問題的一部分的文章: http://www.codeproject.com/KB/trace/DbMonNET.aspx

即如何捕捉調試/控制檯窗口的輸出。但是,似乎沒有辦法從這個輸出獲取堆棧跟蹤。無論如何,從這個角度來看,它看起來像一個壞方法。

進一步的研究:看起來像這些異常出現,因爲它們在一些其他dll中處理,但沒有正確鏈接,他們在那裏處理,而不是我的try/catch塊。這可能是我應該看到我的錯誤的地方,即有一個dll引用,我應該添加一個項目引用。

更多的研究:啓用打破在Visual Studio的主菜單中的例外:調試 - >例外 - >選中要應用程序在(公共語言運行庫)打破異常的類型......沒有比這更好處理例外的方式。