Debug系列:VC++程序Release版崩溃的解决办法

来源:互联网 发布:c语言99乘法表位置 编辑:程序博客网 时间:2024/06/06 03:24

from: http://rendao.org/blog/1999/


Debug系列:VC++程序Release版崩溃的解决办法

VC++程序发布后,如果在客户那运行崩溃,且研发环境下无法本地复现,工程师可能就要去现场,如果在现场也只是偶发的bug,去了现场也是抓狂。那,有什么办法能便于我们解决VC++程序生产环境下崩溃的问题呢?

 

常用方法,为你的程序加入Dump机制。

网上流传已久的miniDump方法是可行的,某国外程序员写的miniDump.h和miniDump.cpp,把这个模块加入你的VC++工程就可以了。miniDump模块添加办法如下:

Setp1:在需要生成dump文件的工程中引用包含MiniDump.h,并且在程序初始化时调用minidump_startup, 程序退出时调用minidump_cleanup

Step2: 在工程release设置中,VC6下务必保证勾选了“产生调试信息”和“产生MAP文件”,VC2012下进入“配置属性|链接器|全部选项”,“生成调试信息”选择“是”,“生成映射文件”选择“是”,“引用”选择“是(/OPT:REF) ”。

Step3: 编译后生成的pdb、源码文件都需要保存,以便以后可辅助分析dump文件。本文的崩溃分析方法中未用到map文件,据说pdb就够了,但最好还是保存下来备用。

miniDump.h

 

miniDump.cpp

 

补充说明

据说此法无法检测内存溢出、内存覆盖的错误,我简单验证过,基本是这样,比如:

遇到这样的错误崩溃,会生成dump文件

char* s=NULL;
s[1] = ‘a’;

遇到这样的错误崩溃,可能不会生成dump文件,

char s[10];

sprintf_s(s,10,”hello%d”,”abcdefghijklmnopqrstuvwxyz”);

遇到这样的错误崩溃,可能不会生成dump文件

char s[10];

sprintf_s(s,10,”hello%s”,”abcdefghijklmnopqrstuvwxyz”);

 

Dump文件有了,那如何使用Dump文件来排错呢?

Step1:四个准备文件
打开WinDbg -> 设置pdb路径(File|Symbol File Path) -> 设置源代码路径(File|Source File Path) -> 设置Exe路径(File|Image File Path) -> 打开dump文件(File|Open Crash Dump)。
如果只设置pdb文件路径,也是可以显示出错信息的,只是不够详细。

Step2: 分析定位
7、输入命令!analyze -v,等待几秒后会打印出错误信息,函数调用栈,并定位到出错代码

OK ,这样我们就能在发布版本的程序中,准确的定位到哪个函数出了问题


0 0