Post

[Linux] Core Dump

Core Dump

Core Dump는 프로그램이 비정상적으로 종료될 때 그 시점의 메모리 상태를 기록한 파일이다. Core Dump는 메모리, 레지스터, 스택 등 시스템 상태 정보를 포함한다.

기본적으로 리눅스에서 core dump 파일 크기에 제한이 있을 수 있다. core dump 파일 크기 제한을 보려면 ulimit -a 명령어로 확인하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-m: resident set size (kbytes)      unlimited
-u: processes                       63627
-n: file descriptors                1048576
-l: locked-in-memory size (kbytes)  65536
-v: address space (kbytes)          unlimited
-x: file locks                      unlimited
-i: pending signals                 63627
-q: bytes in POSIX msg queues       819200
-e: max nice                        0
-r: max rt priority                 0
-N 15:                              unlimited

위에 나온 정보들을 보면 리눅스에서 사용자의 자원 제한 설정을 볼 수 있다. 여기서 core file size이 0으로 설정되어 있는 모습을 볼 수 있는데, ulimit -c unlimited 명령어를 사용하여 자원 제한 설정을 해제하면 된다. 해당 설정을 영구적으로 하고 싶으면 쉘에 ulimit -c unlimited 명령어를 추가하면 된다.

1
2
3
4
ps # 사용하는 쉘 확인: zsh - zshrc, bash - bashrc
vi ~/.zshrc # zsh로 가정
ulimit -c unlimited # .zshrc에 저장
source ~/.zshrc

Core Dump 분석

Core Dump를 분석하기 위해서는 Core Dump가 발생했을 때 파일이 어디에 저장되었는지를 확인해야 한다.

cat /proc/sys/kernel/core_pattern 명령어로 Core Dump 파일 경로 및 형식을 확인한다. 만약 Core Dump가 발생한 경로에서 Core Dump 파일이 생성되게 한다면 sudo sh -c 'echo "core.%e.%p" > /proc/sys/kernel/core_pattern' 명령어를 작성하면 된다. 이는 일시적으로 적용되는 것이라 영구적으로 설정하고 싶다면 /etc/sysctl.conf을 수정해야 한다.

1
2
3
4
5
6
7
$ ls
vuln
$ ./vuln
Input: AAAAAAAAAAAAAAAA
Segmentation fault (core dumped)
$ ls
vuln core.vuln.30583

위 예시를 보면 vuln프로그램이 비정상적으로 종료되어서 Segmentation fault (core dumped)가 나타나고, core dump 파일이 생성된 것을 볼 수 있다.

1
$ gdb ./vuln ./core.vuln.3053

gdb ./program ./core dump file이 형식으로 gdb를 하면 signal error numbereip, corruption reason이 보인다. 위와 같은 정보로 디버깅 하면 된다.

Ref

[1] Core Dump Analysis (gdb)