一、如何生成core文件

1)设置core文件开关

Linux环境下进程发生异常而挂掉,通常很难查找原因,但是一般Linux内核给我们提供的核心文件,记录了进程在崩溃时候的信息。但是生成core文件需要设置开关

1)查看生成core文件的开关是否开启,输入命令# ulimit -a

在这里插入图片描述

我们看到,第一行core文件大小为0,没有开启。

2)使用#ulimit -c [kbytes]可以设置系统允许生成的core文件大小;

ulimit -c 0 不产生core文件
ulimit -c 100 设置core文件最大为100k
ulimit -c unlimited 不限制core文件大小
在这里插入图片描述
这样进程崩溃就可以生成core文件了,这种方法只能在shell中生效,下面说一下永久生效的方法:

3) 永久生效修改coresize的方式

#vim /etc/profile,然后进入编辑模式,在profile文件中加入
ulimit -c unlimited
在这里插入图片描述

保存退出,重启服务器,改文件就长久生效,或者#source /etc/profile,不重启服务器,使用source使文件马上生效。

4)指定生成文件的路径和名字;执行# vim /etc/sysctl.conf,进入编辑模式,加入下面两行
1)默认生成的core文件保存在可执行文件所在的目录下,文件名为core。
2)通过修改/proc/sys/kernel/core_uses_pid文件使生成的core文件加上pid号,echo 1>/proc/sys/kernel/core_uses_pid
3)还可以通过修改/proc/sys/kernel/core_pattern控制生成的core文件保存的位置以及文件名
4)或者:
sysctl -w kernel.core_pattern=/corefile/core-%e-%p-%t kernel.core_pattern = /corefile/core-%e-%p-%t
可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
5)按照标题那样
kernel.core_pattern=/tmp/corefile/core_%e_%p
kernel.core_uses_pid=0

在这里插入图片描述

在var下创建core目录,用# sysctl –p /etc/sysctl.conf,是修改马上生效。

core_pattern的命名参数如下:

%c 转储文件的大小上限

%e 所dump的文件名

%g 所dump的进程的实际组ID

%h 主机名

%p 所dump的进程PID

%s 导致本次coredump的信号

%t 转储时刻(由1970年1月1日起计的秒数)

%u 所dump进程的实际用户ID

5)测试是否能生成core文件:

kill -s SIGSEGV $$
查看/home目录下是否生成了core文件

二、gdb预热

1) gcc编译debug版本

gcc -g -o main main.c 编译时需要注意带-g,生成可执行文件main,运行可以在当前目录得到core文件。
在这里插入图片描述

2) cmake设置编译debug版本

在这里插入图片描述

三、开始gdb调试

GDB调试core文件,查看程序挂在位置。当core dump 之后,使用命令 gdb program core 来查看 core 文件,其中 program 为可执行程序名,core 为生成的 core 文件名。

在这里插入图片描述

gdb 进程名字  core.xxx

四、gdb如何调试多线程程序

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐