如何在Windows上的控制台输出上中断(设置断点)?

时间:2014-05-26 13:18:59

标签: windows winapi visual-c++ console

背景:

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

受测试的单元确实涉及.NET代码以及底层的C ++和C库,我还没有找到谁在生成垃圾输出。

问题:

是否有一个Windows API函数,其中所有控制台输出都通过? (无论它来自哪里。)

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

1 个答案:

答案 0 :(得分: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调用中需要注意的句柄。就像使用钩子一样,您可以为断点指定条件,并在调用中检查正确的控制台句柄。

Microsoft documentation

中有更多关于使用ReadFile / WriteFile在控制台句柄上进行操作的信息