我试图实现一些事后调试器,意味着只捕获程序未处理的异常,所以我设置了未处理的异常过滤器(并确保没有人在我之后设置它)但我有一些情况(例如在mshtml.dll),访问冲突发生但没有未处理的异常过滤器调用,并且事后调试器(例如windbg)弹出事后调试器如何捕获它?
并且 AddVectoredExceptionHandler 不是一个好主意,因为它甚至被 seh 处理并继续调用。
我试图实现一些事后调试器,意味着只捕获程序未处理的异常,所以我设置了未处理的异常过滤器(并确保没有人在我之后设置它)但我有一些情况(例如在mshtml.dll),访问冲突发生但没有未处理的异常过滤器调用,并且事后调试器(例如windbg)弹出事后调试器如何捕获它?
并且 AddVectoredExceptionHandler 不是一个好主意,因为它甚至被 seh 处理并继续调用。
一个最小的简单事后调试器只是打印操作系统使用 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:\>