목차

  1. 1. gdb를 통해 프로그램 실행
  2. 2. 브레이크 포인트 등록
  3. 3. 프로그램 시작
  4. 4. 브레이크 포인트에 걸린 후 이어서 진행
  5. 5. 자주 사용하는 명령어
  6. 6. print 포맷 종류
  7. 7. 쓰레드 정보 확인
  8. 8. (info threads 명령어를 통해 출력된 id값을 통한)쓰레드 진입
  9. 9. 레지스터 정보 확인
  10. 10. 어셈블러 덤프
  11. 11. layout
  12. 12. 특정 변수 값의 주소 출력
  13. 13. 특정 변수의 헥사값 출력
  14. 14. gdb에서 긴 문자열을 줄이지 않고 그대로 출력
  15. 15. gdb에서 중복된 문자열을 그대로 풀어서 출력
  16. 16. px pn
  17. 17. 실행 중인 프로세스의 특정 쓰레드 진입
  18. 18. sysroot / solib-search-path / substitute-path

gdb를 통해 프로그램 실행

1
gdb {(경로포함)프로그램명}

브레이크 포인트 등록

1
(gdb) b 소스파일명:라인넘버

프로그램 시작

1
(gdb) r {인자를 추가해야한다면 입력}

브레이크 포인트에 걸린 후 이어서 진행

1
(gdb) c

자주 사용하는 명령어

1
2
3
4
5
6
bt(=backtrace)
p(=print)
set print pretty on(or off)
f(=frame)
up
down

1
2
3
4
5
6
d decimal
x hex
t binary
f floating point
i instruction
c character

쓰레드 정보 확인

1
(gdb) info threads

(info threads 명령어를 통해 출력된 id값을 통한)쓰레드 진입

1
(gdb) thread {id}

레지스터 정보 확인

1
(gdb) info registers
  • rax (eax) : 누산기(accumulator) 레지스터. 산술연산(덧셈, 나눗셈, 곱셈)이나 논리연산을 수행한 반환값이 저장
  • rbx (ebx) : 베이스 레지스터
  • rcx (ecx) : 카운터 레지스터. 반복 명령어 사용 시 반복 카운터로 사용되는 값을 저장
  • rdx (edx) : 데이터 레지스터. 산술연산과 I/O 명령에서 rax(eax)와 함께 사용
  • rsi (esi) : source 인덱스 레지스터
  • rdi (edi) : destination 인덱스 레지스터
  • rbp (ebp) : 베이스 포인터 레지스터. 스택의 시작 지점 주소를 저장
  • rsp (esp) : 스택 포인터 레지스터. 스택의 가장 마지막 지점 주소를 저장
  • rip : 명령 포인터 레지스터이다. 현재 명령의 위치를 가리킴

어셈블러 덤프

1
(gdb) disas

layout

1
2
3
(gdb) layout src
(gdb) layout asm
(gdb) layout reg

특정 변수 값의 주소 출력

1
(gdb) p &{변수명}

특정 변수의 헥사값 출력

1
(gdb) x/{출력할크기}bx {변수의 주소값}

gdb에서 긴 문자열을 줄이지 않고 그대로 출력

1
(gdb) set print elements 0

gdb에서 중복된 문자열을 그대로 풀어서 출력

1
(gdb) set print repeats 0

px pn

Boost::shared_ptr을 사용한다면 gdb 디버깅 시 px와 pn정보를 출력할 수 있음

1
2
element_type* px;                   // contained pointer
boost::detail::shared_count pn; // reference count

실행 중인 프로세스의 특정 쓰레드 진입

프로세스가 실행 중인 상태에서 특정 쓰레드 id를 통해 gdb 진입이 가능하며, 이후 CTRL + C를 통해 해당 쓰레드의 흐름을 중단하여 backtrace 확인이 가능함(c 명령어를 통해 실행 재개)

1
gdb -p {gdb로 확인할 쓰레드 id}

sysroot / solib-search-path / substitute-path

아래 command들은 gdb 실행 시 -ex 옵션(execute a single GDB command)으로 추가해주면 유용함

  • set sysroot {path}
  • set solib-search-path {path}
  • set substitute-path {original path} {substitute path}

Reference