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



背景:

我正在我的开发人员PC上运行一个大型的Unnit测试套件(通过nUnit控制台(,我在控制台窗口中看到了一些垃圾输出。

测试中的单元确实涉及.NET代码以及底层C++和C库,我还没有发现是谁产生了垃圾输出。

问题:

是否有一个单一的Windows API函数,所有控制台输出都通过该函数?(不管它来自哪里。(

我曾尝试在WriteConsole中设置断点,但它甚至无法捕获CRT的printf输出。是否存在设置断点以捕获Windows应用程序中所有控制台输出的"中心"位置?(某些Nt...功能?(

控制台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文档

最新更新