一、调试 core 文件的配置
1.1 开启core文件 —— ulimit
有时候,服务器程序运行一段时间后会突然崩溃,这并不是我们希望看到的,需要
解决这个问题。只要程序在崩溃的时候有 core 文件产生,就可以使用这个 core 文件
来定位崩溃的原因。当然,Linux 系统默认是不开启程序崩溃产生 core 文件这一机制
的,我们可以使用 ulimit -c 命令来查看系统是否开启了这一机制。发现 core file size 那一行默认是 0,表示关闭生成 core 文件。
如何开启
1)使用 ulimit -c unlimited(unlimited 是 -c 选项值)直接修改成不限制大小。
2)然后执行source /etc/profile即可立即生效。
3)再次查看 ulimit -c,结果为unlimited表示修改成功。
1.2 设置core文件生成地址
系统默认 corefile 是生成在程序的执行目录下或者程序启动调用了 chdir 之后的目录。我们可以通过设置生成 corefile 的格式来控制它,让其生成在固定的目录下
1)打开/etc/sysctl.conf
sudo vim /etc/sysctl.conf
2)在文件最后,写入 corefile 文件生成的目录
kernel.core_pattern=/home/zxm/codedump/core_%e_%p_%t
%e 所dump的文件名
%p 所dump的进程PID
%t 转储时刻(由1970年1月1日起计的秒数)
3)执行生效
sudo sysctl -p /etc/sysctl.conf
4)使用 cat 去查看路径是否生效
cat /proc/sys/kernel/core_pattern
1.3 测试
#include <stdio.h> int main(void) { printf("hello world! dump core for set value to NULL pointer/n"); *(char *)0 = 0; return 0; }
1)编译运行
gcc -g -o core_dump core_dump.c ./core_dump
结果是Segmentation fault
2)到/home/zxm/codedump,输入ll查看
3)有core文件,使用 gdb 进行调试。从结果看,提示出错位置在第6行
gdb ./core_dump /home/zxm/codedump/core_core_dump_2369_1689412339
1.4 无法产生code文件和file format not recognized报错
1)没有产生code文件
一开始调试的时候,并没设置路径。因为默认是程序运行的目录下,但是执行后没有产生。
2)file format not recognized报错
后面,设置的路径是/home/zxm/share/codedump,share是我的共享文件夹。这个时候报错
"/home/zxm/share/coredump/core_core_dump_2186" is not a core dump: file format not recognized
检查一下coredump,发现生成的code文件是0。那就是先前ulimit -c unlimited没设置成功。
3)解决办法
最后解决方法:不要把coredump创建在自己共享文件夹下。我这边修改到/home/zxm/codedump,再运行一次,就ok了;