CoreDump —— 崩溃前的自拍
Jiya 一定会成为一个了不起的项目。我对此是深信不疑的。然而在成长的道路上,挫折总是难免的。无论坚强还是不坚强,项目们总有机会在各自的角落里陷入崩溃。
为了能让Jiya 在每次崩溃的时候,可以快速地恢复,甚至成长,我给她的Chieng 添加了生成coredump 文件的能力。
一、Coredump
Coredump 文件可以保存程序运行时的内存、寄存器状态,以及函数调用堆栈信息等。我们完全可以把它的生成过程,理解为一次自拍行为。
在Windows 平台上,在不依赖其它工具的情况下,一个程序想要生成coredump 文件,是需要自身添加相关的代码的。
其中的关键,就在于自定义异常处理函数,像这样:
SetUnhandledExceptionFilter(MyUnhandleExceptionFilter);
从SetUnhandledExceptionFilter 这个函数名字里可以看到,就是设置一个自定义的函数,来处理那些没有被try-catch 的异常。
然后,我们在自定义的MyUnhandleExceptionFilter 中进行自拍,即创建coredump,像这样:
MiniDumpWriteDump(...);
二、MakeCrash
这是一个用来制造崩溃的插件。作为一场演习,它的关键在于可以通过编译,但运行时崩溃。
可以达到这种效果的方法有很多。我的做法比较简单,像这样:
scanf("%s",0);
三、定位崩溃点
在Jiya 运行了MakeCrash 之后,她会崩溃,然后生成一个core.dmp 文件。双击它,VS 就会自动生成一个Solution。点击“使用 仅限本机 进行调试“,像这里:
然后它就会运行到出错的那个地方,然后中断。
需要注意的是,coredump 有时候不会运行到出问题的地方。这种情况可能是因为,在release 下编译时没有开启生成调试信息,而且还做了优化。下方的第三个博客,对此给出了相关建议。
关于coredump 还可以参考下列几个博客:
1)http://blog.youkuaiyun.com/fhxpp_27/article/details/9701867
2)http://blog.youkuaiyun.com/pkrobbie/article/details/6636310
3)http://blog.youkuaiyun.com/haizimin/article/details/50262901
当然了,如果再仔细学习DbgHelp.h自然可以更好。
Jiya_v1.0.1 下载链接:
http://download.youkuaiyun.com/download/woshichenjiacheng/9942241