-1

我试图实现一些事后调试器,意味着只捕获程序未处理的异常,所以我设置了未处理的异常过滤器(并确保没有人在我之后设置它)但我有一些情况(例如在mshtml.dll),访问冲突发生但没有未处理的异常过滤器调用,并且事后调试器(例如windbg)弹出事后调试器如何捕获它?

并且 AddVectoredExceptionHandler 不是一个好主意,因为它甚至被 seh 处理并继续调用。

4

2 回答 2

2

这是由操作系统完成的:

微软

  1. 如果进程没有被调试,或者关联的调试器没有处理异常,系统会根据异常类型提供默认处理。

该行为可能会受到注册表设置的影响,例如AeDebug(Dr. Watson 键)和WER 键(例如 LocalDumps)。

于 2018-03-12T20:16:43.177 回答
0

一个最小的简单事后调试器只是打印操作系统使用 AeDebug 键提供的 pid 和事件

int main(int argc, char* argv[])
{
    printf("%s\n", GetCommandLineA());
    printf("%d\n", getchar());
    return 0;
}

在此处输入图像描述

我不确定 windbg 是否捕获了我测试过的 fastfail,windbg 以及上面的代码都捕获了 fastfail 并捕获了两个事件,如屏幕截图 2 和 3 所示

C:\>cdb -c "uf accvio!main;q" accvio.exe | tail

0:000> cdb: Reading initial command 'uf accvio!main;q'

accvio!main:
01361000 33c9            xor     ecx,ecx
01361002 cd29            int     29h  <<<<<< __fastfail(0 @ecx)
01361004 33c0            xor     eax,eax
01361006 c3              ret
quit:

C:\>

事件 168 活动 204

于 2018-03-15T12:06:27.080 回答