写入Visual Studio的输出窗口


605

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

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

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

配置:活动(调试)

注意:如果相关,我使用向导将项目创建为“ Windows Forms Application”。我不知道在哪里看。


32
尝试使用Debug.WriteLine()
Nikson Kanti Paul,2012年

9
由于这是一篇较旧的文章,因此我将其添加为那些偶然发现该问题的人的评论。除了实际更改代码,您还可以使用称为跟踪点的特殊断点。请参阅MSDN文档
Wonko the Sane'Mar 3'22

13
提醒一下,Debug.WriteLine()仅在Debug中运行时有效。这意味着使用F5而不是CTRL-F5运行它。这很容易错过。
kirk.burleson

3
是的,但是方便的工具是DebugView,它在调试器外部运行时显示调试流的所有输出
the_mandrill 2013年

2
如果您试图编写在Visual Studio测试框架下运行的单元测试的输出,则规则有些不同,请参见此答案以获取详细信息。
yoyo

Answers:


754

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


2
谢谢。我假设如果不进行调试(ctrl-f5)就开始,就没有办法写输出了吗?
previous_developer

1
我猜你正在寻找这样的:stackoverflow.com/questions/562590/...
Bhargav铢

再次感谢,但对我而言不起作用。即使已定义TRACE常量,也不会在没有调试模式的情况下打印跟踪。
previous_developer

只是在这里运行一个小应用程序,对我来说效果很好。也许您的环境中有一个小故障?
Bhargav Bhat 2012年

1
这是我的测试代码;pastebin.com/b7P0bYEa这很简单,但仍然一无所获。我将在另一个系统上尝试。
previous_developer

154

这将写入调试输出窗口:

using System.Diagnostics;

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

6
对我来说,这是“立即”窗口的“输出”
nuander

我在一组单元测试中进行了尝试。我调试了所选的测试,但没有尝试在调试窗口中打印的内容。
Frank H.

但是,仅在关闭网页后,这才会输出到“调试”窗口。我想在执行代码时立即显示。等等-我发现在执行代码时输出窗口是隐藏的。如果显示窗口,则输出在那里。
Joe Cotton

我们可以保留在调试窗口中打印的该消息的日志吗?还是Visual Studio提供了任何方法来访问调试窗口的日志?
Anmol Rathod

82

采用:

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

55
Debug.WriteLine

是您要寻找的。

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

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


1
可能Debug.Write()没有插入回车,所以消息被缓冲了吗?
盖伊·星巴克

2
直到我完成了Micah所说的之后,我才看到Debug.WriteLine(“ String”)。Tools|Options|Debugging uncheck Send Output to Immediate
Skindeep2366

3
我认为在更高版本中,复选框为“将所有输出窗口文本重定向到立即窗口”
Houdini Sutherland 2015年

6
在VS 2015中,它的名称为:“将所有输出窗口文本重定向到立即窗口”,以防万一,有些用户不得不花5分钟的时间才能找到合适的设置:)-我上下滚动查找以“发送...” :)
dba

22

对我来说,只有跟踪名称空间而不是调试名称空间起作用:

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

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


2
我正在使用VS 2013 Professional,并尝试使用Visual Studio单元测试框架从单元测试获取输出。似乎测试工具捕获并重定向Debug.WriteLine,但不重定向Trace.WriteLine。除非您调试测试(而不仅仅是运行测试),否则您也不会看到跟踪输出。
yoyo

15

您可能正在寻找

MessageBox.Show()

要么

Debug.Writeline()

8
MessageBox.Show()当您要出于调试目的而写入多个值时,可能会非常烦人。
Dementic 2015年

4
问题是“正在写入Visual Studio的输出窗口吗?” 而不是消息框。
阿米尔·图伊图

@AmirTwito消息框是一个输出窗口。
ProfK

4
是的,您是对的,但问题是“正在写入Visual Studio的输出窗口吗?” 而不是使用以下代码的简单消息框:MessageBox.Show()
阿米尔·图伊图

4
@ProfK Visual Studio输出窗口是特定程序的非常特定的GUI元素,并且MessageBox.Show不会对其进行写入。
jpmc26

9

通话

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?在“工具”>“选项”>“调试”中进行了搜索,并在“显示以下来源的内容”中进行了检查,以查找可能的解决方案。
Wouter Vanherck

4

这需要一个第三方框架,即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.Writewith的调用Debug.Write。编写代码时,我可以在Visual Studio中运行命令行工具,而不必担心退出时会丢失输出。当我部署它并需要调试某些东西(并且没有可用的Visual Studio)时,控制台输出就可以供我使用了。当文件作为计划任务运行时,相同的消息也可以记录到文件(或任何其他类型的接收器)中。

最重要的是,使用Serilog做到这一点使将消息转储到多个目标变得非常容易,从而确保无论我如何运行,我始终可以随时访问输出。

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


1
Serilog现在在github.com/serilog/serilog-sinks-debug也有一个“调试”接收器,其功能类似,但格式略好:-) HTH!
Nicholas Blumhardt

为什么不公开.net公共(可能是静态的)方法,然后将所需的所有内容放在其中,例如Console.Write或Debug.Write等,并在各处使用它?
萨利乌斯

@Saulius“当作为计划任务运行文件时,也可以将相同的消息记录到文件(或其他类型的接收器)中。最重要的是,使用Serilog来执行此操作确实很容易将消息转储到大量文件中。目的地,确保无论我如何运行它都可以随时访问输出。”
jpmc26

1

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

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

> Debug.Print <item>

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


0

以下内容在Visual Studio 2015中为我工作:

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

此处阅读有关OutputDebugStringW的文档。

在此处输入图片说明 请注意,此方法仅在调试代码(debug mode)时有效


11
那是C ++吗?这个问题被标记为c#
jpmc26 2015年

0

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

对于控制台应用程序。 Console.Writeline()会起作用,但是输出仍会在您的二进制发行版中生成。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.