我正在使用C#和Visual Studio 2010。
当我使用OutputDebugString
编写调试信息时,它应该显示在输出窗口中吗?
我可以在DebugView中看到OutputDebugString
的输出,但我想我会在Visual Studio的“输出”窗口中看到它。我看了
在菜单工具下? 选项? 调试? 常规,输出未被重定向到立即窗口。我也看了菜单工具*? 选项? 调试? 输出窗口和所有常规输出设置都设置为“开”。最后,我使用了Output窗口中的下拉列表来指定Debug消息应该出现。
如果我更改菜单工具*? 选项? 调试? 常规将输出重定向到立即窗口,OutputDebugString
消息不会出现在即时窗口中。
这是我的整个测试计划:
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");
}
}
}
如果我在调试器中运行,Debug.WriteLine
输出会显示在输出窗口中,但OutputDebugString
输出不显示。
如果我从控制台窗口运行,则Debug.WriteLine
和OutputDebugString
都会显示在DebugView中。
为什么OutputDebugString
输出不会出现在输出窗口中?
最终,我的意图不是用OutputDebugString
编写大量的调试输出,而是使用System.Diagnostics或NLog或类似的东西。我只是试图找出,如果我配置一个日志记录平台写入OutputDebugString
,输出将从调试器中可见。
我回到原始程序(不是上面的简单测试),它使用TraceSources
和TraceListeners
文件配置的app.config
和System.Diagnostics.DefaultTraceListener
。如果我将跟踪源配置为写入OutputDebugString
(记录为写入OutputDebugString
),则跟踪源输出将进入调试窗口。但是,直接用TraceListener
编写的行(例如在我的简单示例中)不要进入调试窗口。另外,如果我使用写OutputDebugString
的其他OutputDebugStringTraceListener
(我在Codeplex从Ukadc.Diagnostics获得一个),那么该输出不会进入调试窗口。
关于Ukadc.Diagnostics跟踪侦听器的一个注释... Ukadc.Diagnostics包含一些跟踪侦听器,允许自定义输出格式(类似于log4net,NLog和LAB中可用的格式)。因此,“仅”依赖于Ukadc.Diagnostics,可以使用“标准”.NET诊断日志记录,但我可以获得一些高级功能(如输出格式),而不依赖于可能更大的平台。在这种情况下,我可以使用Ukadc.Diagnostics {{1}}以与写入文件时相同的格式(如果需要或不同的格式)将日志输出写入调试窗口。
请注意,我已经看到了这些问题,但它们没有提供可行的解决方案:
答案 0 :(得分:36)
你让我讨论这个问题一段时间了。没门!方式。
项目>属性>在Debug选项卡中,打开“启用非托管代码调试”复选框。在以后的VS版本中重命名为“启用本机代码调试”。启用非托管代码调试引擎后,OutputDebugString()输出现在可以正确拦截并定向到“输出”窗口。
答案 1 :(得分:8)
调试时(Debug => Start Debugging F5),设置 Project + Properties,Debug选项卡,选中“启用非托管代码调试” 效果很好。
当没有调试时(Debug =>在没有调试CTRL + F5的情况下启动),你可以使用SysInternals库中的DebugView。 Download DebugView for Windows v4.76
答案 2 :(得分:3)
由于设置原因,它可能会在“立即窗口”中显示:
或者像那样的人。
答案 3 :(得分:1)
我有Project> Properties> Debug选项卡>勾选了“启用非托管代码调试”,但是let renderRow(squares) = <div>(squares |> Array.map(render) |> React.array)</div>;
即使断点也没有起作用。
我也有解决方案>通用属性>项目依赖项>在我的C#项目下勾选了我的DLL,但构建依赖项无效。
解决这两个问题的方法是解决方案>配置属性>在我的DLL上打勾。