程序崩溃时,Attach调试器
1. Native 程序
程序崩溃时,windows系统会调用系统默认调试器,其设置在注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
(注:64位windows的上的路径不同,在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\)
这里面有2个主要的值:
Auto
= 0 的时候,系统会弹出一个对话框,让你在几个调试器中选择(如果你的系统安装了多个调试器的话)
= 1 的时候,系统会自动调用默认调试器
Debugger
默认调试器的路径。
比如windows自带的Dr.Watson : DRWTSN32 -p %ld -e %ld –g
Visual Studio JIT debugger: "C:\Windows\system32\vsjitdebugger.exe" -p %ld -e %ld
或者是WinDBG: windbg.exe" -p %ld -e %ld –g
Tip:如果想把windbg设置成默认调试器,可以运行windbg.exe -I 命令,windbg会自动完成设置。
-p和-e是调试器的一些命令行参数,而%ld则是一个占位符,Windows会把死亡的进程的PID替换%ld这个值(读者如果熟悉批处理编程的话,就应该知道%ld实际上是批处理程序的参数的声明方式)。
vsjitdebugger.exe是Visual Studio用来处理验尸调试的调试器名称,如果你安装了Visual Studio,VS的安装程序应该会自动为你设置好这个键。
Auto:如果值是1的话,那么windows就会自动在进程死亡的时候,启动调试器;如果为0的话,就会打开一个对话框问你是否要执行验尸调试—但是Windows 7如果是这个选项的话,会直接禁用验尸调试,因此我推荐将Auto的值总是设置成1。
Test.cpp
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int *p = NULL;
// 触发一个异常
*p = 0;
return 0;
}cl.exe /Zi test.cpp
2. 托管程序
上面的设置仅对native程序有效,如果要设置托管程序的默认验尸调试器,在""HKEY_LOCAL_MACHINE"Software"Microsoft".NETFramework里面,分别创建下面两个键:
DbgManagedDebugger REG_SZ "C:"Windows"system32"vsjitdebugger.exe" PID %d APPDOM %d EXTEXT "%s" EVTHDL %d
DbgJITDebugLaunchSetting REG_DWORD 2
使用上面的设置,你应该可以做所有非Winform托管程序的验尸调试了。
3. Winform程序
当你的Win form程序崩溃(Crash)的时候,你会发现你设置的默认验尸调试器没有运行起来,原因是因为Win form程序默认禁用了即时调试(JIT Debug)的功能。因此要设置Win form程序的默认验尸调试器,你除了做上面的步骤以外,你还要将Win form程序的即时调试功能打开。打开的方法:
a. 修改你机器的machine.config文件,这样机器上所有的Win form程序都会将这个即时调试功能打开。在<configuration>里面添加下面一行:
<system.windows.forms jitDebugging="true" />
b. 修改单独程序的的app.config文件打开单个Win form程序的即时调试功能。在<configuration>里面添加下面一行:
<system.windows.forms jitDebugging="true" />
例如:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>
Image File Execution Options
如果要调试的进程,也就是debuggee,is spawn by another process, 要用到"Image File Execution Options" technique to automatically attach it to windbg when it's started.
1. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options"
2. 新建一个键(Key),键名就是你要调试的程序的文件名,例如notepad.exe
3. 然后在这个新建的键值(Key)下,新建一个字符串值(String Value)Debugger,值设置为你喜欢的调试器:
a. 如果选择Visual Studio的话,就是C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe
b. 选择Windbg的话,就是c:\debuggers\windbg.exe
设置好了以后,启动notepad.exe,这个时候你选择的调试器就会被Windows先启动起来,然后在notepad.exe的入口处中断。