作为windows开发员很头疼的就是程序编译通过但是在运行的时候crash掉。但是作为一个软件调试者,最基本的crash后dmp的抓取和分析是基本的技能了。这段时间在和同学调代码的时候程序会crash掉,也趁这个机会也回顾下这些知识然后总结下来。
程序崩溃的种类
- 程序崩溃后弹出提示框
- 程序直接退出
- 系统崩溃,蓝屏
第三方程序dmp抓取
一般运行第三方程序的时候可能会遇到程序宕掉的情况,但是此时我们又没有源码,如果想要重现dmp过程的话,通过对软件的逆向分析可以从正向的角度去跟踪程序crash的过程,当然也可以通过借助软件来辅助我们分析崩掉了的程序。
类似的工具有很多,之前也有人搜集过了:
How To Capture A Minidump
这里我简单的介绍下自己进程使用的一些工具:
windows自带工具
对,你没看错,windows自带的工具很完善
- windows任务管理器
- windows注册表
在注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\ 添加
LocalDumps项,
DumpType:
0 = Create a custom dump
1 = Mini dump
2 = Full dump
windbg
windbg是经典的分析dmp的工具啦
比较简单的,就是为windbg设置一个运行的参数。
然后windbg会弹出提示过框:
然后此时在运行程序,如果程序崩溃,则会默认启动windbg加载,然后就可以通过windbg生成dmp文件:
.dump /参数 dmp路径
/m :生成minidump,只保存系统信息,加载模块,进程及线程
/ma:尽可能多的信息,包括整的内存内容、句柄、未加载的模块,等等
/mFhutwd:带有数据段,非共享的读/写内存页和其他有用信息的minidump
这种生成dmp文件的方式是借助了windbg的附加,所以如果程序加入了反调试的话,就稍微显得复杂些。
drwtsn32.exe
用法和windbg类似,可以先将他设置为默认的调试器
drwtsn32 [-i][-g][-p pid][-e event]
-i:讲drwtsn设置为默认的应用程序错误调试程序
-g: 被忽略,但作为windbg和ntsd的兼容而被提供
-p:pid为要调试的进程id
-e:event表示进程附加完成的事件
具体可参见:
drwtsn32使用手册
google breakpad
Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块,他支持Windows,Linux和Mac和Solaris。由于他本身跨平台,所以很大的减少我们在平台移植时的工作,毕竟崩溃转储,每个平台下都不同,使用起来很难统一,而Google breakpad就帮