如何阻止VS2022附加调试器时拦截Trace输出?
解决VS2022调试时Trace消息无法输出到DebugView++的问题
可行,通过自定义TraceListener绕过VS调试器对Trace输出的拦截即可实现,具体步骤如下:
问题根源
VS附加调试器时,会自动修改DefaultTraceListener的行为,将Trace输出导向VS的Output窗口,而非系统调试输出(DebugView++监听的正是系统调试输出)。
解决方案
- 自定义TraceListener:直接调用底层
OutputDebugStringAPI发送消息,绕过VS的拦截逻辑。 - 替换默认TraceListener:在Logger类中清除原有监听器,添加自定义的监听器。
自定义TraceListener代码
using System.Diagnostics; using System.Runtime.InteropServices; public class DebugViewTraceListener : TraceListener { [DllImport("kernel32.dll", CharSet = CharSet.Auto)] private static extern void OutputDebugString(string message); public override void Write(string? message) { if (!string.IsNullOrEmpty(message)) { OutputDebugString(message); } } public override void WriteLine(string? message) { Write(message + Environment.NewLine); } }
修改后的Logger类
注意:原代码中静态构造函数名错误(应为Logger()而非Logging()),已修正:
using System.Runtime.CompilerServices; using System.Diagnostics; public static class Logger { readonly static TraceListener? listener = null; static Logger() { Trace.Listeners.Clear(); listener = new DebugViewTraceListener(); Trace.Listeners.Add(listener); Trace.AutoFlush = true; } public static void Trace(string message, [CallerMemberName] string callerName = "") { var msg = $"[TestProject|{callerName}] {message}"; System.Diagnostics.Trace.WriteLine(msg); } }
效果说明
修改后,无论VS是否附加调试器,Trace.WriteLine的消息都会通过OutputDebugString发送到系统调试输出,DebugView++可实时捕获;同时VS的Output窗口也会显示这些消息(若不需要VS显示,可在自定义TraceListener中添加调试器附加判断,跳过向VS输出,但通常无需此操作)。
内容的提问来源于stack exchange,提问作者AMG
相关产品推荐
相关产品推荐

