core dump는 프로그램의 세그먼트 폴트 등의 비정상적인 종료가 발생하는 경우 커널에서 해당 프로세스와 관련된 메모리를 덤프시킨 파일이다. 해당 파일을 가지고 디버깅 하여 문제의 원인을 찾을 수 있다.
목차
1. 환경
OS : RHEL 6.5 (VM)
Kernel : 2.6.32-431.el6.x86_64
참고
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 이어야 한다.
참고
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
참고
limits.conf 파일에는 ulimit값을 적용할 domain, type, item, value가 들어가게 되어있다.
입력 형식은 다음과 같다. <domain> <type> <item> <value> <type> <item> |
3. dump 저장 위치
RHEL 6.x 은 core dump 파일을 abrtd와 abrt-ccpp 데몬에 의해 자동으로 수집, 저장한다.
참고
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 부분이 쉽게 보여진다. 이 부분을 중점적으로 버그질라나 구글을 통해 검색해 보면 문제의 원인에 대한 많은 팁을 얻을 수 있다.
참고
RHEL 6.1 이전에 포함된 abrt rpm 패키지에서는 아래와 같이 -- 를 붙혔야 한다.
$ abrt-cli --list $ abrt-cli --info $ abrt-cli --report |
이상으로 글을 마친다.