【问题标题】:Can output from OutputDebugString be viewed in Visual Studio's output window?可以在 Visual Studio 的输出窗口中查看 OutputDebugString 的输出吗?
【发布时间】:2011-03-03 16:07:08
【问题描述】:

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

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

我可以在DebugView 中看到来自OutputDebugString 的输出,但我想我会在Visual Studio 的输出窗口中看到它。我看过 在菜单工具下? 选项 ? 调试 ? 常规,并且输出不会被重定向到立即窗口。我还查看了菜单 Tools* ? 选项 ? 调试 ? 输出窗口和所有常规输出设置都设置为“开”。最后,我使用了输出窗口中的下拉列表来指定应该出现调试消息。

如果我更改菜单工具*? 选项 ? 调试 ? 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 编写的行(例如在我的简单示例中)不会进入调试窗口。此外,如果我使用不同的 TraceListener 写入 OutputDebugString(我从 Codeplex 的 Ukadc.Diagnostics 获得了一个),则该输出不会进入调试窗口。

关于 Ukadc.Diagnostics 跟踪侦听器的注意事项... Ukadc.Diagnostics 包含一些允许自定义输出格式的跟踪侦听器(类似于 log4net、NLog 和 LAB 中可用的格式)。因此,“仅”依赖于 Ukadc.Diagnostics 可以使用“标准”.NET 诊断日志记录,但我可以获得一些高级功能(如输出格式),而无需依赖可能更大的平台。在这种情况下,我可以使用 Ukadc.Diagnostics OutputDebugStringTraceListener 以与写入文件时相同的格式(如果需要,或不同的格式)将日志输出写入调试窗口。

请注意,我已经看到了这些问题,但它们没有提供有效的解决方案:

Herehere

【问题讨论】:

  • 问这个愚蠢的问题,你为什么不直接使用Debug.Write? (和朋友)
  • 最终我打算使用 System.Diagnostics 或其他一些日志记录平台。 System.Diagnostics 具有 TraceSource/TraceListener 架构,允许通过更改 app.config 文件来更改日志记录目标(文件、控制台、调试窗口等)。如果我使用 TraceSource.TraceEvent (或类似的)检测代码,那么只需将 TraceListener 更改为“OutputDebugString”侦听器,就可以在 VS 输出窗口中看到输出。请注意,如果我使用默认跟踪侦听器,则输出会转到输出窗口。

标签: c# debugging capture outputdebugstring


【解决方案1】:

你让我在这个问题上讨论了一段时间。没门!方式。

项目>属性>调试选项卡,打开“启用非托管代码调试”复选框。在更高版本的 VS 中重命名为“启用本机代码调试”。启用非托管代码调试引擎后,OutputDebugString() 输出现在被正确截取并定向到输出窗口。

【讨论】:

  • 就是这样!我在我的示例程序中更改了该设置,然后在我的原始程序中更改了它并在两个地方都修复了。接受这个答案,因为它是对的!
  • +1。我们正在使用一个本机 DLL,它通过 OutputDebugString 放置消息并且无法看到它们。
  • 我没有这个选项,他们移动了吗?
【解决方案2】:

调试时(Debug => Start Debugging F5),设置 项目+属性,调试选项卡,勾选“启用非托管代码调试” 效果很好。

当不调试时(调试 => 不调试 CTRL+F5 开始),您必须使用 SysInternals 库中的 DebugView。 Download DebugView for Windows v4.76

【讨论】:

    【解决方案3】:

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

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

    或者类似的东西。

    【讨论】:

    • 谢谢。我看了看,那个选项没有被选中。如果我检查它,我的输出也不会出现在立即窗口中。
    【解决方案4】:

    我有项目 > 属性 > 调试选项卡 > 勾选了“启用非托管代码调试”,但 OutputDebugString() 没有工作,即使断点可以工作。

    我还有解决方案>通用属性>项目依赖项>在我的C#项目下勾选了我的DLL,但构建依赖项不起作用。

    解决这两个问题的方法是解决方案 > 配置属性 > 在我的 DLL 上打勾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多