코어파일을 이용한 디버깅

코어파일이란 프로세스에 예외가 발생해 중지되는 순간의 프로세스 수행 이미지를 말한다. 이러한 코어 파일에는 메모리, 레지스터, 스택 등의 정보들로 구성된다. 이러한 코어 파일에는 애초에 디버깅 정보를 메모리에 로드하지 않았으므로 디버깅을 위한 정보가 들어가 있지 않다. 따라서 코어 파일 디버깅을 위해서는 코어파일과 함께 디버깅 정보가 들어있는 프로그램 실행 파일(main)을 함께 사용해야 한다.


코어 파일이 생성될 수 있는 예외 상황으로는 다음과 같은 것들이 있다.

  1. 키보드 종료 신호
  2. 잘못된 명령어 수행
  3. 디버깅을 위한 브레이크 포인트
  4. 비정상 오류
  5. 잘못된 메모리 참조
  6. CPU 시간 제한 초과
  7. 파일 크기 제한 초과
  8. 잘못된 시스템 콜

이러한 예외 상황이 발생할 경우 코어 파일은 자동으로 생기나 만약 생기지 않는다면 쉘에서 코어 파일의 크기가 0으로 설정되어 있는 경우이므로 이 때, 다음 명령어를 통해 코어 파일이 생길 수 있도록 해 두자.

$ unlimit -S -c 100000000


생성된 코어파일을 이용해 gdb를 수행하는 방법은 다음과 같다.

gdb {program_name} {core_file_name} : gdb main core.1408


이렇게 gdb를 실행하면 코어 파일에 있는 정보로 무엇 때문에 프로그램이 이상 종료했는지 출력하고, 심볼을 로드하고 어떤 함수에 문제가 있었는지 출력해 준다. 다음으로는 bt를 통해 스택프레임 정보를 확인하고 각종 명령어들을 사용하며 디버깅하면 된다.


실행중인 프로세스 디버깅

프로그램이 가끔 알지 못하는 이유로 오동작을 발생시킨다면 코어 파일도 없고 디버깅하기에 상당히 어려움을 줄 것이다. 이러한 경우에 gdb를 이용해 s 명령을 통해 계속 반복적으로 동작시키는 것은 상당한 시간 낭비일 것이다.

이러한 경우들에는 그냥 프로그램을 수행 시키고 오동작이 발생한 시점에 attach 명령으로 해당 프로그램에 gdb를 붙여 디버깅을 하면 된다.

사용되는 명령어는 다음과 같다.

$ attach {PID}

'빌드&테스트도구 > gdb' 카테고리의 다른 글

gdb(1) - gdb 기본 사용방법  (1) 2020.09.14

+ Recent posts