程序crash后为什么没有启动JIT调试器?

来源:互联网 发布:编辑网络大赛 编辑:程序博客网 时间:2024/05/01 02:58

今天在MS ntdebugging blog上看到一个puzzler, 是说一般通过设置注册表的AeDbug选项,当程序崩溃的时候会有一个JIT的调试器跳出来(缺省时候是Dr. Waston, 但是如果装过VS的话就会是VS),在什么情况下debugger不会跳出来?

1. 在一个线程启动时,RTL会在调用BaseThreadInit 之前安装异常处理程序,如下,如果因为某种原因破坏了这个异常处理链的话(chain of exception handler), 那就不会调用debugger出来了

ChildEBP RetAddr 

000ef7ac 75fbf837 ntdll!KiFastSystemCallRet

000ef7b0 75fbf86a USER32!NtUserGetMessage+0xc

000ef7cc 00b21418 USER32!GetMessageW+0x33

000ef80c 00b2195d notepad!WinMain+0xec

000ef89c 76e24911 notepad!_initterm_e+0x1a1

000ef8a8 7704e4b6 kernel32!BaseThreadInitThunk+0xe

000ef8e8 7704e489 ntdll!__RtlUserThreadStart+0x23  << Exception Handler在此安装

000ef900 00000000 ntdll!_RtlUserThreadStart+0x1b

2. crash的那个进程负责创建debugger进程,所以在系统资源不够的情况下,有可能创建不成功,则debugger不会被调用...