使用Drwtsn32和NTSD进行崩溃进程转储
当我们的程序在客户那里崩溃时,使用崩溃转储工具获取崩溃现场的信息是很有必要的,否则单纯依赖用户的口头描述很难定位问题所在。Drwtsn32、NTSD,UserDump、Autodump+,WinDbg都是Windows下的崩溃转储工具,其原理就是在程序崩溃时获取相应的信息并存储。Drwtsn32和NTSD是Windows自带的程序,客户系统中一定存在这个程序,我们可以方便的使用它进行崩溃转储。我们也可以自己编写一个类似的转储工具并注册成系统默认的调试器。我们也可以在进程内使用SetUnhandledExceptionFilter中注册一个ExceptionFilter函数,在这个函数中创建我们自己的转储工具生成转储信息。一般来说,当出现未处理的异常时,最好不要在ExceptionFilter函数中进行过多的处理并生成转储信息,因为这时程序的堆、栈可能已经不可用了。
使用Drwtsn32进行崩溃进程转储
首先运行”Drwtsn32 –i”命令把Drwtsn32设置为默认的调试器。然后运行Drwtsn32设置转储选项,一般使用默认的选项就行了。选项如下图所示:
如果想在进程崩溃时得到通知可以选择视觉通知和声音通知。如果不选择附加到现有日志文件,则每次程序出错都创建新的日志文件,会把以前的日志文件覆盖,所以最好选择附加到现有日志文件。转储文件默认保持到“C:/Documents and Settings/All Users/Application Data/Microsoft/Dr Watson/user.dmp“,新生成的转储文件user.dmp会把以前的转储文件覆盖,这是Drwtsn32非常不方便的一个地方,它不能为每个文件生成一个唯一的文件名。
使用NTSD进行崩溃进程转储
NTSD是Windows 2k/XP自带的调试器,虽然它的版本比较老(与最新的WinDbg附带的版本相比),不过用来做崩溃进程转储已经够用了。首先需要手工把NTSD设置为默认的调试器,打开注册表,
设置“HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/AeDebug/Debugger”为
“c:/windows/system32/ntsd.exe -p %ld -e %ld -g -c ".dump /m /u D:/dump.dmp;q"”。
设置后转储文件会放在D盘根目录下面,每个文件都有一个唯一的文件名,文件名格式是“dump_日期_时间_进程ID_.dmp”
设置“HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/AeDebug/Auto”为1。.
NTSD命令参数的具体含义可以参考WinDbg的文档。NTSD可以为每个转储文件生成唯一的文件名,所以不用担心文件互相覆盖的问题。
有了转储文件我们就可以使用WinDbg或Visual Stdio慢慢分析了。