是否可以使用调试器调试UnhandledExceptionFilters?

时间:2014-01-07 21:11:49

标签: c++ windows exception-handling uncaughtexceptionhandler

在Microsoft Windows API中,您可以使用SetUnhandledExceptionFilter为未处理的异常设置处理程序。该页面提到的最大问题是:

  

如果在未调试的进程中 发生异常 ,   异常使它成为未处理的异常过滤器,即过滤器   将调用由指定的异常过滤器函数   lpTopLevelExceptionFilter参数。

强调添加

这基本上意味着,如果进程被调试,调试器会获得异常,并且我的过滤器被跳过!

我可以测试&使用printfs和trial-n-error以老式的方式调试我的ExceptionFilter。

但我错过了什么吗?如果在调试器中禁用ExceptionFilter,是否有一种交互式调试ExceptionFilter的好方法?

2 个答案:

答案 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'可能会出现问题。您可以使用调试器调试未处理的异常过滤器。我已经完成了,而且,这是如何:

  • 异常过滤器必须存在于单独的dll中。你会在以后看到原因。

您需要在显示消息框的过滤器中添加一些代码。我使用以下代码:

#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版本中执行。我将上面的代码放在我的过滤器的最顶层。

调试过滤器

  1. 在Visual Studio中构建应用程序的发行版 (实例#1)。
  2. 在VS(#2)的第二个实例中构建过滤器的调试版本。
  3. 将过滤器的调试版本复制到您的Release文件夹中 应用
  4. 从“调试”菜单中“启动您的发布应用程序” 调试”。
  5. 导致应用程序崩溃。
  6. 当出现调试消息框(上面)时,切换到Visual Studio的第二个实例(#2)。
  7. 在#2实例中,在Debug中打开过滤器项目(如果它没有打开)并附加 调试器到您的应用程序实例。
  8. 在显示消息框后,在过滤器代码中设置断点。
  9. 关闭消息框,应该点击断点。
  10. 继续调试您的代码。