1、在linux下运行程序出现段错误,如果程序不是很大还比较好找,但是如果程序很大,会比较难以定位;在linux下可以支持生成coredump文件,使用gdb来解析Segmentation Fault时发生了什么,可以比较方便的查看程序崩溃的位置;
2、一般linux系统都是默认关闭coredump文件生成,需要执行命令打开;实际上就是配置生成coredump的文件大小,系统默认为0,即不产生coredump文件;
ulimit -c unlimited
3、编译源代码时makefile编译选项添加 [-g] 选项,如果有 [-O] 选项,则设置为"-O0",即不进行优化;
4、正常运行软件,在软件出现段错误时,会在软件运行目录下生成core文件或者core.***文件;
5、使用gdb解析,使用时注意test_app的路径;
gdb test_app core
进入gdb交互界面之后,输入bt,即backtrace,查看调用栈,比如
可以看到#0附近在test.c的第7行出错,可以使用frame 0或者frame 1等等方便的查看使用的代码,这里可以看到是一个赋值语句导致段错误;也可以使用bt full命令查看所有调用栈的变量值或symbol等信息,具体的可以查看gdb调试命令说明;
6、使用gdb调试coredump时的调用栈信息不一定都能非常准确的指出错误的位置,需要去进行分析;比如提示到某个标准库的接口错误,那么应该去查一下调用传参是否正确;
7、可以通过修改/proc/sys/kernel/core_uses_pid来决定是否添加pid扩展名
0为默认值,即不添加,修改为1即添加:echo 1 > /proc/sy

本文介绍如何在Linux中处理大型程序的段错误,通过开启coredump并使用gdb解析,提供核心文件生成、配置方法,以及利用gdb回溯错误位置和分析技巧。
最低0.47元/天 解锁文章
5963

被折叠的 条评论
为什么被折叠?



