[英]Can output from OutputDebugString be viewed in Visual Studio's output window?
我正在使用 C# 和 Visual Studio 2010。
当我使用OutputDebugString
写入调试信息时,它是否应该显示在 output window 中?
我可以在DebugView的OutputDebugString
中看到 output,但我想我会在 Visual Studio 的 Output window 中看到它。 我在菜单工具下查看过? 选项? 调试? 一般,并且 output 不会被重定向到即时 window。 我还查看了菜单工具*? 选项? 调试? Output Window和所有常规 Output 设置设置为“开”。 最后,我使用了 Output window 中的下拉列表来指定应该出现调试消息。
如果我更改菜单工具*? 选项? 调试? 一般要将 output 重定向到即时 window, OutputDebugString
消息不会出现在即时 window 中。
这是我的整个测试程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace OutputDebugString
{
class Program
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern void OutputDebugString(string message);
static void Main(string[] args)
{
Console.WriteLine("Main - Enter - Console.WriteLine");
Debug.WriteLine("Main - Enter - Debug.WriteLine");
OutputDebugString("Main - Enter - OutputDebugString");
OutputDebugString("Main - Exit - OutputDebugString");
Debug.WriteLine("Main - Exit - Debug.WriteLine");
Console.WriteLine("Main - Exit - Console.WriteLine");
}
}
}
If I run within the debugger, the Debug.WriteLine
output does show up in the output window, but the OutputDebugString
output does not.
如果我从控制台 window 运行,DebugView 中会同时显示Debug.WriteLine
和OutputDebugString
。
为什么OutputDebugString
output 从未出现在 output window 中?
最终,我的意图不是用OutputDebugString
编写大量调试 output ,而是使用 System.Diagnostics 或 NLog 或类似的东西。 我只是想知道,如果我将日志平台配置为写入OutputDebugString
,output 在调试器中是否可见。
我回到我的原始程序(不是上面的简单测试),它使用通过app.config
文件配置的TraceSources
和TraceListeners
。 如果我将跟踪源配置为写入System.Diagnostics.DefaultTraceListener
(记录为写入OutputDebugString
),那么跟踪源 output DOES go 到调试 Z05B8C35CBD962FBF2427C。 但是,直接使用OutputDebugString
写入的行(例如在我的简单示例中)不会 go 到调试 window。 此外,如果我使用不同的TraceListener
写入OutputDebugString
(我从 Codeplex 的 Ukadc.Diagnostics 获得了一个),则 output 不会 go 到调试 Z05B8C74CBD9706FFBF2F4DE4C1。
关于 Ukadc.Diagnostics 跟踪侦听器的注释... Ukadc.Diagnostics 包含一些跟踪侦听器,允许自定义 output 格式(类似于 log4net、NLog 和 LAB 中可用的格式)。 因此,“仅”依赖于 Ukadc.Diagnostics 可以使用“标准”.NET 诊断日志记录,但我可以获得一些高级功能(如 output 格式),而无需依赖可能更大的平台。 在这种情况下,我可以使用 Ukadc.Diagnostics OutputDebugStringTraceListener
将日志记录 output 以与写入文件时相同的格式(如果需要,或不同的格式)写入调试 window。
请注意,我已经看到了这些问题,但它们没有提供有效的解决方案:
你让我在这个问题上问了一段时间。 没门! 道路。
项目 > 属性 > 调试选项卡,打开“启用非托管代码调试”复选框。 在更高的 VS 版本中重命名为“启用本机代码调试”。 启用非托管代码调试引擎后,OutputDebugString() 输出现在可以正确拦截并定向到输出窗口。
调试时(调试 => 开始调试 F5),设置项目 + 属性,调试选项卡,选中“启用非托管代码调试”效果很好。
当不调试时(调试 => 开始而不调试 CTRL+F5),您必须使用 SysInternals 库中的 DebugView。 下载 DebugView for Windows v4.76
由于设置,它可能会显示在“立即窗口”中:
或者类似的东西。
我有项目 > 属性 > 调试选项卡 > 勾选了“启用非托管代码调试”,但即使断点起作用, OutputDebugString()
也不起作用。
我也有解决方案 > 通用属性 > 项目依赖 > 在我的 C# 项目下勾选了我的 DLL,但构建依赖项不起作用。
解决这两个问题的方法是解决方案> 配置属性> 在我的 DLL 上勾选构建。
我曾经遇到过这个问题,并且该线程中建议的所有解决方案都失败了。 DebugView 能够看到调试消息,而 Visual Studio 2017 却不能,无论我如何尝试配置它。 启用本机代码调试? 查看。 没有重定向到“立即”? 查看。 项目没有从编译中排除? 查看。
最终,我在安装时使用“修复”选项通过 Visual Studio 安装程序解决了问题。 花了大约10分钟完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.