Linux的Core檔案調設定方法
一、執行時錯誤
任何人寫程式都會出錯,正如《C++程式設計規範》所說,真正可怕的錯誤不是編譯時的錯誤,而是執行時錯誤。
有的程式可以通過編譯, 但在執行時會出現Segment fault(段錯誤)
這通常都是指標錯誤(一般就是空指標)引起的,或者訪問了不能訪問的記憶體(陣列越界,系統保護)
二、core檔案
我們不可能用GDB一句一句的去找,真正的英雄都善於使用手中的武器。這就是core file
所謂core,就是當程式down掉的時候,作業系統把程式的記憶體內容dump下來,這個動作就是core dump,動作的結果就是core檔案
產生:
1.程式掛了,作業系統產生
2.通過gcore $pid命令直接匯出相應程序的core檔案,此命令執行後, 會恢復程式的執行, 不影響程式的執行
3.通過另一個程序傳送SIGABRT訊號給當前程序, 雖然也能產生core檔案,但是程式隨著一起終止掉
三、core檔案開關設定
1.終端級別
怎麼樣才能讓程式down掉的時候,自動core dump呢?可以通過 ulimit檢視和設定
#檢視core檔案的資訊 ulimit -a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
ju@musicoder:~$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority ( |
可以看到,core file size 是0,那就是說程式down了的時候,不會生成core檔案,這個功能是關閉的。
可以使用? ulimit -c unlimited 設定允許當前生成沒有大小限制的core file
1 |
ju@musicoder:~$ ulimit -c unlimited |
只能對當前終端有效,退出就無效。
這樣做,是因為只想臨時生成core file,不需要每次crash時都自動生成。
2.使用者級別
使用者在自己的~/.bash_profile中加入
1 |
ulimit -S -c unlimited > /dev/null 2>&1 |
這樣設定後允許當前使用者生成沒有大小限制的core dump檔案
3.系統級別
(1)對所有使用者
修改/etc/profile,加入或者修改
1 |
ulimit -S -c unlimited > /dev/null 2>&1 |
這樣設定後允許所有使用者生成沒有大小限制的core dump檔案。
優點:不需要重起系統
缺點:無法控制只讓某些使用者生成core dump檔案
(2)上面這種方法也是有缺點的,那就是Tom用會產生core,Jerry也會產生,實行上我們只要Tom產生
修改/etc/security/limits.conf 可做到
ps.很多系統上限都可以通過修改這個檔案改變,如最大子程序個數,最大開啟檔案數等等。這個檔案開頭有詳細的註釋,對如何修改這個檔案做了說明。
1 2 3 4 5 6 7 8 |
ju@musicoder:/etc/security$ cat limits.conf # /etc/security/limits.conf #<domain> <type> <item> <value> #* soft core 0 #root hard core 100000 # End of file ju@musicoder:/etc/security$ |
我們看到了 * soft core 0 這一行,他表示對所有使用者生產dump,但預設是註釋了的
如果只想對某些使用者或使用者組開啟core dump,可以加入
Tom soft core 0
@TomGroup soft core 0
#0是大小
優點:可以針對特定使用者或特定組開啟core dump檔案
缺點:需要重起系統
四、core檔名稱設定
1.pid資訊
在/proc/sys/kernel/core_uses_pid中配置是否core帶pid的擴充套件
檔案內容為1,表示新增pid作為副檔名,生成的core檔案格式為core.xxxxx;(xxxxx如12345為pid)
為0則表示生成的core檔案統一命名為core
1 2 |
ju@musicoder:~$ cat /proc/sys/kernel/core_uses_pid 0 |
可通過以下命令修改此檔案(root)
1 |
root@musicoder:/home/ju# echo "1" >; /proc/sys/kernel/core_uses_pid |
2.儲存位置和檔名格式
/proc/sys/kernel/core_pattern 中配置生成檔案的檔名和儲存位置
1 2 3 4 5 |
ju@musicoder:~$ cat /proc/sys/kernel/core_pattern core #可通過以下命令修改此檔案: root@musicoder:/home/ju# echo "/tmp/core-%e-%p-%t" >; /proc/sys/kernel/core_pattern #當然也可以是 sysctl -w kernel.core_pattern=/tmp/core-%e-%p-%t |
可以將core檔案統一生成到/tmp目錄下,產生的檔名為 core-命令名-pid-時間戳
以下是引數列表:
%p – insert pid into filename 新增pid
%u – insert current uid into filename 添加當前uid
%g – insert current gid into filename 添加當前gid
%s – insert signal that caused the coredump into the filename 新增導致產生core的訊號
%t – insert UNIX time that the coredump occurred into filename 新增core檔案生成時的unix時間
%h – insert hostname where the coredump happened into filename 新增主機名
%e – insert coredumping executable name into filename 新增命令名
#我是生成到自己的當前目錄下方便使用
1 |
echo "core-%e-%p-%t" > /proc/sys/kernel/core_pattern |
五、除錯core
用gdb進行檢視core檔案的內容
gdb [exec file] [core file]
之後基本上只用bt就可以找到資訊了,當然還有where, frame, up, down, print等活用。
五、測試
實踐出真知
1.程式碼
2.編譯
#編譯時加? -g 引數得到符號
1 2 3 4 5 6 7 |
#編譯時加? -g 引數得到符號 ju@musicoder:~/study/dump$ g++ -g -o dump dump.cpp ju@musicoder:~/study/dump$ ls -l 總用量 40 -rwxr-xr-x 1 ju ju 34437 2012-04-10 00:06 dump -rw-r--r-- 1 ju ju?? 154 2012-04-10 00:05 dump.cpp ju@musicoder:~/study/dump$ |
3.執行
執行出錯,出現了core檔案(會比較大)
1 2 3 4 5 6 7 8 9 |
ju@musicoder:~/study/dump$ ./dump 段錯誤 (core dumped) ju@musicoder:~/study/dump$ ls -l 總用量 160 -rw------- 1 ju ju 221184 2012-04-10 00:06 core-dump-17044-1333987618 -rwxr-xr-x 1 ju ju? 34437 2012-04-10 00:06 dump -rw-r--r-- 1 ju ju??? 154 2012-04-10 00:05 dump.cpp ju@musicoder:~/study/dump$ |
4.除錯
1 2 3 4 5 6 7 8 9 10 11 12 |
ju@musicoder:~/study/dump$ gdb ./dump core-dump-17044-1333987618 GNU gdb (GDB) 7.1-ubuntu Copyright (C) 2010 Free Software Foundation, Inc. #好多xxx #最後可以看到 Loaded symbols for /lib/ld-linux.so.2 Core was generated by `./dump'. Program terminated with signal 11, Segmentation fault. #0 0x080485a4 in test_fun () at dump.cpp:9 9 *szTmp = 0x11; (gdb) |
六、宣告
1.不對文章正確性做保證,只為本人學習之用。
2.本文參考了好多其它作者的文章,也引用了一些文字,對他們的知識共享精神表示感謝。
3.本文連結:
4.本文可以任意轉載修改使用,但請保證文章完整性,不要誤導他人。
5.注意身體,早點休息,不做就別做,做就做好。