专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
嵌入式
【ARM-Linux开发】通过GDB快速定位“段错误”的位置
2019-07-12 17:54
发布
生成海报
站内文章
/
嵌入式Linux
12980
0
1522
有些时候我们在一段 C/C++ 代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了“Segmentation fault (core dumped)”——段错误。
呵呵,这种问题我想很多人会经常遇到。遇到这种问题是非常无语的,只是提示了"段错误",接着什么都没有,如果我们一味的去看代码找太疼苦了,因为我们都相信自己写的代码没问题,现实就是现实。接着,我们可能通过打印来定位到段错误的位置,这样会有个问题,如果代码量大,我们需要打印很多信息才能找到“段错误”的位置(这种办法实在太笨了),而往往有些时候,“段错误”光靠打印不一定能找出来。
接下来,给大家介绍通过gdb快速定位“段错误”的位置
。
GDB
是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现
GDB
这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。
首先,要确保安装了gdb调试工具,在终端可通过“
which gdb
”查看:
编译 C/C++ 代码,加上
-g
参数,代表在可执行文件中加入标准调试信息。
接着,通过“
./
”运行可执行程序,如果出现“段错误”,正常情况下会在程序同级目录下生成一个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.*
文件:
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 ");
test();
printf("2222222222222 ");
return 0;
}
1)编译(加上
-g
)、执行程序,发现同级目录并没有生产
core
文件:
2)core文件的生成跟你当前系统的环境设置有关系,可以用下面的语句设置让其生成
core
文件:
ulimit -c unlimited
。core 文件生成的位置一般于运行程序的路径相同,在ubuntu下文件名一般为core。
3)用gdb来调试core文件:gdb a.out core
4)在gdb字符界面中敲“
where
”查看更详细信息。
GDB调试程序用法
http://www.linuxidc.com/Linux/2013-06/86044.htm
GDB+GDBserver无源码调试
Android
动态链接库的技巧
http://www.linuxidc.com/Linux/2013-06/85936.htm
使用hello-gl2建立ndk-GDB环境(有源码和无源码调试环境)
http://www.linuxidc.com/Linux/2013-06/85935.htm
在Ubuntu上用GDB调试printf源码
http://www.linuxidc.com/Linux/2013-03/80346.htm
Linux下用GDB调试可加载模块
http://www.linuxidc.com/Linux/2013-01/77969.htm
Ubuntu下使用GDB断点Go程序
http://www.linuxidc.com/Linux/2012-06/62941.htm
使用GDB命令行调试器调试C/C++程序
http://www.linuxidc.com/Linux/2014-11/109845.htm
GDB 的详细介绍
:
请点这里
GDB
的下载地址
:
请点这里
Ta的文章
更多
>>
【ARM-Linux开发】通过GDB快速定位“段错误”的位置
0 个评论
热门文章
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮