Linux 下的Debug - 內核轉儲(core dump)

1.sysctl -a|grep core

kernel.core_uses_pid = 1
kernel.core_pattern = core
kernel.core_pipe_limit = 0

2.ulimit -c

1

ulimit -c unlimited

3.modify  /etc/sysctl.conf

kernel.core_pattern = %%%p-%u-%g-%s-%t-%h-%e-%c.core

core file is :

%6619-0-0-11-1370293406-linux-4-a.out-18446744073709551615.core

%% 單個%字符
%p 所dump進程的進程ID
%u 所dump進程的實際用戶ID
%g 所dump進程的實際組ID
%s 導致本次core dump的信號
%t core dump的時間 (由1970年1月1日計起的秒數)
%h 主機名
%e 程序文件名

4.kernel.core_uses_pid = 1

core file is :

core.6617

5.core文件太大,影響系統運行,可定位到/usr/tmp目錄下

kernel.core_pattern = /usr/tmp/%%p-%u-%g-%s-%t-%h-%e-%c.core

 

進一步可以壓縮

kernel.core_pattern= | usr/local/sbin/core_helper  %t  %e %p  %c

kernel.core_uses_pid= 0

$sysctl-p

 

core_helper:

#!/bin/sh

execgzip  ->/var/core/$1-$2-$3-$4.core.gz

在suse下的腳本爲:

exec gzip -c >/var/core/$1-$2-$3-$4.core.gz

管道符在2.6才支持


5. suid權限的程序的轉儲

kernel.suid_dumpable = 0
fs.suid_dumpable = 1

 

6.利用內核轉儲掩碼排除共享內存

多個進程使用同一個共享內存,共享內存達到幾個G,會生成很大的文件,對磁盤和系統都有影響,轉儲過程中會導致系統咱書停止服務。

設置方法, /proc/<PID>/coredump_filter

bit 0     匿名專用內存            

bit1      匿名共享專用內存      

bit2      file-backed專用內存

bit3      file-backed共享內存      

bit4      ELF文件映射 (2.6.24後可用)

example:

cat /proc/16278/coredump_filter
00000033

echo 1 > coredump_filter
cat coredump_filter
00000001

7.啓用整個系統的轉儲

1)在/etc/initscript中加入

ulimit -S -c 0 >/dev/null 2>&1   //禁用

ulimit -S -c 0 >/dev/null 2>&1   //開啓

/etc/sysconfig/init

DAEMON_COREFILE_LIMIT='ulimited'

2)直接修改/etc/security/limits.conf

 

3)在/etc/sysctl.conf加入

fs,syud_dumpable=1

使SUID的程序也能生成core。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章