《coredump问题原理探究》Linux x86版第二章coredump捕获的环境配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/details/8494774

在Linux下捕获coredump的方法,按照作用范围,分为:作用于当前shell的方法,作用于单个用户的方法,作用于系统所有用户的方法。

1.      作用于当前shell的方法

在当前shell设置coredump的捕获,一般是用ulimit –c 命令。这条命令的含义,可以通过man ulimit得到。

如果用ulimit –c的结果不是0,那么coredump是会捕获的。例子如下:

[buckxu@xuzhina 1]$ ulimit -c
unlimited
[buckxu@xuzhina 1]$ ls      
xuzhina_dump_c1  xuzhina_dump_c1.cpp
[buckxu@xuzhina 1]$ ./xuzhina_dump_c1 
Segmentation fault (core dumped)
[buckxu@xuzhina 1]$ ls
core_xuzhina_dump_c1_7124  xuzhina_dump_c1  xuzhina_dump_c1.cpp

如果当ulimit –c的结果为0,则coredump是不会捕获的。例子如下:

 [buckxu@xuzhina 1]$ ls
core_xuzhina_dump_c1_7124  xuzhina_dump_c1  xuzhina_dump_c1.cpp
[buckxu@xuzhina 1]$ rm core_xuzhina_dump_c1_7124 
[buckxu@xuzhina 1]$ ulimit -c 0
[buckxu@xuzhina 1]$ ulimit -c
0
[buckxu@xuzhina 1]$ ls
xuzhina_dump_c1  xuzhina_dump_c1.cpp
[buckxu@xuzhina 1]$ ./xuzhina_dump_c1 
Segmentation fault
[buckxu@xuzhina 1]$ ls
xuzhina_dump_c1  xuzhina_dump_c1.cpp

但当ulimit –c的结果为0,要重新设置,则有可能会遇到权限的问题

[buckxu@xuzhina 1]$ ulimit -c 
0
[buckxu@xuzhina 1]$ ulimit -c 10
-bash: ulimit: core file size: cannot modify limit: Operation not permitted
[buckxu@xuzhina 1]$ ulimit -c 100
-bash: ulimit: core file size: cannot modify limit: Operation not permitted
[buckxu@xuzhina 1]$ ulimit -c 1000
-bash: ulimit: core file size: cannot modify limit: Operation not permitted

1.      作用于单个用户的方法

最简单的方法就是把ulimit–c放在用户的配置文件。不同的shell有不同的配置文件。如bash的话,用户配置文件可以是~/.bash_profile,~/.bash_login,~/.profile。可以通过man bash这个命令找到依据:

When  bash is invoked as an interactive login shell, or as a non-inter-
       active shell with the --login option, it first reads and executes  com-
       mands  from  the file /etc/profile, if that file exists.  After reading
       that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile,
       in  that order, and reads and executes commands from the first one that
       exists and is readable.  

像本人用的是bash,那么,就在~/.bash_profile加了一行:

ulimit -c 10000

然后重新登录后,都变成这样:

[buckxu@xuzhina ~]$ ulimit -c
10000

验证一下:

buckxu@xuzhina 1]$ ls
xuzhina_dump_c1  xuzhina_dump_c1.cpp
[buckxu@xuzhina 1]$ ./xuzhina_dump_c1 
Segmentation fault (core dumped)
[buckxu@xuzhina 1]$ ls
core_xuzhina_dump_c1_7497  xuzhina_dump_c1  xuzhina_dump_c1.cpp

还有另外一种方法,但需要重启。例子如下:

a)用root用户登录,在/etc/security/limits.conf,增加一行:

buckxu           soft    core           2000

这个文件的含义,可以通过man  limits.conf来查询。

b)重启

c)用buckxu用户登录,

[buckxu@xuzhina ~]$ ulimit -c
2000

d)用其它用户登录,

[allyluo@xuzhina ~]$ ulimit -c
0

1.      作用于系统所有用户的方法

作用于系统所有用户的方法有两种。

一种是在/etc/profile里加一行

ulimit –c <corefile size>

其中corefilesize可以是任何数值或者unlimited。

而另外一种呢,是在/etc/security/limits.conf加上一行:

*               soft    core          unlimited  #indicates unlimit on corefile size

然后重启。

可以看到所有用户的corefilesize都为unlimited了。

[allyluo@xuzhina ~]$ ulimit -c
unlimited

[buckxu@xuzhina ~]$ ulimit -c
unlimited

通过上面的方法,当程序崩溃时,就会产生coredump文件,但是文件名却是core。如果使用命令man  core就会发现corefile有一些命名规则:

Naming of core dump files
       By default, a core dump file is  named  core,  but  the  /proc/sys/ker-
       nel/core_pattern file (since Linux 2.6 and 2.4.21) can be set to define
       a template that is used to name core dump files.  The template can con-
       tain  % specifiers which are substituted by the following values when a
       core file is created:

           %%  a single % character
           %p  PID of dumped process
           %u  (numeric) real UID of dumped process
           %g  (numeric) real GID of dumped process
           %s  number of signal causing dump
           %t  time of dump, expressed as seconds since the Epoch,  1970-01-01
               00:00:00 +0000 (UTC)
           %h  hostname (same as nodename returned by uname(2))
           %e  executable filename (without path prefix)
           %c  core  file  size soft resource limit of crashing process (since
               Linux 2.6.24)

如果要马上设置命名规则,可以用root用户执行下面命令

echo "core-%e-%p-%u" >/proc/sys/kernel/core_pattern

在本人机器的执行结果:

[buckxu@xuzhina 1]$ ls
xuzhina_dump_c1  xuzhina_dump_c1.cpp
[buckxu@xuzhina 1]$ ./xuzhina_dump_c1 
Segmentation fault (core dumped)
[buckxu@xuzhina 1]$ ls
core-xuzhina_dump_c1-1246-1000  xuzhina_dump_c1  xuzhina_dump_c1.cpp
[buckxu@xuzhina 1]$ echo $UID
1000

也可以用root用户在/etc/sysctl.conf加入一行

kernel.core_pattern= core-%e-%p-%u

然后执行

sysctl –p

在fedora系统下,只要启动了abrtd服务。它也会设置core文件的命名。

[buckxu@xuzhina ~]$ ps aux|grep abrtd
root       504  0.0  0.1   5816  1136 ?        Ss   21:55   0:00 /usr/sbin/abrtd -d –s
[buckxu@xuzhina ~]$ cat /proc/sys/kernel/core_pattern 
|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e

产生的core文件如下:

[buckxu@xuzhina 1]$ ls
xuzhina_dump_c1  xuzhina_dump_c1.cpp
[buckxu@xuzhina 1]$ ./xuzhina_dump_c1 
Segmentation fault (core dumped)
[buckxu@xuzhina 1]$ ls
core.961  xuzhina_dump_c1  xuzhina_dump_c1.cpp

实际上,core文件产生得不理想。如果多个进程要产生core dump,那么,就不知道是哪一个程序产生的,往往用gdb没办法调试。调试前还得用file命令来确定一下是哪个程序产生的。

[buckxu@xuzhina 1]$ file core.961 
core.961: ELF 32-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style, from './xuzhina_dump_c1'

所以,在fedora系统,最好是把abrtd服务停止掉,在/etc/sysctl.conf里加上kernel.core_pattern的设置。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沃趣科技

Oracle中的sysctl.conf内核参数

当我们对Oracle进行安装部署时,需要按照相关要求修改OS内核参数,下面对Oracle按照部署时需要修改的相关内核参数进行简单介绍。

16530
来自专栏linux驱动个人学习

Linux内存描述之高端内存--Linux内存管理(五)

过去,CPU的地址总线只有32位, 32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间(232=4Gbit),在物理上理论上最多拥有4G内存(除了...

52010
来自专栏重庆的技术分享区

TensorFlow版本更新后运行代码所遇到的error(持续更新)

19130
来自专栏网络

服务器模型——从单线程阻塞到多线程非阻塞(上)

前言的前言 服务器模型涉及到线程模式和IO模式,搞清楚这些就能针对各种场景有的放矢。该系列分成三部分: 单线程/多线程阻塞I/O模型 单线程非阻塞I/O模型 多...

27750
来自专栏图形学与OpenGL

实验3 文件操作

    (3)     根据这个随机数,从所读取的记录中找到对应的记录,并输出显示;

13720
来自专栏小狼的世界

[每天五分钟,备战架构师-3]操作系统基本原理之存储管理

存储器是计算机系统中最重要的资源之一,任何程序和数据及各种控制用的数据结构都必须占有一定的存储空间,因此,存储管理直接影响系统性能。

10420
来自专栏码洞

一种简单的Failover机制

在应用结构上有这样一个业务场景,机房里部署了多个物理数据库的Proxy无状态节点,业务端通过Proxy节点间接和存储DB交互。Proxy支持了分库分表的特性,管...

18320
来自专栏H2Cloud

linux epoll 开发指南-【ffrpc源码解析】

摘要 关于epoll的问题很早就像写文章讲讲自己的看法,但是由于ffrpc一直没有完工,所以也就拖下来了。Epoll主要在服务器编程中使用,本文主要探讨服务器程...

43450
来自专栏乐沙弥的世界

Nginx内置状态信息(http_stub_status)

Nginx提供了一个内置的状态信息监控页面,可用于监控Nginx的整体访问情况。这个内置功能由模块ngx_http_stub_status_module实现。如...

10820
来自专栏进击的程序猿

6.824 Lab 3: Fault-tolerant Key/Value Service Part-AIntroduction实际设计中出现的问题

该实验是mit 6.824课程的第3个实验,基于raft协议完成一个key-value系统

20030

扫码关注云+社区

领取腾讯云代金券