如何在Windows上在控制台输出(Console output)上设置断点(breakpoint)?

5

背景:

我在我的开发人员电脑上(通过nunit-console)运行了一个大型的nUnit测试套件,但是我在控制台窗口中看到一些垃圾输出。

被测试的单元涉及.NET代码以及底层的C++和C库,我还没有找出是谁产生了这些垃圾输出。

问题:

是否存在一个单一的Windows API函数,所有控制台输出都会经过它?(无论它来自何处。)

我尝试在WriteConsole内设置断点,但甚至不能捕获CRT的printf输出。是否有任何“中心”位置可以设置断点以捕获Windows应用程序中的所有控制台输出?(某些Nt...函数?)

1个回答

0

控制台 I/O 在 Windows 上调用 ReadFile 和 WriteFile。WriteFile 是控制台输出的例程。最好钩取或断点 WriteFile 并过滤指定给它的句柄。不要将实际文件 I/O 误认为是对控制台句柄的操作。

要获取在 Windows 进程上用于控制台输出的正确句柄:

GetStdHandle(STD_OUTPUT_HANDLE);

或者,使用 CreateFile 打开控制台输出句柄并指定 CONOUT$ 也可以,并且也是推荐的方法:

HANDLE console_output = CreateFileA("CONOUT$", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

这将返回您需要在 WriteFile 调用中监视的句柄。就像使用钩子一样,您可以指定断点的条件并检查调用中的正确控制台句柄。

有关使用 ReadFile/WriteFile 对控制台句柄进行操作的更多信息,请参阅 Microsoft 文档


四年后,我甚至都记不得当时的问题是什么了。:-) 很棒的答案,非常感谢!! 下次我会抓住那个错误的。 - Martin Ba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接