(Linux) C++ GDB调试 segment default错误

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


问题现象

在linux下运行程序时,程序崩溃,界面上显示 segment default段错误,double free or corruption (fasttop): 0x00007fffd06c9b50,看报错的信息可能是有的地方多次释放同一块内存。查看代码,未发现问题,通过查看程序的运行日志文件也没有发现明显的报错。
此时,程序体量较大时,直接通过gdb调试运行程序不可能。但是在Linux下segment default错误会生成core文件,可通过用GDB对产生的core文件排查,快速定位问题出在哪。

1.生成core文件

首先,要想生成有效的core文件,程序需要时Debug版的,这个需要自己编译的时候注意编译debug版。
其次,需要设置core文件的大小
先查看系统当前对core文件的大小限制,core file size为0表示没有打开core dump设置。终端输入:

ulimit -a #查看系统core文件的大小限制,core file size为0表示没有打开core dump设置。需要先打开;

如果当前限制大小已经满足需求,可不用设置大小,忽略下面步骤。
设置core文件的大小,如果程序比较大,占用内存比较高,建议设置未不限制;
可根据需要自行设定,具体终端设置命令如下:

ulimit -c 0 #不产生core文件
ulimit -c 100 #设置core文件最大为100k
ulimit -c unlimited #不限制core文件的大小

设置完成后,可在终端运行Debug版的可执行程序,出现segment default错误的时候会生成core文件;
core文件一般默认在**/var/lib/apport**目录下,可根据时间查看最新生成的core文件。

2.利用GDB对core文件排查

在终端执行GDB,具体命令如下:
gdb Debug版可执行程序路径 生成的对应的core文件绝对路径;

gdb example core.11632

example是Debug版可执行程序;
core.11632是程序报错是生成的对应的core文件的绝对路径;
两个文件不在同一目录下的时候一定要加上文件的绝对路径;

执行上述命令后,可查看coredump时的调用堆栈,输入:

bt

这里会出现coredump时的代码,显示具体调用的函数名,代码所在文件的行数等信息,然后再。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值