2011-04-06 73 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的主菜单中的例外:调试 - >例外 - >选中要应用程序在(公共语言运行库)打破异常的类型......没有比这更好处理例外的方式。