linux core dump

内核转储文件(core dump)永久生效的办法c++

永久生效的办法是:bash

#vi /etc/profile 而后,在profile中添加:调试

ulimit -c 1073741824

(可是,若将产生的转储文件大小大于该数字时,将不会产生转储文件)code

或者进程

ulimit -c unlimited

这样重启机器后生效了。 或者, 使用source命令使之立刻生效。开发

#source /etc/profile

指定内核转储的文件名和目录it

   缺省状况下,内核在coredump时所产生的core文件放在与该程序相同的目录中,而且文件名固定为core。很显然,若是有多个程序产生core文件,或者同一个程序屡次崩溃,就会重复覆盖同一个core文件。io

  咱们能够经过修改kernel的参数,指定内核转储所生成的core文件的路径和文件名。编译

能够经过在/etc/sysctl.conf文件中,对sysctl变量kernel.core_pattern的设置。class

#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

 

Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(coredump)生成举例说明

例子的源代码:

#include

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
2
3            int main(void)
4            {
5                   int *a = NULL;
6                   *a = 0x1;
7                   return 0;
8            }

这里默认都是当前目录,也能够给core 和a.out 指定路径。

相关文章
相关标签/搜索