【问题标题】:Writing to output window of Visual Studio写入 Visual Studio 的输出窗口
【发布时间】:2023-03-24 17:20:02
【问题描述】:

我正在尝试将消息写入输出窗口以进行调试。我搜索了一个像 Java 的 system.out.println("") 这样的函数。我试过Debug.WriteConsole.WriteTrace.Write。它不会给出错误,但也不会打印任何内容。

“定义调试常量”和“定义跟踪常量”选项被选中。

菜单工具选项调试“将所有输出窗口文本重定向到立即窗口” 选项未选中。

配置:激活(调试)

注意:如果相关,我使用向导创建了一个项目作为“Windows 窗体应用程序”。我不知道去哪里找。

【问题讨论】:

  • 由于这是一篇较旧的帖子,因此我会将其添加为评论,以供偶然发现该问题的人使用。除了实际更改代码之外,您还可以使用称为跟踪点的特殊断点。见MSDN documentation
  • 只是提醒一下,Debug.WriteLine() 仅在 Debug 中运行时才有效。这意味着使用 F5 而不是 CTRL-F5 运行它。这很容易错过。
  • 没错,但一个方便的工具是DebugView,当在调试器之外运行时,它会显示调试流的所有输出
  • 如果您尝试编写在 Visual Studio 测试框架下运行的单元测试的输出,则规则略有不同,请参阅this answer 了解详细信息。
  • 只是为了添加@kirk.burleson 所做的评论;如果您在库中使用Debug.Write,并且在发布模式下构建库(这通常是 nuget 包的情况),那么即使您在调试模式下运行测试/应用程序,它也不会记录。我建议Trace.Write 作为替代方案

标签: c# visual-studio-2010 visual-studio debugging


【解决方案1】:

添加System.Diagnostics命名空间,然后就可以使用Debug.WriteLine()快速打印消息到IDE的输出窗口。有关详细信息,请参阅以下内容:

【讨论】:

  • 谢谢。我假设如果我在没有调试的情况下开始(ctrl-f5)就无法写入输出,对吗?
  • 我猜你在找这个:stackoverflow.com/questions/562590/…
  • 再次感谢,但这对我不起作用。即使定义了 TRACE 常量,跟踪也不会在没有调试模式的情况下打印。
  • 刚刚在这里运行了一个小应用程序,对我来说很好用。也许您的环境中存在小故障?
  • 这是我的测试代码; pastebin.com/b7P0bYEa 这很简单,但仍然没有。我会在另一个系统上试试。
【解决方案2】:

这将写入调试输出窗口:

using System.Diagnostics;

Debug.WriteLine("Send to debug output.");

【讨论】:

  • 对我来说这个“输出”到即时窗口
  • 我在一组单元测试中试过这个。我调试了选定的测试,但在调试窗口中没有任何我试图打印的内容。
  • 这确实输出到调试窗口,但是,只有在我关闭网页之后。我希望在执行代码时立即显示。等一下 - 我发现在代码执行时输出窗口是隐藏的。如果我显示窗口,我的输出就在那里。
  • 我们可以保留在调试窗口中打印的这条消息的日志吗?或者 Visual Studio 是否提供任何方式来访问调试窗口的日志..?
【解决方案3】:
Debug.WriteLine

就是你要找的。​​p>

如果没有,请尝试这样做:

菜单工具选项调试 → 取消选中立即发送输出

【讨论】:

  • 可能 Debug.Write() 没有插入回车,所以消息被缓冲了?
  • 我没有看到 Debug.WriteLine("String") 直到我按照 Micah 所说的去做。 Tools|Options|Debugging uncheck Send Output to Immediate
  • 我认为在以后的版本中,复选框是“将所有输出窗口文本重定向到即时窗口”
  • 在 VS 2015 中它被称为:“将所有输出窗口文本重定向到立即窗口”,以防万一,有些人不得不寻找 5 分钟才能找到合适的设置:) - 我向上滚动并向下查找以“发送...”开头的选项 :)
【解决方案4】:

对我来说,只有 Trace 命名空间而不是 Debug 命名空间有效:

System.Diagnostics.Trace.WriteLine("message");

我在 Visual Studio 2010 下的 C# 项目中工作。

【讨论】:

  • 我正在使用 VS 2013 Professional 并尝试使用 Visual Studio 单元测试框架从单元测试中获取输出。看来测试工具捕获并重定向 Debug.WriteLine 但不是 Trace.WriteLine。除非您调试测试(而不仅仅是运行它们),否则您也不会看到 Trace 输出。
【解决方案5】:

您可能正在寻找

MessageBox.Show()

Debug.Writeline()

【讨论】:

  • MessageBox.Show() 在您想写入多个值以进行调试时可能会非常烦人。
  • 问题是“正在写入 Visual Studio 的输出窗口?”不要到消息框。
  • @AmirTwito 消息框是一个输出窗口。
  • 是的,你说得对,但问题是“正在写入 Visual Studio 的输出窗口?”而不是使用此代码的简单消息框:MessageBox.Show()
  • @ProfK Visual Studio 输出窗口 是特定程序的一个非常特定的 GUI 元素,MessageBox.Show 不会写入它。
【解决方案6】:

电话

System.Diagnostics.Debug.WriteLine("message");

使用 .NET Core(V 1.0 或 1.1)时失败。

我们应该创建和使用来自Microsoft.Extensions.Logging 的记录器,但该记录只出现在 dotnet.exe 弹出控制台窗口中,而不出现在 Visual Studio 的输出窗口中。

【讨论】:

  • 所以 Debug.WriteLine()、Console.WriteLine() 和 Trace.WriteLine() 没有在 .Net Core 的输出中输出任何内容?有什么方法可以使用某种简单的日志记录而无需编写 Logclass?已在“工具”>“选项”>“调试”中搜索并检查了“显示输出自:”以获取可能的解决方案。
【解决方案7】:

这需要一个第三方框架,即Serilog,但我仍然发现它是一种非常流畅的体验,可以将输出输出到我可以看到的某个地方。

首先需要安装 Serilog 的Trace sink。安装后,您需要像这样设置记录器:

Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Trace()
    .CreateLogger();

(您可以设置不同的最低级别或将其设置为配置值或任何正常的 Serilog 功能。您还可以将 Trace 记录器设置为特定级别以覆盖配置,或者您想这样做.)

然后您只需正常记录消息,它们就会显示在您的输出窗口中:

Logger.Information("Did stuff!");

这似乎没什么大不了的,所以让我解释一些额外的优势。对我来说最重要的是我可以同时登录到输出窗口和控制台

Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Trace()
    .WriteTo.Console(standardErrorFromLevel: LogEventLevel.Error)
    .CreateLogger();

这让我在如何使用输出方面具有极大的灵活性,而无需将我对Console.Write 的所有调用都与Debug.Write 重复。编写代码时,我可以在 Visual Studio 中运行我的命令行工具,而不必担心退出时会丢失我的输出。当我部署它并需要调试某些东西(并且没有可用的 Visual Studio)时,控制台输出可供我使用。当它作为计划任务运行时,也可以将相同的消息记录到文件(或任何其他类型的接收器)中。

最重要的是,使用 Serilog 执行此操作使得将消息转储到多个目的地变得非常容易,确保无论我如何运行它,我都可以随时轻松地访问输出。

它还需要非常少的设置和代码。

【讨论】:

  • Serilog 现在在github.com/serilog/serilog-sinks-debug 也有一个“调试”接收器,其功能类似,但格式稍好 :-) HTH!
  • 为什么不公开一个 .net 方法(可能是静态的),然后将您需要的所有东西(如 Console.Write 或 Debug.Write 等)放在那里并在任何地方使用它?
  • @Saulius “当它作为计划任务运行时,同样的消息也可以记录到文件(或任何其他类型的接收器)中。底线是使用 Serilog 做到这一点真的轻松将消息转储到多个目的地,确保无论我如何运行它,我都可以随时轻松地访问输出。”
【解决方案8】:

出于调试目的,除非您有调试侦听器,否则System.Diagnostics.Debug.WriteLine() 命令不会编译到您的代码的发布版本中。在调试模式下运行时,它会写入包括 VS 输出窗口在内的所有跟踪侦听器。

对于控制台应用程序。 Console.WriteLine() 可以工作,但输出仍会在您的二进制文件的发布版本中生成。

调试测试时,调试输出也应该出现在正常的输出窗口中;然而,console.writeline 输出没有(但可以在测试输出窗口中找到。)

【讨论】:

  • System.Diagnostics.Debug.Writeline() 应该是 System.Diagnostics.Debug.WriteLine()
【解决方案9】:

这不是对原始问题的回答。但由于我在搜索交互式转储对象数据的方法时发现了这个问题,我认为其他人可能会从提及这个非常有用的替代方案中受益。

我最终使用了命令行窗口,输入了Debug.Print命令,如下图。这以可以复制为文本的格式打印了一个内存对象,这正是我真正需要的。

> Debug.Print <item>

  id: 1
  idt: null
  igad: 99
  igbd: 99
  gl_desc: "New #20"
  te_num: "1-001-001-020"

【讨论】:

  • 是的。或者当您想从模型中获取 JSON 以提供给同事 System.Diagnostics.Debug.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(response));
【解决方案10】:
Debug.Print("text here")

Console.WriteLine("text here")

【讨论】:

    【解决方案11】:

    以下内容在 Visual Studio 2015 中对我有用:

    OutputDebugStringW(L"Write this to Output window in VS14.");
    

    阅读 OutputDebugStringW here 的文档。

    请注意,此方法仅在您调试代码时有效 (debug mode)

    【讨论】:

    • 那是 C++ 吗?问题标记为c#
    • 1/ 例子是 C++,是的,但是提到的 Win32 API 不是 C++,它是纯 C。 2/ 理论上我们应该可以从任何语言调用它,但我试过了使用 /*using System.Runtime.InteropServices;*/ [DllImport("Kernel32.dll", CharSet = CharSet.Unicode)] static extern void OutputDebugStringW(string lpOutputString); 导入它,遗憾的是,它没有按预期工作(它没有像 System.Diagnostics.Debug.WriteLine() 那样在 C# 项目的调试输出窗口中打印)。
    【解决方案12】:

    对于使用 NCrunch 的任何人,调试输出将重定向到 NCrunch 的“跟踪输出”窗口。

    【讨论】:

      猜你喜欢
      • 2018-06-19
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      相关资源
      最近更新 更多