内核转储文件(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 指定路径。