在Microsoft Windows API中,您可以使用SetUnhandledExceptionFilter为未处理的异常设置处理程序。该页面提到的最大问题是:
如果在未调试的进程中 发生异常 , 异常使它成为未处理的异常过滤器,即过滤器 将调用由指定的异常过滤器函数 lpTopLevelExceptionFilter参数。
(强调添加)
这基本上意味着,如果进程被调试,调试器会获得异常,并且我的过滤器被跳过!
我可以测试&使用printfs和trial-n-error以老式的方式调试我的ExceptionFilter。
但我错过了什么吗?如果在调试器中禁用ExceptionFilter,是否有一种交互式调试ExceptionFilter的好方法?
答案 0 :(得分:1)
查看KB173652的解决方案部分,该部分讨论将main / WinMain中的所有代码放在_ try / _except块中,如下所示。
void main (int argc, char **argv)
{
__try
{
// all of code normally inside of main or WinMain here...
}
__except (MyUnFilter (GetExceptionInformation()))
{
OutputDebugString ("executed filter function\n");
}
}
另一篇文章Debugging custom filters for unhandled exceptions描述了除上述文章之外的其他几项技术。我个人使用在异常过滤器中显示消息框的那个,然后附加调试器。我使用IsDebuggerPresent来确定是否显示消息框。
答案 1 :(得分:1)
我知道这篇文章已经存在了一段时间,但是,我刚刚发现它正在寻找其他东西。我很高兴地说,如果过滤器存在于单独的dll 中,用户'abelenky'可能会出现问题。您可以使用调试器调试未处理的异常过滤器。我已经完成了,而且,这是如何:
您需要在显示消息框的过滤器中添加一些代码。我使用以下代码:
#ifdef _DEBUG
AfxMessageBox (_T("At this time, you must attach the debugger to this process in order to debug the filter code."));
#endif
#ifdef非常重要,因为您不希望代码在Release版本中执行。我将上面的代码放在我的过滤器的最顶层。
调试过滤器: