设为首页 加入收藏

TOP

通过GDB快速定位“段错误”的位置
2015-11-10 13:46:00 来源: 作者: 【 】 浏览:3
Tags:通过 GDB 快速 定位 错误 位置

有些时候我们在一段 C/C++ 代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了“Segmentation fault (core dumped)”——段错误。




呵呵,这种问题我想很多人会经常遇到。遇到这种问题是非常无语的,只是提示了"段错误",接着什么都没有,如果我们一味的去看代码找太疼苦了,因为我们都相信自己写的代码没问题,现实就是现实。接着,我们可能通过打印来定位到段错误的位置,这样会有个问题,如果代码量大,我们需要打印很多信息才能找到“段错误”的位置(这种办法实在太笨了),而往往有些时候,“段错误”光靠打印不一定能找出来。接下来,给大家介绍通过gdb快速定位“段错误”的位置


GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。


首先,要确保安装了gdb调试工具,在终端可通过“which gdb”查看:




编译 C/C++ 代码,加上 -g 参数,代表在可执行文件中加入标准调试信息。




在?redhat 6(64位)环境下测试:


C++测试代码如下:


#include
using namespace std;


void test()
{
?int *i = NULL;
?*i = 250;
}


int main(int argc, char*argv[])?
{? ?
?test();
?
?return 0;?
}


1)编译(加上 -g )、执行程序,生产一个 core.* 文件:




2)启动gdb,利用 core.* 文件快速定位“段错误”的位置。


#gdb ?-q 程序名 [corefile]。如本例中:gdb -q a.out core.6922,在gdb界面中输入 where 查看“段错误”位置。






在ubuntu 14.04(64位)环境下测试:


C测试代码如下:


#include
#include


void test()
{
?char *p = NULL;
?strcpy(p, "123");
}


int main(int argc, char*argv[])?
{? ?
?printf("111111111111\n");
?test();
?printf("2222222222222\n");
?
?return 0;?
}


1)编译(加上 -g )、执行程序,发现同级目录并没有生产 core 文件:



2)core文件的生成跟你当前系统的环境设置有关系,可以用下面的语句设置让其生成 core 文件:ulimit -c unlimited。core 文件生成的位置一般于运行程序的路径相同,在ubuntu下文件名一般为core。




3)用gdb来调试core文件:gdb a.out core




4)在gdb字符界面中敲“where”查看更详细信息。




】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 代码性能优化建议 下一篇C语言排序实例(选择、冒泡、插入..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: