使用Drwtsn32和NTSD进行崩溃进程转储
2008-03-29 16:10
211 查看
使用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慢慢分析了。
当我们的程序在客户那里崩溃时,使用崩溃转储工具获取崩溃现场的信息是很有必要的,否则单纯依赖用户的口头描述很难定位问题所在。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慢慢分析了。
相关文章推荐
- storm 进程自动关闭 fail-fast 使用daemontools 进行管理
- 使用SetUnhandledExceptionFilter转储程序崩溃时内存DMP .
- 使用 Eclipse Memory Analyzer 进行堆转储文件分析
- 使用Python的Supervisor进行进程监控以及自动启动
- 使用 Eclipse Memory Analyzer 进行堆转储文件分析
- 使用 shell 脚本对 Linux 系统和进程资源进行监控
- [Android Memory] 使用 Eclipse Memory Analyzer 进行堆转储文件分析
- 使用injectso 技术注入mtrace,对进程进行内存检测
- 使用未写入文档参数"_ALLOW_RESETLOGS_CORRUPTION"进行崩溃恢复经典
- 使用shell 脚本对 Linux 系统进程的CPU使用率与内存资源进行监控
- IISExpress 调试使用学习,使用附加到进程进行快速调试
- 使用互斥量(Mutex)进行windows 线程同步 跨进程线程同步
- [Linux信号]进程间使用信号进行同步
- 使用SetUnhandledExceptionFilter转储程序崩溃时内存DMP注意事项
- Linux下进程的创建及其使用管道进行进程之间的通讯[00原创]
- 使用 Eclipse Memory Analyzer 进行堆转储文件分析
- win32上进程异常后如何进行转储
- 使用zookeeper对进程进行加锁
- 使用shell脚本对Linux系统和进程资源进行监控
- 使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试