GDB 사용법
사용할 일이 많은데 갑자기 생각이 나지 않는 경우가 많아서 관련 명령어들을 몇가지 적어둔다.
실행 옵션
gdb -q [file]
: gdb실행시 출력 문구 생략gdb --args [file] [arg1] [arg2] ...
: 인자 전달gdb [file] [core]
: 코어 파일 분석
GDB 명령어
1. 기본 명령어
set disassembly-flavor intel
: intel형식 asm 출력disas [func]
: 함수 disassemleb *[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]
: 특정 메모리/레지스터에 데이터 삽입set $rax=0x401000
: rax = 0x401000set {int}$rax=0x1
: *rax = 0x1set $rax="ABC"
: *rax = “ABC”set {int}0x7fffffffe350=0x2
: *addr = 0x2set {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로 압축되어 저장되고 있었다.