系统环境:Ubuntu 创建gdb_test.cpp,写入:
int main() {
int *ptr = nullptr;
*ptr = 100;
return 0;
}
操作空指针产生段错误。
编译生成二进制可执行文件:
g++ gdb_test.cpp -g -std=c++11 -o gdb_test
运行:
产生core.xxxx文件。
没有core文件的原因
使用ulimit -a查看:
core file size指的是允许core文件的大小,如果是0就不可产生,更改:
ulimit -c unlimited。 想更改哪一项,就跟哪一项的后缀,-a都显示出来了。
对于Ubuntu,还有一个apport服务,负责自动转发错误,接管了core文件,将这个服务关闭。
sudo vim /etc/default/apport,设置enabled=0。重启。
使用cat /proc/sys/kernel/core_pattern检查,如果是core就代表成功。
调试操作
gdb [binfile] [corefile]即可。
- 查看调用堆栈 bt(backtrace)
- 找到崩溃代码位置
- 更改代码