关于内核转储的设置方法
转自:http://blog.csdn.net/wj_j2ee/article/details/7161586
1. 内核转储作用
(1) 内核转储的最大好处是能够保存问题发生时的状态。
(2) 只要有可执行文件和内核转储,就可以知道进程当时的状态。
(3) 只要获取内核转储,那么即使没有复现环境,也能调试。
2. 启用内核转储
1.1 查看内核转储是否有效
在终端中输入以下命令,查看内核转储是否有效。
#ulimit -c
0
-c 表示内核转储文件的大小限制,现在显示为零,表示不能用。
可以改为1G
#ulimit -c 1073741824
也可以改为无限制
#ulimit -c unlimited
2.2 测试一个例子
例子的源代码:
#include <stdio.h>
int main(void)
{
int *a = NULL;
*a = 0x1;
return 0;
}
把以上源代码,写成一个a.c文件后,编译a.c文件产生一个a.out的可执行文件:
#gcc -g a.c -o a.out
修改a.out文件的权限后,执行它:
#./a.out
就会显示:
Segmentation fault(core dump)
这表示在当前目录下, 已经生成了a.out对应的内核转储文件。
注意:后面带有(core dump), 才说明转储文件成功生成了。
#file core*
core:ELF 64-bit LSB core file x86-64, version 1(SYSV), SVR4-style, from './a.out'
coreDump: UTF-8 Unicode C program text
要用GDB调试内核转储文件,应该使用以下方式启动GDB:
#gdb -c ./*.core ./a.out
GNU gdb (GDB) 7.1-Ubuntu
...
Core was generated by './a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x00000000004004dc in main() at a.c:6
6 *a =0x1;
a.c的第6行收到了11号信号。用GDB的list命令可以查看附近的源代码。
(gdb) l 5
1 #include <stdio.h>
2
3 int main(void)
4 {
5 int *a = NULL;
6 *a = 0x1;
7 return 0;
8 }
这里默认都是当前目录,也可以给core 和a.out 指定路径
到这里测试完成!
2.3 永久生效的办法
上面所述的方法,只是在当前shell中生效,重启之后,就不再有效了。永久生效的办法是:
#vi /etc/profile 然后,在profile中添加:
ulimit -c 1073741824
(但是,若将产生的转储文件大小大于该数字时,将不会产生转储文件)
或者
ulimit -c unlimited
这样重启机器后生效了。 或者, 使用source命令使之马上生效。
#source /etc/profile
3. 指定内核转储的文件名和目录
缺省情况下,内核在coredump时所产生的core文件放在与该程序相同的目录中,并且文件名固定为core。很显然,如果有多个程序产生core文件,或者同一个程序多次崩溃,就会重复覆盖同一个core文件。
我们可以通过修改kernel的参数,指定内核转储所生成的core文件的路径和文件名。
可以通过在/etc/sysctl.conf文件中,对sysctl变量kernel.core_pattern的设置。
#vi /etc/sysctl.conf 然后,在sysctl.conf文件中添加下面两句话:
kernel.core_pattern = /var/core/core_%e_%p
kernel.core_uses_pid = 0
保存后退出。
需要说明的是, /proc/sys/kernel/core_uses_pid。如果这个文件的内容被配置成1,即使core_pattern中没有设置%p,最后生成的core dump文件名仍会加上进程ID。
这里%e, %p分别表示:
%c 转储文件的大小上限
%e 所dump的文件名
%g 所dump的进程的实际组ID
%h 主机名
%p 所dump的进程PID
%s 导致本次coredump的信号
%t 转储时刻(由1970年1月1日起计的秒数)
%u 所dump进程的实际用户ID
可以使用以下命令,使修改结果马上生效。
#sysctl –p /etc/sysctl.conf
请在/var目录下先建立core文件夹,然后执行a.out程序,就会在/var/core/下产生以指定格式命名的内核转储文件。查看转储文件的情况:
#ls /var/core
core_a.out_2834
4. 手动强制某个进程产生core dump的方法(尝试)
当某些程序发生crash时,对应进程会产生coredump文件。通过这个coredump文件,开发人员可以找到bug的原因。但是coredump的产生,大都是因为程序crash了。
而有些bug是不会导致程序crash的,比如死锁,这时程序已经不正常了,可是却没有coredump产生。如果环境又不允许gdb调试,难道我们就束手无策了吗?
针对以上这种情况,一般情况下,对于这样的进程可以利用watchdog监控它们,当发现这些进程很长时间没有更新其heartbeat时,可以给这些进程发送可以导致其产生coredump的信号。根据linux的信号默认的处理行为,SIGQUIT,SIGABRT, SIGFPE和SIGSEGV都可以让该进程产生coredump文件。这样我们可以通过coredump来得知死锁是否发生。 当然, 如果进程添加了这些信号的处理函数,那么就不会产生coredump了。不过,对于SIGQUIT, SIGABRT, SIGFPE, SIGSEGV,有谁会为它们加上信号处理函数呢。
还有一种情况,进程并没有死锁或者block在某个位置,但是我们需要在某个指定位置进行调试,获取某些变量或者其它信息。但是,有可能是客户环境或者生产环境,不允许我们进行长时间的检测。那么,我们就需要通过coredump来获得进程在运行到该点时的快照。 这个时候,可以利用gdb来手工产生coredump。在attach上这个进程时,在指定位置打上断点,当断点触发时,使用gdb的命令gcore,可以立即产生一个coredump。 这样,我们就拿到了这个位置的进程快照。
1.寻找您要发送信号的进程ID,
# ps -ef | grep qemu
root 3207 3206 44 10:32 pts/1 00:00:18 /usr/local/bin/qemu-system-x86
得出 qemu-system-x86的 PID号是3207
2.使用kill(1)去发送信号。
# /bin/kill -s QUIT 3207
发送其他的信号也很相似, 只要在命令行中替换QUIT 为ABRT,TERM 或 KILL 就行了
重要提示: 在系统上随意杀死进程是一个坏主意,特别是init(8),它的PID是1,它非常特殊。 可以运行 /bin/kill -s KILL 1 命令来让系统迅速关机。 当您按下 Return (回车)键之前, 一定要 详细检查您运行 kill(1) 时所指定的参数。
5 使用core dump进行调试
在Linux下遇到“段错误”(segmentation fault),如果段错误发生在服务器端,而服务器端要继续工作,不允许调试,这时“内核转储(core dump)”就派上了用场,可以把生成的内核转储复制到本地进行调试。
首先,按照上面的永久生效方法,在服务器上进行相应设置。 然后程序在崩溃时,就会在程序所在目录(或自己指定的目录)生成一个core文件,把这个core文件拷到本地(最好与该进程对应的可执行文件放到同一个目录,若不然,在gdb时指出路径也可以)。
具体方法如下:
方法一:
输入命令 #gdb <程序可执行文件> <coredump转储文件>
例如:
# gdb /usr/local/bin/qemu-system-x86_64 /var/core/core-3207-qemu-system-x86
然后,在(gdb)提示符后输入 l, 会显示main主函数
方法二:
(1) 在终端输入命令# gdb [-c] <coredump文件>,
例如: gdb -c /var/core/core-3207-qemu-system-x86
(2)然后,在(gdb)提示符后输入file <可执行程序>
例如:(gdb) file /usr/local/bin/qemu-system-x86_64
(3) 这时就可以用backtrace/thread等命令查看当时的错误了,就像程序在本地执行到崩溃点一样
或者用where回车, 也可以显示程序在哪一行当掉的
5. 启用整个系统的内核转储
(未完待续......)
(4.1) 编辑/etc/profile, 开启登录到系统的所有用户的内核转储功能
首先,看看用的是个什么机器:
# uname –a
Linux ubuntu240 2.6.32-21-server #32-Ubuntu SMP Fri Apr 16 09:17:34 UTC 2010 x86_64 GNU/Linux
其次,再查看一些默认参数,若core file size是0,即使程序出错时,也不会产生core文件。
# ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
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) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
相关推荐
### coredump的核心概念 #### 1. 何时产生core dump? 当进程接收到某些信号(如SIGSEGV)时,如果内核被配置为允许生成core dump,那么它就会创建一个包含进程内存映像的文件。除了SIGSEGV外,其他信号也可能触发...
核心转储检测器Coredump检测器是MutatingAdmissionWebhook。 它将持久卷声明安装到Pod的每个容器中的特定目录。 并将NodeSelector添加到Pod,以便将Pod调度到支持coredump的节点上。 这里supports coredump意味着...
在嵌入式系统开发过程中,特别是对于基于MT2625这样的物联网(IoT)平台的项目,遇到程序异常崩溃的情况时,获取核心转储(core dump)文件是分析问题的重要手段之一。通常情况下,可以通过串口或专用工具如...
- **Kernel compilation**: 在内核编译时启用 `CONFIG_KEXEC` 和 `CONFIG_KEXEC_COREDUMP` 选项。 **10.1.2 硬件特定配置** 某些硬件可能需要特殊的配置才能支持 kdump。 - **Hardware-specific configurations**...
### 关于core_uses_pid标志对多线程程序无用的调查 #### 案例背景及问题描述 在RHEL5.6系统环境下,当一个进程启动并使用线程时,若出现core dump(核心转储),所生成的core文件名会包含进程ID。尽管在系统中设置...
- 使用`dumpon`命令来配置内核转储的行为。 - `savecore`命令可以帮助在系统崩溃时保存核心文件,便于后续分析。 #### 八、内核崩溃演示 - 通过故意触发内核崩溃(例如使用`echo 1 > /proc/sys/kernel/panic`),...
与用户空间不同,内核错误不会导致coredump,而是打印出一个Oops消息。Oops并不总是导致系统立即崩溃(即panic),但表明内核已经遇到了问题,可能造成系统不稳定或死锁。非法内存访问和非法指令是常见原因,如尝试...
同时,论文还结合 Linux 信号机制,剖析了 Linux 内核的核心转储(Core Dump)机制,在程序异常终止时,核心转储机制会自动将程序运行的上下文和现场信息转储到文件中,然后由 GDB 进行分析。 在 Linux 应用程序...
4. **Core Dump**:除了内核崩溃,用户空间程序也可能导致系统不稳定,此时核心转储(core dump)文件记录了程序崩溃时的内存状态。书中的内容也会涵盖如何分析这些core dump,找出导致程序崩溃的错误。 5. **内核...
- 操作系统提供了一种机制来转储应用的内存状态,即“核心转储”(core dump)。 - 这些核心文件可以使用诸如 gdb 等工具进行分析。 2. **操作系统崩溃转储**: - 当操作系统本身崩溃时,也需要分析其崩溃前的...
如果core_pattern的首字符是管道符'|',则内核将coredump的内容发送给对应的程序处理,而不是写入文件。 4. 使用chdir函数的影响:如果程序在执行过程中使用了chdir函数更改了工作目录,core文件可能会被保存在新的...
调试时使用的是crash工具,这是一个广泛使用的Linux内核调试工具,它可以用来分析内存转储文件(core dump),为开发者提供丰富的调试信息。 3. Linux内核调度器:在内核代码路径kernel/sched.c3928中,出现bug的...
在Linux操作系统中,core文件是当程序因某种错误崩溃时,内核生成的一种特殊文件,它包含了程序崩溃时的内存映像和调试信息。这对于排查和解决程序中的错误,特别是像“段错误”这样的运行时错误,是非常有价值的。...
而对于Linux,可以设置kernel panic时生成核心转储(core dump)文件。这些配置通常在系统启动参数或内核配置中设定。 上位机在此过程中扮演了分析和解析DUMP文件的角色。上位机可能是指一台专门用于分析的计算机,...
- **描述**:此选项控制内核是否在创建core dump文件时包括部分段信息。core dump文件是在程序崩溃时保存的内存快照,用于调试目的。 - **影响**:启用此选项可以帮助开发者更准确地定位问题所在,尤其是在处理...
3. 内存转储:救援内核负责收集崩溃内核的内存状态,并将其保存到磁盘或网络上的文件中,这就是内存转储文件(core dump)。 4. 分析与调试:一旦内存转储完成,管理员可以使用专用工具(如kdump、gdb等)对转储文件...
coredump是在程序崩溃时生成的内存转储文件,包含程序崩溃时刻的内存状态。 2.3.1 介绍 分析coredump有助于找出程序崩溃的原因。 2.3.2 配置 开启系统coredump功能,设置合适的大小限制,并确保有足够空间存储core...
这个工具通常在内核核心转储(kernel core dump)文件上运行,可以提供详细的内核状态信息,包括进程列表、内存映射、CPU状态以及内核模块等。它支持多种处理器架构,如x86、x86_64、PowerPC等,使得跨平台的内核...