提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
问题现象
在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时的代码,显示具体调用的函数名,代码所在文件的行数等信息,然后再。