有关OutputDebugString的一点儿事实
我最近花了一些时间分析OutputDebugString方法。在我的另一个实验中,我需要一个仅依赖于本机API的OutputDebugString版本。在实现它的过程中,我发现了一些关于OutputDebugString的有趣的事实,也许您也会感兴趣。
OutputDebugString的工作原理
简而言之,OutputDebugString尝试将消息发送到附加到给定进程的调试器,如果没有调试器侦听,则尝试将全局节映射到进程内存中并将调试消息保存在其中。我使用本机API实现OutputDebugStringA(ANSI版本)的示例如下:
voidNTAPI RtlOutputDebugStringA(_In_opt_ LPCSTR OutputString) {if(OutputString) {
EXCEPTION_RECORD exceptionRecord{0};
exceptionRecord.ExceptionCode=DBG_PRINTEXCEPTION_C;
exceptionRecord.NumberParameters= 2;
exceptionRecord.ExceptionInformation[0] = strlen(OutputString) + 1;
exceptionRecord.ExceptionInformation[1] = reinterpret_cast<ULONG_PTR>(OutputString);
__try {
RtlRaiseException(&exceptionRecord);
} __except (EXCEPTION_EXECUTE_HANDLER) {
NotifyGlobalDebugOutputMonitor(OutputString);
}
}
}
- 上一篇: 仅通过转储来排除内存泄漏
- 下一篇: 使用Java中的InputStream读取文件数据