捕获控制台输出以便在VS中进行调试
在VS的外部工具设置下,有一个“使用输出窗口”复选框,用于捕获工具命令行输出并将其转储到VS选项卡。
问题是: 当我点击F5时,我可以为我的程序获得相同的处理吗?
编辑: FWIW我在C#但是如果这对你的答案有所影响那么你的答案就不太可能是我正在寻找的。
我想要的是获取程序的输出流并使用输出重定向(’|’和’>’)在cmd提示符中使用的相同设备将其传输到VS中的输出选项卡。
我将在这里做一些假设。 首先,我假设您正在讨论应用程序的printf输出(无论是来自控制台应用程序还是来自Windows GUI应用程序)。 我的第二个假设是C语言。
据我所知,你不能直接将printf输出定向到dev studio的输出窗口,而不是直接。 [OP强调]
可能有办法,但我不知道。 你可以做的一件事就是将printf函数调用指向你自己的例程
- 调用printf并打印字符串
- 调用OuputDebugString()将字符串打印到输出窗口
你可以做几件事来实现这个目标。 首先是编写自己的printf函数,然后调用printf和OuputDebugString()
void my_printf(const char *format, ...) { char buf[2048]; // get the arg list and format it into a string va_start(arglist, format); vsprintf_s(buf, 2048, format, arglist); va_end(arglist); vprintf_s(buf); // prints to the standard output stream OutputDebugString(buf); // prints to the output window }
上面的代码大部分是未经测试的,但它应该得到概念。
如果你不是在C / C ++中这样做,那么这个方法对你不起作用。 🙂
您应该能够捕获文本文件中的输出并使用它。
我没有VS方便,所以这是来自内存:
- 创建一个C ++项目
- 打开项目设置,调试选项卡
- 启用托管调试
- 编辑命令行以添加“
> output.txt
” - 在调试器下运行程序
如果事情按我记忆的方式工作,这将把STDOUT重定向到一个文件,即使你实际上并没有在CMD.EXE下运行。
(调试器有自己的重定向语法实现,与cmd不是100%相同,但它非常好。)
现在,如果您在VS中打开此文件,您仍然可以看到VS中的输出,尽管不是在您希望的完全相同的窗口中。
控制台可以将其输出重定向到任何文本编写器。 如果您实现了写入Diagnostics.Debug的文本编写器,那么您已经完成了设置。
这是一个写入调试器的文本编写器。
using System.Diagnostics; using System.IO; using System.Text; namespace TestConsole { public class DebugTextWriter : TextWriter { public override Encoding Encoding { get { return Encoding.UTF8; } } //Required public override void Write(char value) { Debug.Write(value); } //Added for efficiency public override void Write(string value) { Debug.Write(value); } //Added for efficiency public override void WriteLine(string value) { Debug.WriteLine(value); } } }
由于它使用Diagnostics.Debug,它将遵循您的编译器设置,以便它应该写入任何输出。 此输出也可以在Sysinternals DebugView中看到。
这是你如何使用它:
using System; namespace TestConsole { class Program { static void Main(string[] args) { Console.SetOut(new DebugTextWriter()); Console.WriteLine("This text goes to the Visual Studio output window."); } } }
如果要在发布模式下编译时在Sysinternals DebugView中查看输出,可以使用写入OutputDebugString API的TextWriter。 它可能看起来像这样:
using System.IO; using System.Runtime.InteropServices; using System.Text; namespace TestConsole { public class OutputDebugStringTextWriter : TextWriter { [DllImport("kernel32.dll")] static extern void OutputDebugString(string lpOutputString); public override Encoding Encoding { get { return Encoding.UTF8; } } //Required public override void Write(char value) { OutputDebugString(value.ToString()); } //Added for efficiency public override void Write(string value) { OutputDebugString(value); } //Added for efficiency public override void WriteLine(string value) { OutputDebugString(value); } } }
也许这对你有用:在Main
设置一个断点}
,然后在关闭之前查看控制台窗口。 如果需要,您甚至可以将文本复制出来。
在我用于开发的每台机器上,我以某种方式配置我的控制台窗口,这恰好使这种方法更好地工作:
- 运行cmd.exe
- ALT-SPACE,D
- 在“选项”中,启用QuickEdit模式。
- 在“布局”中,将“缓冲区高度”设置为9999
- 单击确定
- 退出CMD窗口。
System.Diagnostics.Debug.Writeline()或Trace.Writeline()
您可以使用Systems.Diagnostics.Trace类将输出写入“输出”窗口,而不是(或除控制台)之外。 它需要一些配置,但它的工作原理。 那是沿着你想要的路线吗?
您还可以根据本文添加自己的标签,但我从未尝试过。