리눅스 코어 덤프(coredump)란? 디버깅

코어 덤프란?

코어 덤프는 프로그램이 비정상적으로 종료될 때 그 시점의 메모리 상태와 레지스터 값, 스택 트레이스 등의 정보를 담고 있는 파일입니다. 어떤 이유로 프로그램이 죽었는지 디버깅할 때 활용됩니다. 코어덤프는 바이너리로 저장되지만 GDB 같은 디버거로 덤프 파일의 내용을 읽을 수 있습니다.

코어 덤프 생성 예시

리눅스에서 임의로 코어 덤프가 떨어지는 소스 코드를 컴파일하고 실행하여 확인해 보겠습니다.

 

우선 코어 덤프 파일이 생성되도록 터미널에서 아래의 명령어를 실행합니다. 이 명령은 현재 셸에 대해 코어 덤프 파일 크기의 제한을 해제합니다.

[root@localhost coredump]# ulimit -c unlimited

 

NULL 포인터를 참조하려고 시도하여 Segmentation Fault를 유발하는 아래의 C 소스 코드를 coreTest.c라는 파일명으로 저장하겠습니다.

#include <stdio.h>

int main(void) {
    int *p = NULL;
    *p = 10;
    return 0;
}

 

코어덤프 발생 소스코드

 

[root@localhost coredump]# ll
total 4
-rwxr-xr-x. 1 root root 86 Aug  5 09:59 coreTest.c

 

gcc를 사용하여 소스를 컴파일합니다. coreTest로 실행 파일을 만들었습니다.

[root@localhost coredump]# gcc -o coreTest coreTest.c
[root@localhost coredump]# ll
total 16
-rwxr-xr-x. 1 root root 8352 Aug  5 10:04 coreTest
-rwxr-xr-x. 1 root root   86 Aug  5 09:59 coreTest.c

 

coreTest를 실행하면 Segmentation fault 오류와 함께 코어 덤프가 떨어졌다는 메시지가 나옵니다.

[root@localhost coredump]# ./coreTest
Segmentation fault (core dumped)

 

코어 덤프는 core.* 형태의 파일명으로 저장됩니다. 다만 이 파일은 바이너리 파일이라 일반 편집기로는 읽을 수가 없습니다.

[root@localhost coredump]# ls
core.21523  coreTest  coreTest.c

 

GDB(GNU Debugger)와 같은 디버거를 사용하면 코어 덤프 파일의 내용을 읽을 수 있습니다.

[root@localhost coredump]# gdb coreTest core.21523

 

출력된 GDB 메시지를 보면 coreTest가 Segmentation fault로 인해 종료되었고 이로 인해 core.21523 코어 덤프 파일이 생성됐습니다. 이유는 잘못된 메모리 참조이고 중단된 위치는 #0 0x00000000004004fd in main () 입니다. main() 함수에서 중단된 걸 알 수 있습니다.

 

코어덤프 내용

 

반응형

댓글

Designed by JB FACTORY