linux编译错误定位,通过GDB快速定位“段错误”的位置

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

831c7b7a1deb502a7658be2758cfc02a.png

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

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

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

ca49714e3c745d3b22a94a12c6cb90c6.png

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

b6f633fde0a85b66ed3e1a94c855b9ca.png

接着,通过“./”运行可执行程序,如果出现“段错误”,正常情况下会在程序同级目录下生成一个core文件(如RedHat),但是,有些环境却不会生成core文件(如Ubuntu),core文件的生成跟你当前系统的环境设置有关系。当一个程序奔溃时,在进程当前工作目录的core文件中复制了该进程的存储图像。core文件仅仅是一个内存映像(同时加上调试信息),主要用来调试的。

在 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.*文件:

258c8d00d796589a3f25c2b2fd7f5a81.png

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

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

02adc4a8923d9ada6d267ab6b04b13de.png

c6f9c627db0dccf31c6130cf7c7a0abd.png

在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 文件:

b3b70a2a70c6e0068e8c3a3d5c4bae5f.png

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

b81f6c1df951a13fe20a4fffbd997ac3.png

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

f5ff2d79c75e4ae3e08bceddcfce458d.png

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

a34929080c3578b94c745d57487451c9.png

GDB 的详细介绍:请点这里

GDB的下载地址:请点这里

0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值