使用WinDBG这个工具,可以在应用程序异常终止或者无响应时获取它的尸体,以用来解剖研究。
Creating Dump File
在Vista环境中抓取Dump文件很方便,在task manager(Ctrl-Shift-Esc)中,选中要生成dump文件的进程,点击context menu中的"Creat Dump File"就可以了.
通常,使用WinDBG目录下(C:/Program Files/Debugging Tools for Windows (x86))的adplus.vbs来抓取dump file.
adplus -hang -p 2960 //当进程2960失去响应时生成dump
adplus -crash -pn w3wp.exe //在w3wp.exe终止或被回收时生成dump
adplus -crash -pn w3wp.exe -NoDumpOnFirst //同上,不对 first chance exceptions生成dump
adplus是一个vb script文件,运行CDB(就是命令行下的WinDBG),负责监视系统中将要发生的异常.
Adplus参数设置
-huang | 进程运行时,随时可以使用-hang参数得到一个Dump文件, 而不需要考虑线程是否真的处于死锁中,用于诊断高内存使用率, 高CPU使用率。 |
-crash | 在进程异常终止时抓取dump file. 进程异常终止有3种情况: 1.unhandled的exception 2.asp.net进程由于iis reset或recycle而终止. 3.出现heap毁坏,栈溢出,内存不足等错误,进程必须退出 |
-pn | 指定要分析的进程名。使用多个“-pn process name”开关来指定多个进程。 |
-o | dump file的存储路径,缺省为adplus所在路径 |
-FullOnFirst | create full dumps on first chance exceptions |
-MiniOnSecond | |
-NoDumpOnFirst | 如果exception被try-catch block处理,使用这个参数就不会生成dump file |
-NoDumpOnSecond | |
-quiet | No dialog boxes will be displayed |
什么是First Chance Exception 和 Second Chance Exception?
当程序抛出异常(.net 或 native exception),此时这个exception为1st chance exception,如果这个exception 没有被 try-catch block处理,这个exception就会成为2nd chance exception (unhandled exception) 当前进程随后终止.
什么是Mini Dump 和Full Dump?
user-mode Mini Dump,保存了进程crash时virtual memory的部分内容.有些SOS的命令在Mini Dump上不能工作.Mini Dump的内容和大小和被dump的程序有关.Mini Dump所包含的信息并不一定比Full Dump少.
Full User-Mode Dumps包含了进程的整个内存空间,程序的image,handle table等调试信息.
Adplus的输出
adplus.vbs所在的路径下生成一个目录,形如<crash或 huang>_Mode__Date_07-22-2008__Time_10-35-1212,目录中包含
如果程序由于unhandled exception而终止,会得到多个dump,比如
PID-4588__ASPNET_WP.EXE__1st_chance_AccessViolation__mini_15b8_2008-07-22_10-35-28-827_11ec.dmp
PID-4588__ASPNET_WP.EXE__1st_chance_Process_Shut_Down__full_15b8_2008-07-22_10-35-36-609_11ec.dmp
PID-4588__ASPNET_WP.EXE__2nd_chance_NET_CLR__full_15b8_2008-07-22_10-35-29-420_11ec.dmp
PID-4588__ASPNET_WP.EXE__Date_07-22-2008__Time_10-35-1212.log
Process_List.txt
这些dump文件表明:
首先发生了一个非法访问,也许就是一个NullReferenceException,adplus捕获到这个Exception,生成一个mini dump(1st_chance_AccessViolation__mini)
这个Exception没有被处理,就接着产生CLR exception 对应的dump(2nd_chance_NET_CLR__full)
然后进程终止,产生dump file: 1st_chance_Process_Shut_Down__full
真正用来解决问题的是2nd Chance CLR Exception 对应的dump file
如果只得到一个dump,就可以证明crash不是由于unhandled exception引起的
Adplus的高级用法
可以给adplus指定配置文件,在某个特定的Exception发生时生成dump file,并把dump file存在特定目录下
adplus -c myconfig.cfg -pn w3wp.exe
myconfig.cfg |
<ADPlus> |