OutputDebugString的输出能在Visual Studio的输出窗口中查看吗?

26

我正在使用C#和Visual Studio 2010。

当我使用OutputDebugString来写调试信息时,它应该出现在输出窗口中吗?

我可以在DebugView中看到OutputDebugString的输出,但我认为它应该出现在Visual Studio的输出窗口中。我已经在菜单下查看了 Tools ? Options ? Debugging ? General,并且输出没有被重定向到立即窗口。我还在菜单下查看了 Tools ? Options ? Debugging ? Output Window,所有常规输出设置都设置为“启用”。最后,我在输出窗口的下拉列表中指定Debug消息应该显示。

如果我改变菜单下的 Tools ? Options ? Debugging ? General 以将输出重定向到立即窗口,那么 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.WriteLineOutputDebugString都会显示在DebugView中。
为什么OutputDebugString输出从未显示在输出窗口中?
最终,我的目的不是使用OutputDebugString编写大量调试输出,而是使用System.Diagnostics或NLog等类似工具。 我只是想找出,如果我配置一个日志记录平台以将其写入OutputDebugString,那么输出是否会在调试器内可见。
我回到了原始程序(而不是上面的简单测试),它使用通过app.config文件配置的TraceSourcesTraceListeners。 如果我将跟踪源配置为写入System.Diagnostics.DefaultTraceListener(文档中记录为写入OutputDebugString),则跟踪源输出会进入调试窗口。 但是,直接使用OutputDebugString(例如在我的简单示例中)写入的行不会进入调试窗口。 此外,如果我使用另一个编写到OutputDebugStringTraceListener(我从Codeplex获取了一个来自Ukadc.Diagnostics的TraceListener),那么该输出也不会进入调试器窗口。
关于Ukadc.Diagnostics跟踪侦听器的一个注意事项... Ukadc.Diagnostics包含一些跟踪侦听器,允许自定义输出格式(类似于log4net、NLog和LAB中可用的格式)。 所以,只要有"唯一"的Ukadc.Diagnostics依赖项,就可以使用"标准".NET诊断日志记录,但我可以获得一些高级功能(如输出格式化),而不必依赖于可能更大的平台。 在这种情况下,我可以使用Ukadc.Diagnostics OutputDebugStringTraceListener将日志输出写入调试窗口,以与写入文件时相同的格式(如果需要,或者是不同的格式)。
请注意,我看到了这些问题,但它们没有提供有效的解决方案: Herehere

2
问一个愚蠢的问题,为什么你不只是使用 Debug.Write?(和它的伙伴们) - Rowland Shaw
2
最终我打算使用System.Diagnostics或其他日志平台。 System.Diagnostics具有TraceSource / TraceListener架构,允许通过更改app.config文件来更改日志记录目标(文件,控制台,调试窗口等)。如果我使用TraceSource.TraceEvent(或类似)来检测代码,那么只需将TraceListener更改为“OutputDebugString”侦听器即可在VS输出窗口中看到输出结果。请注意,如果我使用默认的跟踪侦听器,则输出会进入输出窗口。 - wageoghe
5个回答

38

在这个问题上你让我有些困惑。不可能吧!当然可以。

在项目 > 属性 > 调试选项卡中,选中“启用非托管代码调试”复选框。在后来的VS版本中改名为“启用本机代码调试”。启用非托管代码调试引擎后,OutputDebugString() 输出将被正确拦截并传递到“输出”窗口中。


1
就是这样!我在示例程序中更改了该设置,然后回到我的原始程序中,两个地方都修复了。接受这个答案,因为它是正确的! - wageoghe
3
我们正在使用一个本地DLL,它通过OutputDebugString发送消息,但我们无法看到它们。 - Celal Ergün
1
这个选项对我来说不在那里,他们把它移动了吗? - Daniel Ryan

9

在进行调试(Debug => Start Debugging F5)时,设置“项目+属性”,选择“调试”选项卡,勾选“启用非托管代码调试”即可。

如果不进行调试(Debug => Start Without Debugging CTRL+F5),则必须使用来自SysInternals库的DebugView。下载Windows v4.76版DebugView


3

由于设置问题,它可能显示在“立即窗口”中:

  • 转到“工具 / 选项 / 调试 / 一般”。取消选中“将所有输出窗口文本重定向到立即窗口”

或类似的操作。


谢谢。我查看了一下,那个选项没有被勾选。如果我勾选它,我的输出也不会出现在即时窗口中。 - wageoghe

1
我在项目的属性中勾选了“启用非托管代码调试”,但是OutputDebugString()没有工作,尽管断点起作用。
我还在解决方案的公共属性中勾选了我的C#项目下的DLL,但构建依赖关系没有起作用。
解决这两个问题的方法是在解决方案的配置属性中勾选我的DLL进行构建。

0

我曾经遇到过这个问题,但是在这个帖子中提出的所有解决方案都失败了。DebugView能够看到调试消息,但无论我如何配置,Visual Studio 2017都不能看到。启用本机代码调试?检查。没有重定向到“立即”?检查。项目未被排除在编译之外?检查。

最终,我通过使用Visual Studio Installer上的“修复”选项来解决了这个问题。大约花了10分钟才完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接