core dump
定位segment fault错误思路:一般是使用gdb进行问题定位,gdb需要有core-dump文件。
方法:
设置core-dump文件大小,默认是0,ulimit -c unlimited,设置corefile的大小为不限制大小;
编译可执行程序时,需要加上-g选项,便于后期问题定位;
修改corefile的输出路径,新建一个/corefile文件夹,然后输入chmod 777开设权限;
通过echo “/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern,来修改输出文件名格式即可;
如果程序在运行过程中奔溃,则在/corefile目录下会自动生成对应的core-dump文件;
backtrace
#include <execinfo.h>
int backtrace(void **buffer, int size);
char **backtrace_symbols(void *const *buffer, int size);
void backtrace_symbols_fd(void *const *buffer, int size, int fd);
使用的时候有几点需要注意的地方:
- backtrace的实现依赖于栈指针(fp寄存器),在gcc编译过程中任何非零的优化等级(-On参数)或加入了栈指针优化参数-fomit-frame-pointer后都将有可能不能正确得到程序栈信息;
2.backtrace_symbols的实现需要符号表的支持,在gcc编译过程中需要加入-rdynamic参数(不过增加改参数可能在某些机器人导致addr2