各种dump方法

dump的方法很多,各有特点,都应该掌握。

dump分为两种:用户进程dump、系统dump。先说用户进程的dump。
  • 最简单的是在Win7的任务管理器中右键点击进程,选择Create Dump File。完成之后会弹出对话框说明dump文件的位置。这对于死锁进程的调试有帮助。
  • 用WinDbg也很方便。WinDbg是绿色版,直接拷贝整个目录即可使用。可以Attach到任意的进程中,然后用命令.dump xxx.dmp即可。
  • WinDbg提供了一个方便的脚本,可以直接取运行中进程的dump,完成后自动detach,尽量减少对运行中进程的影响,方便分析CPU占用过高、死锁等问题:
adplus.vbs -hang -p 1234 -o d:\dump
另外几个用法:
adplus -crash -pn w3wp -quiet 抓w3wp进程,crash模式,当那个进程崩溃结束的时候自动抓取当时的内存

adplus -hang -iis -quiet 抓IIS相关进程,包括其上host的web应用,以及iis自身

  • WinDbg本身也是查看分析dump文件的最常见工具,直接打开dump文件即可。分析dump的常用命令:
!analyze -v 显示所有分析所需的常用信息。
k/kb 显示调用堆栈。
.ecxr 显示当前执行状态。

.lastevent 查看上一个事件(异常也是事件的一种)

  • 执行WinDbg.exe -I会把WinDbg安装成默认的异常处理程序。如果某个程序崩溃,则自动调用WinDbg进入调试状态。这时候可以方便的取dump。
  • 如果安装了VS2005、VS2008,也可以作为默认的debugger,在Option里面可以设置。进程崩溃启动VS后,可以从菜单中选取dump功能。

以上都是用户进程的dump方法,下面介绍系统dump(摘抄):
  • Dump文件有三种:完整内存转储,内核内存转储,小内存转储。System Properties中的高级选项中可以看到这些设置。
完整内存转储太大,一般是物理内存大小或多一些,包括了用户进程页面,这种方式不实用,2GB的物理内存转储出来至少要2GB的磁盘空间(还有文件头信息)。内核转储一般是200MB大小(物理内存小于4GB),它只是包含了所有属于内核模式的物理内存。小内存转储一般是64KB(64位上是 128KB),这两种方式是更常用的。
小内存转储在\Windows\Minidump下生成了一个叫Mini日期+序列号.dmp的文件,这个珍贵的资源就是系统Crash时刻的状态,只不过小内存转储只记录的有限的信息,而且在你分析时,如果windbg没有设置符号服务器的路径(关于符号服务器,请参考Windbg内核调试之二: 常用命令),那么你的当前系统必须和发生蓝屏的系统的Ntoskrnl.exe版本相同,否则就有找不到符号的问题产生。

  • 如果系统死锁了,而不是BSOD,可以设置快捷键抓取系统dump,按住Ctrl+ScrollLock+ScrollLock。导入如下注册表即可:
Windows Registry Editor Version 5.00
;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
posted @ 2009-12-03 23:01  tinyfish  阅读(3860)  评论(0编辑  收藏  举报