【发布时间】:2016-01-05 13:19:35
【问题描述】:
我正在使用在某些情况下运行 __debugbreak() 的第 3 方 C++ DLL,并且在这样做之前没有检查 IsDebuggerPresent()。当这种情况发生在调试器之外(例如,运行应用程序的最终用户)时,这会导致我的应用程序“崩溃”。我想自己抓住它并处理它,或者至少忽略它。
我实际上已经有一段时间使用未处理的异常过滤器将 SEH 转换为 C++ 异常,所以它不起作用有点奇怪。
::SetUnhandledExceptionFilter(OnUnhandledException);
我一直在做一些直接测试,标准的 __try/__except 有效,所以我可以将每个调用包装到 DLL 中,以此作为后备,但似乎如果 __try/__except 有效,那么 ::SetUnhandledExceptionFilter () 也应该可以工作。
__try
{
__debugbreak();
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("caught");
}
try/catch(...) 不起作用。
try
{
__debugbreak();
}
catch (...)
{
printf("caught");
}
_set_se_translator() 也不起作用。
来自https://msdn.microsoft.com/en-us/library/ms679297(VS.85).aspx 的 MSDN 文档,它声明它应该作为结构化异常运行。我意识到这是 DebugBreak() 的文档,但我也对此进行了测试,并且遇到了同样的问题,即使是“catch(...)”。
我正在使用 /EHa 进行编译。
如何捕捉 __debugbreak (asm INT 3),或者至少改变行为?
【问题讨论】:
-
我已经尝试过 (SetErrorMode, SetUnhandledExceptionFilter),它适用于访问冲突等问题,但不适用于 __debugbreak() (int 3)。到目前为止,我发现的唯一可以捕捉到的是明确的 __try/__except。我觉得我缺少一些设置。
标签: c++ winapi exception exception-handling