본문 바로가기
System

core dump 분석을 위한 gdb 사용법 간단 정리

by 라바킴 2020. 5. 15.

살다보면 기껏 키워놓은 프로그램이 어느 날 갑자기 죽었거나 hang 걸리며 뻗어버리는 반항하는 모습을 보게 됨. 내가 널 어떻게 키웠는데

일반적인 운영 로그/에러는 직접 logger를 만들어 따로 잘 저장해두겠지만 미처 고려하지 못한(생각보다 low한) 부분에선 바로 원인을 파악하기가 힘듦.

따라서 프로그램 실행 시, core dump를 남기게 설정한다면 프로그램이 돌연사했을때 특정 시점의 메모리 상태를 알 수 있어 이슈 파악에 매우 유용

 

unix 환경에서 이를 도와주는 디버깅 툴이 gdb (=gnu debugger)


 

1. core dump 구조

 

core 파일은 ELF 형식

 

[ ELF - Executable and Linkable Format ]

실행 파일, 오브젝트 파일, 공유 라이브러리 그리고 '코어 덤프'를 위한 표준 파일 형식.

1999년 86open 프로젝트에 의해 x86 기반 유닉스, 유닉스 계열 시스템들의 표준 바이너리 파일 형식으로 선택됐다블라블라 (....)

 

1) ELF Header

2) Program Header

3) Section Header

 

 

따라서 readelf 명령을 통해 구조를 볼 수 있는데
아래와 같이 실행했을 때 LOAD 타입의 segment들이 바로
커널에서 vm_area_struct (vma) 구조체로 표현되는 메모리 구역이다.

 


 

2. file debugging

[ dump file 확보 ]

1) core dump 남기도록 설정

ulimit -a 
  • 각 옵션 간략 설명

2) debug 대상 파일 확인

만약 프로그램이 여러개가 돌고있는 환경이라면 특정 dump가 어떤 프로그램이 만든것인지 확인 필요

file [core dump file]
  • /proc/sys/kernel/core_pattern 에서 정의된 형태로 만들어짐
    • %p : pid
    • %u : uid
    • %g : gid
    • %s : signal number
    • %t : dump time (unix)
    • %h : hostname
    • %e : process

[ debugging ]

gdb [프로그램명] [코어파일명]

2-1) call stack & backtrace 

  - 전체 stack 정보를 나열해줌 (역추적할 대상들)

  - stack은 실행중인 함수 정보를 표기하며 이를 frame이라 함

  - full 옵션을 붙이면 좀 더 자세한 정보 제공

(gdb) bt
(gdb) bt full

 

2) stack 소스 코드 확인

(gdb) list

 

3) 의심되는 stack frame 분석

  - info frame은 각 frame의 보다 상세한 정보 제공

    - stack frame at 0x : 해당 함수의 sp 

    - called by frame at 0x : 해당 함수를 호출한 함수의 sp (ex. main)

    - Arglist at 0x : 해당 함수가 호출하는 함수의 bp 

    - args : 인자 정보

    - Saved registers: rip, ebp ...

(gdb) f [frame num] + (gdb) info frame
(gdb) info frame [frame num]

 

4) 해당 stack의 argument/local value 확인

  - info frame 보다 간결하지만 인간친화적

(gdb) info arg
(gdb) info local 

 

위와 같은 방식으로 코어 덤프 파일로부터 콜스택을 추적하여 프로그램이 비정상 종료된 원인을 찾아낸다. 자세한 명령어 및 검사방법은 GDB 기본 명령어 참조한다.


3. process debugging

방식으로 코어 덤프 파일로부터 콜스택을 추적하여 프로그램이 비정상 종료된 원인을 찾아낸다. 자세한 명령어 및 검사방법은 GDB 기본 명령어 참조한다. 

이미 떨궈진 덤프 파일 뿐만 아니라 프로그램을 실행시키며 분석도 가능하다.

현재 프로세스의 스택 정보를 시작으로 정지점 이나 조건, watch 등 다양한 방법을 사용하여 디버깅을 진행한다.

 

[ debugging ]

gdb [프로세스명] [pid]

 

 

 

(참고) 같이 보면 좋은 링크

ELF(Executable and Linkable Format) [네이버블로그]

리눅스 core dump 파일 오류 확인 방법[메모장입니다.]

core 파일 구조 [egloos]

stack frame 해석하기 [두께루의 임베디드 소프트웨어 디자인]

[gdb] The GNU Debugger : 3. Stack 정보 분석하기 [Developer's Delight]

 

 

'System' 카테고리의 다른 글

I/O Multiplexing 톺아보기 (2부)  (1) 2021.02.16
I/O Multiplexing 톺아보기 (1부)  (0) 2020.11.25

댓글