內核轉儲文件(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 指定路徑。