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
并写入
其中hard可以用soft替代, 区别是hard 普通用户不可以通过ulimit 命令临时改变资源限制配额,soft相反
修改后让它立即生效
切换一下当前用户为当前用户,会重载配置,再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
前面加绝对路径,不加表示生成在可执行文件所在的目录
然后更新一下配置
这条命令应该会把配置刷新到/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