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 指定路徑。

相關文章
相關標籤/搜索