GDB 사용법

March 06, 2020    1 분 소요

사용할 일이 많은데 갑자기 생각이 나지 않는 경우가 많아서 관련 명령어들을 몇가지 적어둔다.

실행 옵션

  • gdb -q [file] : gdb실행시 출력 문구 생략
  • gdb --args [file] [arg1] [arg2] ... : 인자 전달
  • gdb [file] [core] : 코어 파일 분석

GDB 명령어

1. 기본 명령어

  • set disassembly-flavor intel : intel형식 asm 출력
  • disas [func] : 함수 disassemle
  • b *[func] + @ : break point 설정
  • d @ : break point 해제
  • r si ni cont bt : run / step in / step over / continue / backtrace

2. 정보 출력

  • info b : break point 상태 출력
  • info registers [reg] : 특정 register 정보 출력
  • info reg : registry 정보 출력
  • x/(num)wx [address] : 4byte 단위로 num만큼을 16 진수로 출력
    (b : 1 byte / h : 2 byte / w : 4 byte / g : 8 byte)
  • x/(num)i [address] : instruction단위로 num만큼을 출력
  • x/(num)s [address] : 문자열 단위로 num만큼을 출력

3. TUI

  • tui enable : tui 활성화
  • layout asm : tui의 asm창 켜기
  • layout reg : tui의 reg창 켜기
  • tui disable : tui 비활성화 (글자가 깨지면 비활성화 했다가 다시 키면 보통 해결됨)

4. 찾기

  • info proc map : 메모리 매핑 정보를 확인
  • find [start addr], [end addr], [data] : 찾을 데이터를 [start addr] 부터 [end addr]의 범위에서 찾음
    -> find 명령어의 범위를 설정해주기 위해 매핑 정보를 확인하자.

5. 메모리 설정

  • set {[type]}[addr/reg] = [data] : 특정 메모리/레지스터에 데이터 삽입
    1. set $rax=0x401000 : rax = 0x401000
    2. set {int}$rax=0x1 : *rax = 0x1
    3. set $rax="ABC" : *rax = “ABC”
    4. set {int}0x7fffffffe350=0x2 : *addr = 0x2
    5. set {int}0x7fffffffe350="ABC" : **addr = “ABC”

    => 대충 확인했던 결과인데 헷갈릴 수 있으므로 왠만하면 1, 2, 4번 꼴로 사용하는 걸로.

기타

Core Dump 관련사항

  • ulimit -a : core dump관련 설정 확인
  • ulimit -c unlimited : dump 파일 크기 제한 해제
  • ulimit -c 1048576 : 1GB로 제한

Core파일이 어디에 생성되는지 몰라서 find 명령어로 찾아보니 /var/lib/systemd/coredump에 lz4로 압축되어 저장되고 있었다.