dump分为两种:用户进程dump、系统dump。先说用户进程的dump。
- 最简单的是在Win7的任务管理器中右键点击进程,选择Create Dump File。完成之后会弹出对话框说明dump文件的位置。这对于死锁进程的调试有帮助。
- 用WinDbg也很方便。WinDbg是绿色版,直接拷贝整个目录即可使用。可以Attach到任意的进程中,然后用命令.dump xxx.dmp即可。
- WinDbg提供了一个方便的脚本,可以直接取运行中进程的dump,完成后自动detach,尽量减少对运行中进程的影响,方便分析CPU占用过高、死锁等问题:
另外几个用法:
adplus -crash -pn w3wp -quiet 抓w3wp进程,crash模式,当那个进程崩溃结束的时候自动抓取当时的内存
adplus -hang -iis -quiet 抓IIS相关进程,包括其上host的web应用,以及iis自身
- WinDbg本身也是查看分析dump文件的最常见工具,直接打开dump文件即可。分析dump的常用命令:
k/kb 显示调用堆栈。
.ecxr 显示当前执行状态。
.lastevent 查看上一个事件(异常也是事件的一种)
- 执行WinDbg.exe -I会把WinDbg安装成默认的异常处理程序。如果某个程序崩溃,则自动调用WinDbg进入调试状态。这时候可以方便的取dump。
- 如果安装了VS2005、VS2008,也可以作为默认的debugger,在Option里面可以设置。进程崩溃启动VS后,可以从菜单中选取dump功能。
以上都是用户进程的dump方法,下面介绍系统dump(摘抄):
- Dump文件有三种:完整内存转储,内核内存转储,小内存转储。System Properties中的高级选项中可以看到这些设置。
小内存转储在\Windows\Minidump下生成了一个叫Mini日期+序列号.dmp的文件,这个珍贵的资源就是系统Crash时刻的状态,只不过小内存转储只记录的有限的信息,而且在你分析时,如果windbg没有设置符号服务器的路径(关于符号服务器,请参考Windbg内核调试之二: 常用命令),那么你的当前系统必须和发生蓝屏的系统的Ntoskrnl.exe版本相同,否则就有找不到符号的问题产生。
- 如果系统死锁了,而不是BSOD,可以设置快捷键抓取系统dump,按住Ctrl+ScrollLock+ScrollLock。导入如下注册表即可:
;For PS/2 keyboards:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters]
"CrashOnCtrlScroll"=dword:00000001
;For USB keyboards:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters]
"CrashOnCtrlScroll"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl]
"AutoReboot"=dword:00000000
"CrashDumpEnabled"=dword:00000001
"Overwrite"=dword:00000001
"LogEvent"=dword:00000001
如果发生了键盘没有ScrollLock的杯具,可以改变快捷键:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\crashdump]
Dump1Keys=0x22
Dump2Key=0x7e
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\crashdump]
;Rightmost CTRL key + Leftmost CTRL key
Dump1Keys=0x22
;use pause/break key
Dump2Key=0x7e
设置:
参考文档:
http://msdn.microsoft.com/en-us/library/cc266483.aspx
http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc