我正在使用使用该功能的第三方库OutputDebugString()
,并且在阅读 MSDN 文档时似乎表明这是用于打印到调试器。
但这对我来说很不方便,如果没有连接调试器,有没有办法读取这个输出?
如果它是我的 LIB,我希望在用户通过或类似的情况下将输出转到 stdout/stderr --debug
,但由于它不是我正在寻找其他方法来将此信息传递到控制台(或文件)而不连接调试器。
我正在使用使用该功能的第三方库OutputDebugString()
,并且在阅读 MSDN 文档时似乎表明这是用于打印到调试器。
但这对我来说很不方便,如果没有连接调试器,有没有办法读取这个输出?
如果它是我的 LIB,我希望在用户通过或类似的情况下将输出转到 stdout/stderr --debug
,但由于它不是我正在寻找其他方法来将此信息传递到控制台(或文件)而不连接调试器。
带有 2 个参数的OutputDebugStringA
生成异常DBG_PRINTEXCEPTION_C
(W
win10 中的版本DBG_PRINTEXCEPTION_WIDE_C
)-(字符长度 + 1,字符串指针)-因此我们可以自己处理此异常(此异常的系统默认处理程序执行此操作)。
OutputDebugString
重定向到控制台的示例处理程序:
LONG NTAPI VexHandler(PEXCEPTION_POINTERS ExceptionInfo)
{
PEXCEPTION_RECORD ExceptionRecord = ExceptionInfo->ExceptionRecord;
switch (ExceptionRecord->ExceptionCode)
{
case DBG_PRINTEXCEPTION_WIDE_C:
case DBG_PRINTEXCEPTION_C:
if (ExceptionRecord->NumberParameters >= 2)
{
ULONG len = (ULONG)ExceptionRecord->ExceptionInformation[0];
union {
ULONG_PTR up;
PCWSTR pwz;
PCSTR psz;
};
up = ExceptionRecord->ExceptionInformation[1];
HANDLE hOut = GetStdHandle(STD_ERROR_HANDLE);
if (ExceptionRecord->ExceptionCode == DBG_PRINTEXCEPTION_C)
{
// localized text will be incorrect displayed, if used not CP_OEMCP encoding
// WriteConsoleA(hOut, psz, len, &len, 0);
// assume CP_ACP encoding
if (ULONG n = MultiByteToWideChar(CP_ACP, 0, psz, len, 0, 0))
{
PWSTR wz = (PWSTR)alloca(n * sizeof(WCHAR));
if (len = MultiByteToWideChar(CP_ACP, 0, psz, len, wz, n))
{
pwz = wz;
}
}
}
if (len)
{
WriteConsoleW(hOut, pwz, len - 1, &len, 0);
}
}
return EXCEPTION_CONTINUE_EXECUTION;
}
return EXCEPTION_CONTINUE_SEARCH;
}
并设置此处理程序需要调用:
AddVectoredExceptionHandler(TRUE, VexHandler);
OutputDebugString
像这里的系统实现- 它真的RaiseException
用这个参数调用,只是在异常处理程序中MessageBox
- 代码描述在这里。