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

    技术2022-05-11  25

    今天在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不会被调用...


    最新回复(0)