我正试图推出一些验尸调试器, 意味着只捕获未被程序处理的异常, 所以我设置了未处理的异常过滤器(并确保没有人设置它在我之后) 但我有一些情况(例如在mshtml.dll中)发生访问冲突,但没有未处理的异常过滤器调用,并且post mortem调试器(例如windbg)弹出如何验尸调试器捕获它?
和AddVectoredExceptionHandler不是一个好主意,因为即使是seh也会调用它并继续。
答案 0 :(得分:2)
这是由操作系统完成的:
MSDN:
- 如果未调试进程,或者关联的调试器未处理异常,则系统会根据异常类型提供默认处理。
醇>
此行为可能受注册表设置的影响,例如AeDebug(Dr. Watson键)和WER keys(例如LocalDumps)。
答案 1 :(得分:0)
最小的简单事后调试器只是使用AeDebug键打印os提供的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:\>