是否可以使用调试器调试UnhandledExceptionFilters
Is it possible to debug UnhandledExceptionFilters with a debugger?
在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构建中执行。我把上面的代码放在了过滤器的最上面。
调试过滤器:
- 在Visual Studio中生成应用程序的发布版本(实例#1)
- 在VS(#2)的第二个实例中构建过滤器的调试版本
- 将过滤器的调试版本复制到应用程序
- 从"调试"菜单启动Release应用程序调试">
- 导致应用程序崩溃
- 当出现调试消息框(如上)时,请更改为Visual Studio的第二个实例(#2)
- 在#2实例中,在Debug中打开过滤器项目(如果它没有打开),并附加调试器到应用程序实例
- 在显示消息框后,在筛选器代码中设置断点
- 关闭消息框,您的断点就会被击中
- 继续调试代码
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 在linux上调试巨大的C++项目
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 正在VS调试器中监视映射条目
- 使用调试/崩溃报告将应用程序部署到客户端
- VC++本机单元测试,找不到调试符号
- 如何在C++生成器中禁用"使用调试.dcus"
- 使用vscode调试时,GDB意外退出
- 即使使用调试编译标志,表达式也是"optimized out"
- 调试 CUDA MMU 故障
- 小字符串优化(调试与发布模式)
- 调试和自由执行中的信号处理
- 调试编译的服务器在数据库打开时崩溃
- Visual Studio 调试优化如何工作?
- 如何配置Visual Studio Code以使用cygwin,cmake和gcc进行调试
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 如何在大型c++项目的可视化代码中设置调试
- Qt 调试显示行号
- 如何将可变参数模板转换为多个单个模板?(C++竞争编程调试模板)