Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++ 코어 덤프 디버깅 방법 완벽 가이드

C/C++에서 코어 덤프(Core Dump)란 무엇인가?

프로그램에 오류가 발생하면 운영체제는 해당 프로세스를 강제로 종료시키면서 코어 덤프(core dump)를 생성합니다. 코어 덤프가 발생하는 가장 대표적인 원인은 프로그램이 NULL 포인터처럼 유효하지 않은 포인터 값에 접근하거나, 자신에게 할당된 메모리 영역을 벗어난 주소를 참조하는 경우입니다.

운영체제는 프로세스가 비정상 종료될 때 당시의 메모리 상태와 실행 정보를 파일로 저장하여, 개발자가 문제의 원인을 분석할 수 있도록 도와줍니다.

코어 덤프를 활용한 디버깅 방법

생성된 코어 파일을 활용하면 프로그램이 충돌한 시점의 상태를 그대로 재현하며 원인을 진단하고 디버깅할 수 있습니다. 디버깅 절차는 다음과 같습니다.

1. 디버깅 정보 포함하여 컴파일하기

코어 덤프를 효과적으로 분석하려면 프로그램을 컴파일할 때 반드시 -g 옵션을 사용해야 합니다. 이 옵션을 추가하면 실행 파일에 소스 코드 줄 번호, 변수 이름 등의 디버깅 정보가 포함되어 gdb에서 더 자세한 분석이 가능합니다.

$ gcc -g -o myprogram myprogram.c

2. 코어 덤프 위치 확인하기

기본적으로 코어 덤프는 /proc/sys/kernel 디렉터리 설정에 따라 생성됩니다. 시스템마다 코어 파일의 저장 경로나 생성 여부가 다를 수 있으므로, 필요하다면 ulimit -c unlimited 명령으로 코어 덤프 생성을 활성화할 수 있습니다.

3. gdb로 코어 파일 열기

코어 파일이 준비되었다면 GNU 디버거(gdb)를 사용해 아래와 같이 실행합니다.

$ gdb nameOfExecutable core

이 명령을 실행하면 gdb가 코어 파일을 열고 프로그램이 충돌한 지점의 콜 스택, 변수 값, 레지스터 상태 등을 확인할 수 있습니다. 이후 일반적인 디버깅 과정처럼 backtrace, frame, print 등의 명령을 활용해 오류 원인을 추적하면 됩니다.

gdb 사용법 익히기

gdb 사용이 처음이라면 IBM DeveloperWorks에서 제공하는 공식 튜토리얼을 참고하는 것을 추천합니다. 기본적인 브레이크포인트 설정부터 스택 분석까지 체계적으로 학습할 수 있습니다.
참고 링크: https://www.ibm.com/developerworks/library/l-gdb/

정리

코어 덤프 디버깅은 C/C++ 프로그램의 세그먼테이션 폴트(segmentation fault) 같은 치명적인 오류를 해결하는 데 필수적인 기술입니다. 핵심 단계를 요약하면 다음과 같습니다.

  • 프로그램을 -g 옵션과 함께 컴파일한다
  • 코어 덤프 생성이 활성화되어 있는지 확인한다
  • gdb 실행파일 core 명령으로 코어를 연다
  • 콜 스택과 변수 값을 분석해 오류 지점을 찾는다