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

Mar*_* Ba 5 windows console winapi visual-c++

背景:

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

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

题:

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

我已经尝试在内部设置一个断点WriteConsole但是甚printf至没有捕获CRT的输出.是否有任何"中心"位置来设置断点以捕获Windows应用程序中的所有控制台输出?(有些Nt...功能?)

Jas*_*son 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 文档中有更多有关使用 ReadFile/WriteFile 对控制台句柄进行操作的信息