debugging 是否可以在Visual Studio的输出窗口中查看OutputDebugString的输出?

cpjpxq1n  于 2022-11-14  发布在  其他
关注(0)|答案(5)|浏览(286)

我使用的是C#和Visual Studio 2010。
当我使用OutputDebugString写入调试信息时,它是否应该显示在输出窗口中?
我可以在DebugView中看到OutputDebugString的输出,但我想我应该在Visual Studio的“输出”窗口中看到它。我已经在菜单 * 工具 选项 调试 常规 * 下查看了,并且输出没有被重定向到“实时计算”窗口。我还查看了“工具”菜单下的“ 选项 调试 输出窗口 * 并且所有的GeneralOutput设置都设置为“On”。最后,我使用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.WriteLineOutputDebugString都会显示在DebugView中。
为什么OutputDebugString输出从来没有出现在输出窗口中?
最后,我的意图不是用OutputDebugString写很多调试输出,而是使用System.Diagnostics或NLog或类似的东西。我只是想弄清楚,如果我配置一个日志平台来写OutputDebugString,在调试器中是否可以看到输出。
我回到了我原来的程序(不是上面的简单测试),它使用通过app.config文件配置的TraceSourcesTraceListeners。(记录为写入OutputDebugString),则跟踪源输出会进入调试窗口。但是,直接用OutputDebugString写的行(比如我的简单例子)不会进入调试窗口。同样,如果我使用另一个写OutputDebugStringTraceListener(我从Codeplex的Ukadc.Diagnostics得到了一个),输出也不会进入调试窗口。
关于Ukadc.Diagnostics跟踪侦听器需要注意一点... Ukadc.Diagnostics包含一些允许自定义输出格式的跟踪侦听器(类似于log4net、NLog和LAB中可用的格式)。因此,“仅”依赖于Ukadc.Diagnostics,可以使用“标准”.NET诊断日志记录,但我可以得到一些高级功能而不依赖于可能大得多的平台。在这种情况下,我可以使用Ukadc.Diagnostics OutputDebugStringTraceListener将日志输出以与写入文件时相同的格式(如果需要,也可以是不同的格式)写入调试窗口。
请注意,我看到了这些问题,但它们没有提供有效的解决方案:
Herehere的函数

eulz3vhy

eulz3vhy1#

你让我在这个问题上纠结了一阵子。没门!没门。
项目〉属性〉调试选项卡,打开“启用非托管代码调试”复选框。在更高的VS版本中重命名为“启用本机代码调试”。在启用非托管代码调试引擎的情况下,OutputDebugString()输出现在可以被正确拦截并定向到“输出”窗口。

0s0u357o

0s0u357o2#

调试时(Debug =〉Start Debugging F5),设置项目+属性,调试选项卡,选中“启用非托管代码调试”可以很好地工作。
当不调试时(调试=〉启动但不调试CTRL+F5),您必须使用SysInternals库中的DebugView。Download DebugView for Windows v4.76

9q78igpj

9q78igpj3#

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

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

或者类似的东西。

0lvr5msh

0lvr5msh4#

我让Project〉Properties〉Debug tab〉勾选了“启用非托管代码调试”,但是OutputDebugString()不起作用,即使断点起作用了。
我也让Solution〉Common Properties〉Project Dependencies〉在我的C#项目下选中了我的DLL,但是构建依赖项不起作用。
解决这两个问题的方法是:“解决方案”〉“配置属性”〉“在我的DLL上构建”。

q5lcpyga

q5lcpyga5#

我曾经遇到过这个问题,并且在此线程中建议的所有解决方案都失败了。DebugView能够看到调试消息,而Visual Studio 2017却不能,无论我如何尝试配置它。启用本机代码调试?选中。不重定向到“立即”?选中。项目不从编译中排除?选中。
最终,我通过VisualStudio安装程序在我的安装上使用“修复”选项解决了这个问题。大约花了10分钟完成。

相关问题