linux 上用 core 文件定位线上问题
一直以来都以为这个是不是很难,最近没push必须用这个,发现原来异常简单。
1. 启用 core文件
首先
ulimit –a
查看是否开启core文件
看第一行的 core file size,像这样为0的话就是没开。就需要用下面的命令开启
ulimit -c unlimited
开启,然后再 ulimit –a 查看开启情况
| tip 1: ulimit –c 后面可以跟具体的数值,单位是K,如1024,但是如果程序core文件大小超过设定的值的话,就会被截断,从而可能无法定位到具体哪一行。所以稳妥起见,建议用 unlimited. |
启用就完成了,就这么简单。
| tip 2: core文件启用只对执行了 ulimit –c 的窗口有效 |
然后就等一个错误发生,比如我这里是一个段错误,在734行
2. 在设置开启了core文件的窗口运行代码
如愿报了一个段错误。
这个时候在这个执行目录下就会生产一个 core文件
3. 分析错误位置
用gdb来定位段错误位置
gdb so库文件 core文件
比如我的
然后安说的输入c就可以出下面结果
4.docker 里面无法生产core文件问题
以上操作在主机上操作的时候,我这边没有出现过问题。但是后面在docker里面,出现了执行 ulimit –c unlimited 之后,却并没有生成core文件。这是因为系统在产生 Core Dump 文件的时候是根据 /proc/sys/kernel/core_pattern 的设定。而默认的设定是 |/usr/share/apport/apport %p %s %c %P,也就是用管道传给 apport。然而 Docker 里面的系统不一定有装 apport。
在宿主机上执行:
echo core.%p > /proc/sys/kernel/core_pattern








浙公网安备 33010602011771号