写入 Visual Studio 的输出窗口

Writing to output window of Visual Studio

提问人:previous_developer 提问时间:2/27/2012 最后编辑:Peter Mortensenprevious_developer 更新时间:5/10/2021 访问量:898137

问:

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

选中“定义 DEBUG 常量”和“定义 TRACE 常量”选项。

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

配置:活动(调试)

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

C# visual-studio 调试

评论

12赞 Wonko the Sane 3/22/2013
由于这是一篇较旧的帖子,我将将其添加为那些偶然发现该问题的人的评论。除了实际更改代码外,还可以使用称为跟踪点的特殊断点。请参阅 MSDN 文档
16赞 kirk.burleson 7/15/2013
只是提醒一下,Debug.WriteLine() 仅在 Debug 中运行时才有效。这意味着使用 F5 而不是 CTRL-F5 运行它。这很容易被忽略。
4赞 the_mandrill 8/23/2013
这是真的,但一个方便的工具是 DebugView,它在调试器外部运行时显示调试流的所有输出
2赞 yoyo 3/9/2016
如果尝试编写在 Visual Studio 测试框架下运行的单元测试的输出,则规则略有不同,有关详细信息,请参阅此答案
1赞 Rob 1/21/2019
只是为了补充 @kirk.burleson 的评论;如果在库中使用,并在发布模式下生成库(NuGet 包通常就是这种情况),则即使在调试模式下运行测试/应用程序,它也不会记录。我建议作为替代方案Debug.WriteTrace.Write

答:

82赞 Micah Armantrout 2/27/2012 #1
Debug.WriteLine

就是你要找的。

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

菜单“工具”→“选项”→“调试”→取消选中“将输出发送到立即”。

评论

1赞 Guy Starbuck 2/27/2012
可能 Debug.Write() 没有插入回车符,所以消息被缓冲了?
2赞 Skindeep2366 9/26/2013
直到我按照 Micah 所说的操作后,我才看到 Debug.WriteLine(“String”)。Tools|Options|Debugging uncheck Send Output to Immediate
6赞 Houdini Sutherland 2/13/2015
我认为在以后的版本中,复选框是“将所有输出窗口文本重定向到即时窗口”
13赞 dba 6/1/2016
在 VS 2015 中,它被称为:“将所有输出窗口文本重定向到即时窗口”,以防万一,有些人必须寻找 5 分钟才能找到合适的设置:) - 我上下滚动以找到一个以“发送...”开头的选项:)
912赞 Bhargav 2/27/2012 #2

添加命名空间,然后可以使用将消息快速打印到 IDE 的输出窗口。详情请参阅:System.DiagnosticsDebug.WriteLine()

评论

3赞 previous_developer 2/27/2012
谢谢。我假设如果我在没有调试的情况下启动(ctrl-f5),就无法写入输出,对吗?
1赞 Bhargav 2/27/2012
我猜你正在寻找这个:stackoverflow.com/questions/562590/......
0赞 previous_developer 2/27/2012
再次感谢,但这对我不起作用。即使定义了 TRACE 常量,如果没有调试模式,也不会打印 TRACE。
0赞 Bhargav 2/27/2012
刚刚在这里运行了一个小应用程序,对我来说效果很好。也许您的环境中存在一个小故障?
1赞 previous_developer 2/28/2012
这是我的测试代码;pastebin.com/b7P0bYEa这很简单,但仍然没有。我会在另一个系统上尝试一下。
16赞 dansasu11 2/27/2012 #3

您可能正在寻找

MessageBox.Show("A message")

Debug.WriteLine("A message")

评论

11赞 Rafael Herscovici 7/13/2015
MessageBox.Show()当您想为调试目的编写多个值时,可能会非常烦人。
4赞 Amir Touitou 7/31/2016
问题是“写入 Visual Studio 的输出窗口?”,而不是消息框。
0赞 ProfK 8/21/2016
@AmirTwito 消息框是一个输出窗口。
4赞 Amir Touitou 8/29/2016
是的,你是对的,但问题是“写入Visual Studio的输出窗口?”,而不是使用以下代码写入简单的消息框:MessageBox.Show()
5赞 jpmc26 3/11/2019
@ProfK Visual Studio 输出窗口是特定程序的一个非常具体的 GUI 元素,并且不会写入它。MessageBox.Show
189赞 veight 2/27/2012 #4

这将写入调试输出窗口:

using System.Diagnostics;

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

评论

9赞 nuander 3/11/2015
对我来说,这“输出”到即时窗口
0赞 Frank H. 4/23/2015
我在一组单元测试中尝试了这个。我调试了选定的测试,但在调试窗口中没有我尝试打印的任何内容。
0赞 Joe Cotton 11/11/2016
但是,只有在我关闭网页后,这才会输出到“调试”窗口。我希望在执行代码时立即显示。等一下 - 我发现在执行代码时输出窗口是隐藏的。如果我显示窗口,我的输出就在那里。
31赞 Zac 2/11/2016 #5

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

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

我正在Visual Studio 2010下处理C#项目。

评论

2赞 yoyo 3/8/2016
我正在使用 VS 2013 Professional 并尝试使用 Visual Studio 单元测试框架从单元测试中获取输出。测试工具似乎捕获并重定向了 Debug.WriteLine,但不捕获并重定向了 Trace.WriteLine。除非调试测试(而不仅仅是运行测试),否则也不会看到 Trace 输出。
14赞 Paul Gorbas 11/27/2016 #6

电话

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

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

我们应该从 创建和使用记录器,但该日志仅显示在 dotnet.exe 弹出控制台窗口中,而不显示在 Visual Studio 的“输出”窗口中。Microsoft.Extensions.Logging

评论

0赞 Wouter Vanherck 3/8/2018
所以 Debug.WriteLine()、Console.WriteLine() 和 Trace.WriteLine() 没有在 .Net Core 的输出中输出任何内容?有什么方法可以在不编写日志类的情况下使用某种简单的日志记录吗?已在“调试”>“工具”>“选项”中搜索,并选中“显示输出来源:”以获取可能的解决方案。
0赞 Mona Jalal 6/2/2017 #7

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

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

在此处阅读 OutputDebugStringW 的文档。

enter image description here请注意,此方法仅在调试代码 (debug mode)

评论

17赞 jpmc26 10/5/2017
那是 C++ 吗?该问题标记为 c#
0赞 numdig 6/18/2021
1/ 这个例子是 C++,是的,但提到的 Win32 API 不是 C++,它是普通的 C。 2/ 理论上我们应该能够从任何语言调用它,但我尝试导入它,可悲的是,它没有按预期工作(它没有像 C# 项目那样在调试输出窗口中打印)。/*using System.Runtime.InteropServices;*/ [DllImport("Kernel32.dll", CharSet = CharSet.Unicode)] static extern void OutputDebugStringW(string lpOutputString);System.Diagnostics.Debug.WriteLine()
2赞 djabraham 6/8/2017 #8

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

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

> Debug.Print <item>

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

评论

0赞 rob_james 1/15/2021
是的。或者,当您想要从模型中获取 JSON 以提供给同事时System.Diagnostics.Debug.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(response));
5赞 jpmc26 10/4/2017 #9

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

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

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();

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

最重要的是,使用 Serilog 来做到这一点可以非常轻松地将消息转储到多个目的地,确保无论我如何运行它,我都可以随时访问输出。

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

评论

1赞 Nicholas Blumhardt 10/5/2017
Serilog 现在在 github.com/serilog/serilog-sinks-debug 上也有一个“调试”接收器,其功能方式类似,但格式略好一些:-)呵呵!
0赞 Saulius 2/21/2019
为什么不做一个 .net public(可能是静态的)方法,然后把你需要的一切放在那里,比如 Console.Write 或 Debug.Write 等,并在任何地方使用它?
0赞 jpmc26 2/21/2019
@Saulius “当文件(或任何其他类型的接收器)作为计划任务运行时,也可以将相同的消息记录到文件中。最重要的是,使用 Serilog 来做到这一点,可以很容易地将消息转储到多个目的地,确保无论我如何运行它,我都可以随时访问输出。
8赞 Chris McCowan 9/7/2019 #10

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

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

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

3赞 mikro 8/11/2020 #11
Debug.Print("text here")

Console.WriteLine("text here")
0赞 majjam 5/10/2021 #12

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