1. 程式人生 > >Linux的Core檔案調設定方法

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             (
-e) 20 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited ju@musicoder:~$

可以看到,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.注意身體,早點休息,不做就別做,做就做好。