简体   繁体   English

可以在 Visual Studio 的 output window 中查看 OutputDebugString 中的 output 吗?

[英]Can output from OutputDebugString be viewed in Visual Studio's output window?

I am using C# and Visual Studio 2010.我正在使用 C# 和 Visual Studio 2010。

When I use OutputDebugString to write debug information, should it show up in the output window?当我使用OutputDebugString写入调试信息时,它是否应该显示在 output window 中?

I can see the output from OutputDebugString inDebugView , but I thought I would see it in Visual Studio's Output window.我可以在DebugViewOutputDebugString中看到 output,但我想我会在 Visual Studio 的 Output window 中看到它。 I have looked under menu Tools ?我在菜单工具下查看过? Options ?选项 Debugging ?调试 General , and the output is NOT being redirected to the Immediate window.一般,并且 output 不会被重定向到即时 window。 I have also looked under menu Tools*?我还查看了菜单工具*? Options ?选项 Debugging ?调试 Output Window and all General Output Settings are set to "On". Output Window和所有常规 Output 设置设置为“开”。 Finally, I have used the drop-down list in the Output window to specify that Debug messages should appear.最后,我使用了 Output window 中的下拉列表来指定应该出现调试消息。

If I change menu Tools*?如果我更改菜单工具*? Options ?选项 Debugging ?调试 General to redirect the output to the Immediate window, the OutputDebugString messages do not appear in the immediate window.一般要将 output 重定向到即时 window, OutputDebugString消息不会出现在即时 window 中。

Here is my entire test program:这是我的整个测试程序:

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. If I run within the debugger, the Debug.WriteLine output does show up in the output window, but the OutputDebugString output does not.

If I run from a console window, both Debug.WriteLine and OutputDebugString show up in DebugView.如果我从控制台 window 运行,DebugView 中会同时显示Debug.WriteLineOutputDebugString

Why doesn't the OutputDebugString output ever show up in the output window?为什么OutputDebugString output 从未出现在 output window 中?

Ultimately, my intent is not to write a lot of debug output with OutputDebugString , rather I will use System.Diagnostics or NLog or something similar.最终,我的意图不是用OutputDebugString编写大量调试 output ,而是使用 System.Diagnostics 或 NLog 或类似的东西。 I am just trying to find out, if I configure a logging platform to write to OutputDebugString , will the output be visible from within the debugger.我只是想知道,如果我将日志平台配置为写入OutputDebugString ,output 在调试器中是否可见。

I went back to my original program (not the simple test above) which uses TraceSources and TraceListeners configured via the app.config file.我回到我的原始程序(不是上面的简单测试),它使用通过app.config文件配置的TraceSourcesTraceListeners If I configure the trace sources to write to the System.Diagnostics.DefaultTraceListener (which is documented as writing to OutputDebugString ), then the trace source output DOES go to the debug window.如果我将跟踪源配置为写入System.Diagnostics.DefaultTraceListener (记录为写入OutputDebugString ),那么跟踪源 output DOES go 到调试 Z05B8C35CBD962FBF2427C。 However, lines that write directly with OutputDebugString (such as in my simple example) DO NOT go to the debug window.但是,直接使用OutputDebugString写入的行(例如在我的简单示例中)不会 go 到调试 window。 Also, if I use a different TraceListener that writes to OutputDebugString (I got one from Ukadc.Diagnostics at Codeplex), that output DOES NOT go to the debug window.此外,如果我使用不同的TraceListener写入OutputDebugString (我从 Codeplex 的 Ukadc.Diagnostics 获得了一个),则 output 不会 go 到调试 Z05B8C74CBD9706FFBF2F4DE4C1。

One note about the Ukadc.Diagnostics trace listener... Ukadc.Diagnostics contains some trace listeners that allow for custom formatting of output (similar to the formatting that is available in log4net, NLog, and LAB).关于 Ukadc.Diagnostics 跟踪侦听器的注释... Ukadc.Diagnostics 包含一些跟踪侦听器,允许自定义 output 格式(类似于 log4net、NLog 和 LAB 中可用的格式)。 So, with "only" a dependency on Ukadc.Diagnostics one can use "standard" .NET diagnostic logging, but I can get some advanced features (like the output formatting) without becoming dependent on a possibly much larger platform.因此,“仅”依赖于 Ukadc.Diagnostics 可以使用“标准”.NET 诊断日志记录,但我可以获得一些高级功能(如 output 格式),而无需依赖可能更大的平台。 In this case, I could use the Ukadc.Diagnostics OutputDebugStringTraceListener to write logging output to the debug window in the same format (if desired, or a different format) as it would be if written to a file.在这种情况下,我可以使用 Ukadc.Diagnostics OutputDebugStringTraceListener将日志记录 output 以与写入文件时相同的格式(如果需要,或不同的格式)写入调试 window。

Note that I have seen these questions, but they did not provide a working solution:请注意,我已经看到了这些问题,但它们没有提供有效的解决方案:

Here and here 这里这里

You had me going on this question for a while.你让我在这个问题上问了一段时间。 No way!没门! Way.道路。

Project > Properties > Debug tab, turn on the "Enable unmanaged code debugging" checkbox.项目 > 属性 > 调试选项卡,打开“启用非托管代码调试”复选框。 Renamed to "Enable native code debugging" in later VS versions.在更高的 VS 版本中重命名为“启用本机代码调试”。 With the unmanaged code debugging engine enabled, OutputDebugString() output is now properly intercepted and directed to the Output window.启用非托管代码调试引擎后,OutputDebugString() 输出现在可以正确拦截并定向到输出窗口。

When debuggging (Debug => Start Debugging F5), the setting Project + Properties, Debug tab, check "Enable unmanaged code debugging" works nicely.调试时(调试 => 开始调试 F5),设置项目 + 属性,调试选项卡,选中“启用非托管代码调试”效果很好。

When NOT debugging (Debug => Start Without Debugging CTRL+F5) you mujst use DebugView from the SysInternals library.当不调试时(调试 => 开始而不调试 CTRL+F5),您必须使用 SysInternals 库中的 DebugView。 Download DebugView for Windows v4.76下载 DebugView for Windows v4.76

It might be showing in the "Immediate Window" instead due to a setting:由于设置,它可能会显示在“立即窗口”中:

  • Go to Tools/Options/Debugging/General.转到工具/选项/调试/常规。 Uncheck "Redirect all Output Window text to the Immediate Window"取消选中“将所有输出窗口文本重定向到立即窗口”

Or somethig like that.或者类似的东西。

I had Project > Properties > Debug tab > ticked the "Enable unmanaged code debugging" but OutputDebugString() didn't work even though breakpoints did.我有项目 > 属性 > 调试选项卡 > 勾选了“启用非托管代码调试”,但即使断点起作用, OutputDebugString()也不起作用。

I had also Solution > Common Properties > Project Dependencies > ticked my DLL under my C# project but build dependencies didn't work.我也有解决方案 > 通用属性 > 项目依赖 > 在我的 C# 项目下勾选了我的 DLL,但构建依赖项不起作用。

The fix for both these issues was to Solution > Configuration Properties > tick build on my DLL.解决这两个问题的方法是解决方案> 配置属性> 在我的 DLL 上勾选构建。

I had this problem once and all solutions suggested in this thread failed.我曾经遇到过这个问题,并且该线程中建议的所有解决方案都失败了。 DebugView was able to see debug messages, Visual Studio 2017 wasn't, no matter how I tried to configure it. DebugView 能够看到调试消息,而 Visual Studio 2017 却不能,无论我如何尝试配置它。 Enable native code debugging?启用本机代码调试? Check.查看。 No redirect to "immediate"?没有重定向到“立即”? Check.查看。 Project is not excluded from compilation?项目没有从编译中排除? Check.查看。

Eventually I solved issue via Visual Studio Installer by using "Repair" option on my installation.最终,我在安装时使用“修复”选项通过 Visual Studio 安装程序解决了问题。 Took about 10 minutes to complete.花了大约10分钟完成。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM