ChatGPT解决这个技术问题 Extra ChatGPT

写入 Visual Studio 的输出窗口

我正在尝试将消息写入输出窗口以进行调试。我搜索了一个类似 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 作为替代方案

P
Peter Mortensen

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

如何在 Visual C# 中进行跟踪和调试

使用 Debug 和 Trace 类的论文,包括异常处理


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

这将写入调试输出窗口:

using System.Diagnostics;

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

对我来说,这个“输出”到立即窗口
我在一组单元测试中试过这个。我调试了选定的测试,但在调试窗口中没有任何我试图打印的内容。
但是,这仅在我关闭网页后才会输出到调试窗口。我希望在执行代码时立即显示。等一下 - 我发现在代码执行时输出窗口是隐藏的。如果我显示窗口,我的输出就在那里。
T
TylerH
Debug.WriteLine

就是你要找的。

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

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


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

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

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

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


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

您可能正在寻找

MessageBox.Show()

或者

Debug.Writeline()

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

通话

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?已在“工具”>“选项”>“调试”中进行搜索,并检查了“显示输出自:”以获取可能的解决方案。
C
Chris McCowan

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

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

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


System.Diagnostics.Debug.Writeline() 应该是 System.Diagnostics.Debug.WriteLine()
j
jpmc26

这需要第三方框架,即 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();

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

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

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


Serilog 现在在 github.com/serilog/serilog-sinks-debug 也有一个“调试”接收器,其功能类似,但格式稍微好一点 :-) HTH!
为什么不公开一个 .net 方法(可能是静态的),然后将您需要的一切(如 Console.Write 或 Debug.Write 等)放在那里并在任何地方使用它?
@Saulius“当它作为计划任务运行时,也可以将相同的消息记录到文件(或任何其他类型的接收器)中。最重要的是,使用 Serilog 执行此操作使得将消息转储到大量目的地,确保无论我如何运行它,我都可以随时访问输出。”
P
Peter Mortensen

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

我最终使用了命令行窗口,输入了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));
m
mikro
Debug.Print("text here")

或者

Console.WriteLine("text here")

m
majjam

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


T
TylerH

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

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

阅读 OutputDebugStringW here 的文档。

https://i.stack.imgur.com/nwcPr.png


那是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# 项目的调试输出窗口中打印)。