core dump는 프로그램의 세그먼트 폴트 등의 비정상적인 종료가 발생하는 경우 커널에서 해당 프로세스와 관련된 메모리를 덤프시킨 파일이다. 해당 파일을 가지고 디버깅 하여 문제의 원인을 찾을 수 있다.

 

1. 환경

OS : RHEL 6.5 (VM)

Kernel : 2.6.32-431.el6.x86_64

  icon-info-circle 참고

RHEL 6.x 이전의 core dump 에 대한 설정 방법은 조금 다르다.

이 문서에서는 RHEL 6.x를 기준으로 작성하였다.

 

2. 설정

2.1. 설정 확인

[root@Kicksatrt-server ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 11589
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) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 11589
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

파라미터 중 core file size의 값(KB)이 0 이상이거나 unlimited 이어야 한다.

 icon-info-circle  참고

RHEL의 기본적인 core file size는 0이다. 즉, crash가 발생되도 core dump를 남기지 않는다.

2.2. 설정 하기

쉘 상에서 아래와 같이 설정을 하면 바로 적용이 된다. 하지만 재부팅 후 해제된다.

[root@Kicksatrt-server ~]# ulimit -c unlimited   --> 제한 없음
[root@Kicksatrt-server ~]# ulimit -a
core file size          (blocks, -c) unlimited
.
.
[root@Kicksatrt-server ~]# ulimit -c 1048576     --> 1GByte로 제한
[root@Kicksatrt-server ~]# ulimit -a
core file size          (blocks, -c) 1048576
.
.

아래 두 가지 방법 중 하나를 적용을 하면 영구 적용된다.

방법 1)

[root@Kicksatrt-server ~]# vim /etc/profile  --> 맨 아래줄에 한 줄 추가한다.
.
.
ulimit -c unlimited > /dev/null 2>&1

방법 2)

[root@Kicksatrt-server ~]# vim /etc/security/limits.conf  --> core가 명시된 1줄을 주석 제거, 수정
.
.
#<domain>      <type>  <item>         <value>
#

*                soft    core            -1     --> -1은 unlimited 이다.(기본은 0 임)
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4

 icon-info-circle 참고

limits.conf 파일에는 ulimit값을 적용할 domain, type, item, value가 들어가게 되어있다.

 

3. dump 저장 위치

RHEL 6.x 은 core dump 파일을 abrtd와 abrt-ccpp 데몬에 의해 자동으로 수집, 저장한다.

 icon-info-circle 참고

abrtd, abrt-cpp는 Fedora12, RHEL 6.x 부터 추가된 패키지로 커널 및 어플리케이션 크래쉬를 자동으로 감지하여 보고해 주는 도구이다. 따라서 core dump가 발생되길 원한다면 abrtd와 abrt-cpp 데몬은 실행되도록 한다.

또한 kernel.core_pattern 은 아래와 같이 설정이 되어 있다.

[root@Kicksatrt-server ~]# sysctl -a | grep kernel.core_pattern
kernel.core_pattern = |/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e

/etc/sysctl.conf 에서 kernel.core_pattern 의 경로와 파라미터를 변경하려 하여도 abrtd, abrt-ccpp 데몬에 의해 자동으로 위와 같은 값으로 변경된다.

따라서 RHEL 6.x 전의 Legacy 방식으로 경로를 지정해 주기 위해서는 abrtd, abrt-ccpp 데몬을 올리지 않고서 지정해 주어야 한다.

3.1. 기본 위치

저장 위치는 /var/spool/abrt 이다.

3.2. 위치 변경

arbtd 및 arbt-cpp 데몬에 의해 /var/spool/abrt 디렉토리 내에 dump 파일이 떨어지게 되는데 위치 변경을 위해서는 아래와 같이 한다.

# abrt.conf 파일을 수정한다.
[root@Kicksatrt-server ~]# vim /etc/abrt/abrt.conf
.
.
#DumpLocation = /var/spool/abrt  --> 기본 값이고, 주석처리되어 있다.
DumpLocation = /var/crash  --> 원하는 경로를 넣는다.
.
.

# abrtd 데몬 restart
[root@Kicksatrt-server ~]# /etc/init.d/abrtd restart
Stopping abrt daemon:                                      [  OK  ]
Starting abrt daemon:                                      [  OK  ]

 

4. dump test

4.1. 프로세스 fault 발생

kill 시그널 중에 SIGFPE 또는 ISGQUIT를 통해서 core를 dump 시킬 수 있다.

top을 실행 시키고 해당 프로세스를 일부로 fault 내보자.

# screen 터미널을 띄운다.
[root@Kicksatrt-server ~]# screen

# top을 띄우고 빠진다.
[root@Kicksatrt-server ~]# top  --> top 실행 후 Ctrl + A and D 를 눌러 detached 하여 빠짐
[detached]

# 프로세스 넘버 확인
[root@Kicksatrt-server ~]# ps aux | grep top | egrep -v grep
root      1849  0.1  0.0  15036  1248 pts/1    S+   11:45   0:00 top

# 프로세스 Fault 발생 시키기
[root@Kicksatrt-server ~]# kill -SIGFPE 1849

4.2. 코어 덤프 확인

[root@Kicksatrt-server ~]# ls -la /var/spool/abrt
total 16
drwxr-xr-x.  3 abrt abrt 4096 Nov 17 11:47 .
drwxr-xr-x. 13 root root 4096 Oct 20 23:11 ..
-rw-r--r--.  1 root root    0 Oct 20 23:10 abrt-db
drwxr-x---   2 abrt root 4096 Nov 17 11:48 ccpp-2014-11-17-11:47:55-1849
-rw-------   1 root root   12 Nov 17 11:47 last-ccpp

# last-ccpp를 통해 마지막으로 crash 된 프로세스 파일을 확인할 수 있다.
[root@Kicksatrt-server ~]# cat /var/spool/abrt/last-ccpp
/usr/bin/top

# ccpp-* 디렉토리를 보면 분석을 위한 각종 파일들이 있다.
[root@Kicksatrt-server ~]# ls -la /var/spool/abrt/ccpp-2014-11-17-11\:47\:55-1849/
total 2188
drwxr-x---  2 abrt root    4096 Nov 17 11:48 .
drwxr-xr-x. 3 abrt abrt    4096 Nov 17 11:47 ..
-rw-r-----  1 abrt root       5 Nov 17 11:47 abrt_version
-rw-r-----  1 abrt root       4 Nov 17 11:47 analyzer
-rw-r-----  1 abrt root       6 Nov 17 11:47 architecture
-rw-r-----  1 abrt root       0 Nov 17 11:47 cgroup
-rw-r-----  1 abrt root       3 Nov 17 11:47 cmdline
-rw-r-----  1 abrt root       6 Nov 17 11:47 component
-rw-r-----  1 abrt root  626688 Nov 17 11:47 coredump
-rw-r-----  1 abrt root       1 Nov 17 11:48 count
-rw-r-----  1 abrt root     633 Nov 17 11:48 dso_list
-rw-r-----  1 abrt root    3327 Nov 17 11:47 environ
-rw-r-----  1 abrt root      12 Nov 17 11:47 executable
-rw-r-----  1 abrt root      16 Nov 17 11:47 hostname
-rw-r-----  1 abrt root      21 Nov 17 11:47 kernel
-rw-r-----  1 abrt root      10 Nov 17 11:47 last_occurrence
-rw-r-----  1 abrt root    1323 Nov 17 11:47 limits
-rw-r-----  1 abrt root    3158 Nov 17 11:47 maps
-rw-r-----  1 abrt root     261 Nov 17 11:47 open_fds
-rw-r-----  1 abrt root      54 Nov 17 11:47 os_release
-rw-r-----  1 abrt root      19 Nov 17 11:47 package
-rw-r-----  1 abrt root       4 Nov 17 11:47 pid
-rw-r-----  1 abrt root       5 Nov 17 11:47 pwd
-rw-r-----  1 abrt root      52 Nov 17 11:47 reason
-rw-r-----  1 abrt root 1737180 Nov 17 11:48 sosreport.tar.xz
-rw-r-----  1 abrt root      10 Nov 17 11:47 time
-rw-r-----  1 abrt root       1 Nov 17 11:47 uid
-rw-r-----  1 abrt root       5 Nov 17 11:47 username
-rw-r-----  1 abrt root      40 Nov 17 11:48 uuid
-rw-r-----  1 abrt root     872 Nov 17 11:48 var_log_messages

# reason 파일에 crash 원인에 대한 내용이 있다. SIGFPE kill signal에 의해 죽었다고 표기됨.
[root@Kicksatrt-server ~]# cat /var/spool/abrt/ccpp-2014-11-17-11\:47\:55-1849/reason
Process /usr/bin/top was killed by signal 8 (SIGFPE)

# crash된 프로세스의 pid 값 확인
[root@Kicksatrt-server ~]# cat /var/spool/abrt/ccpp-2014-11-17-11\:47\:55-1849/pid
1849

4.3. abrt-cli 으로 확인

abrt-cli 명령을 통해 dump 리스트, 정보, 레포팅을 확인 할 수 있다. abrt-gui도 있지만 여기서는 cli 만 다룬다.

# list를 통한 덤프 목록 확인. 덤프가 여러개라면 그 수만큼 출력된다. 
[root@Kicksatrt-server ~]# abrt-cli list
@0
Directory:      /var/spool/abrt/ccpp-2014-11-17-11:47:55-1849
count:          3
executable:     /usr/bin/top
package:        procps-3.2.8-25.el6
time:           Mon 17 Nov 2014 11:47:55 AM KST
uid:            0
# info를 통해 dump 디렉토리를 지정하여 확인
[root@Kicksatrt-server ~]# abrt-cli info /var/spool/abrt/ccpp-2014-11-17-11\:47\:55-1849/
Directory:      /var/spool/abrt/ccpp-2014-11-17-11:47:55-1849/
count:          3
executable:     /usr/bin/top
package:        procps-3.2.8-25.el6
time:           Mon 17 Nov 2014 11:47:55 AM KST
uid:            0
# report는 덤프 디렉토리의 파일들 내용을 조합하여 출력해 준다.
[root@Kicksatrt-server ~]# abrt-cli report /var/spool/abrt/ccpp-2014-11-17-11\:47\:55-1849/
# Please check this report. Lines starting with '#' will be ignored.
# Lines starting with '%----' separate fields, please do not delete them.

%----comment
# Describe the circumstances of this crash below

%----backtrace
# Backtrace
# Check that it does not contain any sensitive data (passwords, etc.)
[New Thread 1849]
Core was generated by `top'.
Program terminated with signal 8, Arithmetic exception.
\#0  0x0000003b04ce15c3 in __select_nocancel () from /lib64/libc.so.6

Thread 1 (Thread 1849):
\#0  0x0000003b04ce15c3 in __select_nocancel () from /lib64/libc.so.6
No symbol table info available.
\#1  0x0000000000409f90 in ?? ()
No symbol table info available.
\#2  0x0000003b04c1ed1d in __libc_start_main () from /lib64/libc.so.6
No symbol table info available.
\#3  0x00000000004020f9 in ?? ()
.
.
중략
.
.
%----duphash
# DUPHASH
# This field is read only
560ff34ce592da9d7ef5840c58931eda8db26cc4
%----architecture
# Architecture
# This field is read only
x86_64
%----cmdline
# Command line
top
%----component
# Component
# This field is read only
procps
%----coredump
# Core dump
# This field is read only
/var/spool/abrt/ccpp-2014-11-17-11:47:55-1849/coredump
%----executable
# Executable
# This field is read only
/usr/bin/top
%----kernel
# Kernel version
# This field is read only
2.6.32-431.el6.x86_64
%----package
# Package
# This field is read only
procps-3.2.8-25.el6
%----reason
# Reason of crash
Process /usr/bin/top was killed by signal 8 (SIGFPE)
%----os_release
# Release string of the operating system
# This field is read only
Red Hat Enterprise Linux Server release 6.5 (Santiago)

* 코어에서 뽑을 수 있는 로그의 핵심인 Backtrace 부분이 쉽게 보여진다. 이 부분을 중점적으로 버그질라나 구글을 통해 검색해 보면 문제의 원인에 대한 많은 팁을 얻을 수 있다.

 icon-info-circle 참고

RHEL 6.1 이전에 포함된 abrt rpm 패키지에서는 아래와 같이 -- 를 붙혔야 한다.

$ abrt-cli --list

$ abrt-cli --info

$ abrt-cli --report

 

이상으로 글을 마친다.

core dump 설정

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다