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

Is it possible to debug UnhandledExceptionFilters with a debugger?

本文关键字:调试 UnhandledExceptionFilters 调试器 可以使 是否      更新时间:2023-10-16

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

如果在未调试的进程中发生异常,并且异常进入未处理的异常筛选器,即该筛选器将调用由lpTopLevelExceptionFilter参数。

(添加强调)

这基本上意味着,如果正在调试进程,调试器将获得异常,并且跳过我的筛选器!

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

但我是不是错过了什么?如果ExceptionFilter在调试器中被禁用,有没有一种好的方法可以交互式调试它?

检查KB173652的Resolution部分,该部分讨论将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 functionn");
}
}

另一篇文章"为未处理的异常调试自定义筛选器"描述了除上述技术之外的其他几项技术。我个人使用的是在异常过滤器中显示一个消息框,然后附加调试器的方法。我使用IsDebuggerPresent来确定是否显示消息框。

我知道这篇文章已经存在一段时间了,但我只是偶然发现它在搜索其他东西。我很高兴地说,如果过滤器存在于一个单独的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. 将过滤器的调试版本复制到应用程序
  4. 从"调试"菜单启动Release应用程序调试">
  5. 导致应用程序崩溃
  6. 当出现调试消息框(如上)时,请更改为Visual Studio的第二个实例(#2)
  7. 在#2实例中,在Debug中打开过滤器项目(如果它没有打开),并附加调试器到应用程序实例
  8. 在显示消息框后,在筛选器代码中设置断点
  9. 关闭消息框,您的断点就会被击中
  10. 继续调试代码