ubuntu16.04设置core dump

2024/01/13

Tags: Ubuntu Core Dump

Table of Contents

0.

之前同事写过这个主题,包括我们软件给技术支持的pdf里也有这个说明,但都请得比较抽象,所以重新写一个详细版本

1. 设置core dump资源限制

通过ulimit -a可以查看各类资源限制,其中-c类表示core

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
deepvision@ubuntu:~/source/repos/dv_app_solution/bin/x86_64(master)$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31574
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 31574
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

默认情况下,应该看到core file size 限制为0,ubuntu 16.04稳定版本发布后的默认设置

将它设置为unlimited是生成core dump的必要不充分条件

1.1 临时设置

在终端设置ulimit -c unlimited,这种方式,另启动一个终端就恢复系统默认设置了,而且会受到1.2中第二列配置值的影响,可能不会生效,所以如果只是写到 ~/bashrc或~/profile, 当程序不使用bash运行 ,可能不会生效

1.2 持久化设置

用管理员权限打开/etc/security/limits.config

并写入

1
*       hard       core    ulimited

其中hard可以用soft替代, 区别是hard 普通用户不可以通过ulimit 命令临时改变资源限制配额,soft相反

修改后让它立即生效

1
su - deepvision

切换一下当前用户为当前用户,会重载配置,再ulimit -a查看配置,应该看到core已经是unlimited

2. 设置bug, crash后处理的管道

2.1 查看系统处理bug,崩溃的默认配置

可以在/proc/sys/kernal/core_pattern 文件中查看到设置的处理方式

刚装好的ubuntu16.04应该是这样的

1
2
root@681e5135949f:/# cat /proc/sys/kernel/core_pattern
|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h %e

搞错了,这个是我在129编译服务器上的ubuntu 16.04 docker 容器中打印的,由于docker容器会使用host的内核,所以这个是129服务器的默认设置,即为centos 8

ubuntu16.04内核应该是

1
2
deepvision@ubuntu:/# cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport %p %s %c %d %P %E

可以看出,ubuntu16.04 默认使用apport 报告错误,而centos8通过coredump服务来处理bug,崩溃

2.2. 修改ubuntu16.04 处理bug,crash为生成dump

先停止掉apport服务

1
sudo service apport stop

使用sudo 编辑 /etc/sysctl.config, 使打印后有kernal.core_pattern 的配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
deepvision@ubuntu:~/source/repos/dv_app_solution(master)$ cat /etc/sysctl.conf |head -n 10
省略
.
.
.
kernel.core_pattern = core.%e_%p_%h_%t
.
.
.
省略

%e 可执行文件名称

%p 进程号

%h 主机名称

%t时间戳表示 , (unix epoch + 生成的ms数得到当前时间)

可以在core.%e_%p_%h_%t前面加绝对路径,不加表示生成在可执行文件所在的目录

然后更新一下配置

1
sudo sysctl -p

这条命令应该会把配置刷新到/proc/sys/kernal 目录的配置文件中,使配置生效

测试生成core dump

在程序main函数中加入崩溃代码

1
2
3
    int zero = 0;
    int exception_num = 1/zero;
    qDebug() << exception_num;

如果是release配置,不要省略第3行,因为没有使用的变量会被编译器优化掉,导致没有崩溃

1
2
3
4
deepvision@ubuntu:~/source/repos/dv_app_solution/bin/x86_64(master)$ ./dv_app 
Floating point exception (core dumped)
deepvision@ubuntu:~/source/repos/dv_app_solution/bin/x86_64(master)$ ll|grep core
-rw------- 1 deepvision deepvision  2174976 1月  13 15:18 core.dv_app_107389_ubuntu_1705130336

生成dump成功

>> Home

Comments