看到网上说在debug下可以找到预料的崩溃地址行,但是实际上没有什么用呀。
(既然在debug下,那直接用调试器找不更好吗? 费这么大劲干什么)(转的文章在后面)
Release版本(指编译器优化后的),要找崩溃地址行就比较费劲了。
linux下的方法:
1、使之生成core dump文件
2、gdb调试该core文件
3、根据大概的堆栈信息,运行disassemble (具体用法见gdb帮助)
4、根据崩溃地址找到对应的崩溃反汇编码
5、分析反汇编代码,找到程序中崩溃代码。
(如果用debug调试,就更简单了,步骤同上,编译的时候加上编译选项 -ggdb ,选项详情请见man g++)
mac下的方法:
1.、使之可以生成core 文件,方法同linux
2、分析对应的crash log 在系统日志目录下。
3、根据2的堆栈信息,反汇编,得到具体地址行。
最后转2篇win下的文章。(这种方法好像难找release的。)
(1)
(vs2003以上,vc6找对应设置就可以)
步骤一:编译代码时生成map 文件和 cod 文件
我建立了一个名为DataAbort的项目,A)生成map文件,打开项目属性对话框,找到“链接--调试”在“生成映射文件”栏选择“是”; B)生成cod文件,打开项目属性对话框,找到“C/C++--输出文件”在“汇编输出”栏选择“带机器码的程序集”。
在默认情况下map文件以项目名称命名,而cod文件以cpp文件名命名,生成目录也不同,编译后可以在项目目录下搜索*.map 和*.cod
步骤二:根据异常信息找到相应的map文件,及异常地址所在的函数
步骤三:打开异常函数所在的cod文件,找到异常对应的代码行。分析问题,解决问题
(2)对“仅通过崩溃地址找出源代码的出错行”一文的补充与改进
读了老罗的“仅通过崩溃地址找出源代码的出错行”(下称"罗文")一文后,感觉该文还是可以学到不少东西的。不过文中尚存在有些说法不妥,以及有些操作太繁琐的地方。为此,本人在学习了此文后,在多次实验实践基础上,把该文中的一些内容进行补充与改进,希望对大家调试程序,尤其是release版本的程序有帮助。欢迎各位朋友批评指正。
一、该方法适用的范围
在windows程序中造成程序崩溃的原因很多,而文中所述的方法仅适用与:由一条语句当即引起的程序崩溃。如原文中举的除数为零的崩溃例子。而笔者在实际工作中碰到更多的情况是:指针指向一非法地址 ,然后对指针的内容进行了,读或写的操作。例如: