写程序的时候经常遇到 segment fault
当程序很大时不好调试, 于是使用 core-dump 调试
用ulimit -c 打印当前coredump大小, 默认是0
于是用 ulimit -c unlimited 或 ulimit -c 1024 其中1024代表1024k , 通常这个数值大于程序运行时的内存就可以了
把编译选项加 -g重编
按理说应该再出现错误时会出现一个core文件了, 可是没有, 再次查看 ulimit -c 居然是0, 最后发现这个命令只能在当前控制台下
输入, 甚至当前文件夹, 因为我在另一个文件夹里写的脚本也失败了
再次运行还是没有, 按理说默认是当前目录下生成文件的, 但没有只好手动指定了
echo "/root/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
这次终于有了core文件了
gdb a.out /root/corefile
报错, 于是把corefile移动到跟a.out相同路径就可以了
在打印变量值时出现了<value optimized out>, 于是把makefile中的 -O选项去除, 好了,可以看了,
但出错的只是一个最基本的函数, 怎么看调用栈呢
bt
列出了调用栈, OK, 终于找到问题了, 这次的问题是主线程退出后, 没等其他线程退出完毕就调用了某些全局对象的析构函数导致错误