debugging 有没有一种方法可以在C#中捕获调试消息,然后将它们输出到一个单独的窗口?

baubqpgj  于 2023-05-29  发布在  C#
关注(0)|答案(3)|浏览(235)

我花了三天时间查这个问题,但找不到一个确切的答案。我想捕获调试消息,然后将它们输出到列表日志。我正在尝试用C#来做这件事。希望社区能给我一些帮助,让我找到正确的方向。

fwzugrvs

fwzugrvs1#

当然有可能。调试输出不限于显示在“输出窗口”中。
您所要做的就是编写一个自定义侦听器并将其添加到Debug.Listeners collection。您可以找到有关添加跟踪侦听器here on MSDN的完整文档。
唯一需要注意的是,调试和跟踪输出的侦听器是共享的,因此如果添加一个侦听器,您将收到两种类型的消息。
如果这听起来工作量太大,而您只需要一个快速而肮脏的解决方案,那么您可以从Sysinternals下载免费的DebugView utility。这个简洁的小工具是您运行的一个单独的应用程序,它监听机器上安装的所有程序的所有调试输出。如果您使用它,您甚至不需要更改应用程序中的一行代码-发送到Debug.Write的所有输出都将显示在DebugView窗口中。
或者,如果您正在寻找一些长期的东西,甚至可能与您的应用程序一起发布,我鼓励您研究添加日志功能。有很多优秀的开源库提供了此功能,当您的应用部署到具有未知配置的系统时,它在现场可能是非常宝贵的。

bz4sfanl

bz4sfanl2#

就日志记录而言,Log4Net是可靠且易于使用的。您可以通过NuGet将其添加到您的项目中(如果您不知道NuGet是什么,请查看:真的很不错)。它允许你在任何你想要的地方或多或少地记录日志(控制台、文件、邮件、数据库...)
网站包含很好的文档和示例。

bqjvbblv

bqjvbblv3#

你当然可以System.Diagnostics.Debug类有一个Listeners成员,它是一个全局可读/可写的侦听器集合。
可以向此集合添加侦听器,以接收应用程序的所有调试输出。
此外,此集合中的第一个侦听器是实际执行调试输出打印的默认侦听器。因此,通过删除该侦听器,您甚至可以抑制调试输出。
下面是一个执行回调的函数,它将该回调生成的所有调试输出重定向到TextWriter.Null。你可以调整它以适应你的目的。(例如,使用一些TextWriter而不是TextWriter.Null。)

using System.Collections.Generic;
using SysIo = System.IO;
using SysDiag = System.Diagnostics;

    static T suppressDebugOutput<T>( Sys.Func<T> function )
    {
        Assert( SysDiag.Debug.Listeners.Count == 1 );
        var originalDebugTraceListener = SysDiag.Debug.Listeners[0];
        SysDiag.Debug.Listeners[0] = new SysDiag.TextWriterTraceListener( SysIo.TextWriter.Null );
        try
        {
            return function.Invoke();
        }
        finally
        {
            SysDiag.Debug.Listeners[0] = originalDebugTraceListener;
        }
    }

相关问题