本文对作者2018
年的博文Linux下core文件使用做了一系列更新,特别是针对Ubuntu 20.04
下core
文件生成异常做了分析与解决。
什么是core文件
在Linux
下遇到程序异常退出或者中止,操作系统通常会把程序当前的工作状况存储在一个名为core
的文件中,其中包含了程序运行时的内存、寄存器和堆栈指针等信息,格式为ELF
,这个过程叫做coredump
,又称作核心转储。
通过工具分析这个文件,我们可以定位到程序异常退出或者终止时相应的堆栈调用等信息。
如何生成core文件
查看coredump是否生效
1 | $ ulimit -a |
0
表示core
文件大小限制为0
,不允许写入,所以无法生成core
文件,需要修改为正数大小或unlimited
才可使coredump
生效。
修改core文件大小的限制
取消core
文件大小限制:
1 | ulimit -c unlimited |
也可以对core
文件的大小进行有效限制,单位为blocks
,一般1 block=512 bytes
,设置太小可能导致不会生成文件:
1 | $ ulimit -c 1024 |
上面对
core
文件的操作仅对当前生效,若需要永久生效,则要将相应操作写入/etc/profile
。
设置core文件存储路径
core
文件默认存储在程序的工作目录,可以通过命令cat /proc/sys/kernel/core_pattern
查看。
在文件/etc/sysctl.conf
末尾加入如下信息,可以指定core
文件的存储路径:
1 | kernel.core_pattern=/dumpdir/core_%e_%p_%t |
控制core
文件的文件名中是否添加pid
作为扩展:
1 | echo "1" > /proc/sys/kernel/core_uses_pid |
/proc/sys/kernel/core_uses_pid
这个文件的值若为1,则无论是否配置%p
,最后生成的core
文件都会添加pid
。
通常情况下,重启即可生效。
附core
文件命名使用的参数列表:
1 | %p - insert pid into filename # 添加 pid |
关闭apport.service服务
Ubuntu 20.04
中,执行完上述操作,会发现还是无法在指定目录生成core
文件。
查看core
文件存储路径:
1 | $ cat /proc/sys/kernel/core_pattern |
发现core
文件存储路径并非自己设置的,而是由管道交给了一个apport
的程序,通过查询可知其是Ubuntu
官方为了自动收集错误,生成程序崩溃报告的一个服务,即apport.service
。
我们可以关闭apport.service
这个服务:
1 | sudo service apport stop |
使用
sudo service apport start
可以开启这个服务。
如果这个命令无效的话,可以修改/etc/default/apport
文件,将enabled
改成0
。
如上,可以在指定路径生成core
文件。
使用core文件调试
可以使用gdb
对core
文件进行调试:
1 | $ gdb a.out |
编译可执行程序时需要带上
-g
选项。
如需要在PC
上调试嵌入式设备产生的core
文件,则需要选取相应平台的gdb
工具,并在进入gdb
后设置符号文件的位置:
1 | $ xxx-xxx-gdb a.out |