背景:
我在我的开发者PC上运行了一个大型的nUnit测试套件(通过nunit-console),我在控制台窗口看到了一些垃圾输出。
受测试的单元确实涉及.NET代码以及底层的C ++和C库,我还没有找到谁在生成垃圾输出。
问题:
是否有一个Windows API函数,其中所有控制台输出都通过? (无论它来自哪里。)
我已尝试在WriteConsole
内设置断点,但这甚至不能从CRT中捕获printf
输出。是否有任何“中心”位置来设置断点以捕获Windows应用程序中的所有控制台输出? (有些Nt...
功能?)
答案 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调用中需要注意的句柄。就像使用钩子一样,您可以为断点指定条件,并在调用中检查正确的控制台句柄。
中有更多关于使用ReadFile / WriteFile在控制台句柄上进行操作的信息