如何将日志写入 Visual Studio 输出窗口?

Posted

技术标签:

【中文标题】如何将日志写入 Visual Studio 输出窗口?【英文标题】:How to write loggings to the Visual Studio output window? 【发布时间】:2018-01-30 07:48:11 【问题描述】:

我想用一种日志记录来扩展我的应用程序,可以选择记录到文件和/或记录到“Visual Studio”“输出”窗口。

对于后者,似乎OutputDebugString() 函数可以解决问题,但仅适用于“调试”构建,我希望也有这个用于“发布”构建,所以我想出了这个想法使用跟踪点(至少,我认为跟踪点也在写入“发布”构建的“输出”窗口),但在这里我有一个相当令人沮丧的问题: 跟踪点是一种特殊的断点,似乎被写入 *.suo 文件,存在于 <project directory>\.vs\<project name>\v15 目录中(请参阅 Where are Visual Studio breakpoints saved?.,谢谢,Max)。 我的想法是编写一个构建后事件,在 *.suo 文件中调用log() 操作的每一行中添加一个跟踪点。

然而,这是不可能的,原因很简单,*.suo 文件是二进制文件:-(

是否有人知道在构建时向应用程序添加跟踪点的另一种方法,或者如何(使用“调试”/“发布”开关)写入 Visual Studio 的“输出”窗口?

提前致谢

【问题讨论】:

据我了解,OutputDebugString 应该在附加调试器时工作,而不仅仅是在“调试”构建中。 你为什么不用std::cout 【参考方案1】:

OutputDebugString() 应该在发布版本中工作 - 如果有任何东西可以消耗输出(例如 WinDbg)。Debugging Tools for Windows (WinDbg, KD, CDB, NTSD) 至于为什么不是 - 可能想要调查一下,因为您的应用程序可能没有按照您期望的方式构建。

据我了解,跟踪点仅在调试器(调试或发布)中工作 - 但我相信它的工作方式是,调试器将在应用程序加载/启动时(或在运行期间)实际替换指令BRK 并且当应用程序触发中断时,调试器会捕获它,将原始指令替换回去,然后再执行它应该执行的任何任务(无论是暂停、递增计数器等) - 但我认为跟踪点仅适用于附加的调试器,否则没有任何东西可以执行替换、捕获和替换操作,并且代码不间断地运行。

但是,如果我正确阅读了您的意图,您实际上可能想要使用类似 Event Tracing* 的东西。这应该将您想要查看的内容输出到标准 Windows 日志文件,将在调试器内部或外部的调试或发布中工作。但是它不会输出到 VS 输出窗口。为此,OutputDebugString() 应该是正确的操作。

*免责声明 - 我自己没有使用它们,因为我们现在使用 VS 输出和 WinDbg - 但它看起来是部署应用程序的更好方法,继续前进。

【讨论】:

以上是关于如何将日志写入 Visual Studio 输出窗口?的主要内容,如果未能解决你的问题,请参考以下文章

EF Core如何输出日志到Visual Studio的输出窗口

在 Visual Studio 2010 中将输出消息写入“输出窗口”的最简单方法?

写入 Visual Studio 输出窗口,万无一失

如何使用“保存到..”对话框将字符串从 EditControl 写入 Visual Studio 2008 中的文本文件?

Visual Studio 2013:单元测试 SQL Server 数据库项目时模拟存储过程

如何在配置了 ITK 的 Visual Studio 中使用 C++ 读取和写入图像