1.通过注册表设置自动调试器(当程序崩溃时,自动调用该调试器进行调试)
x86机器:
\\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug
-->Debugger(调试器程序的绝对路径,后面跟一些参数:Path\Windbg -p %ld -e %ld。(-p %ld --->被调试进程的Id, -e %ld --->导致异常的事件))
-->Auto(指示是否自动运行调试器,0--弹出选择窗口决定是否调式,1--不弹出窗口直接进入调式)
注册项中的数据如下图所示:
Intel Itanium 机器:
64位程序:
\\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug
32位程序:
\\HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
将windbg设为默认调式器:
cmd运行:path\Windbg.exe -I (注:I为大写) 或者,创建一个WinDbg快捷,“属性”--->"目标"设为path\windbg.exe -I(如下图)
2. 代码中设置断点
通过汇编设置: __asm{ int 3; }
通过系统调式api设置:DbgBreakPoint()
3. 当程序发生异常崩溃时,windows处理异常的步骤
a。查看是否有user-mode,有的话截获异常并中断,goto 步骤e
b。看程序中是否有try/catch块,有的话,catch块处理之,goto 步骤e
c。查看windows是否有一个打开的内核调试模式连接,有的话,连接这个kernel-mode调试器, goto 步骤e
d。通过查找注册表,启动设定的或默认的调式器处理
e。调试、记录崩溃信息或结束程序