post postemem调试器如何捕获未处理的异常过滤器错过的内容

时间:2018-03-12 16:27:29

标签: winapi windbg unhandled-exception seh postmortem-debugging

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

和AddVectoredExceptionHandler不是一个好主意,因为即使是seh也会调用它并继续。

2 个答案:

答案 0 :(得分:2)

这是由操作系统完成的:

MSDN

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

此行为可能受注册表设置的影响,例如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;
}

enter image description here

我不确定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:\>

Event 168 Event 204