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로 압축되어 저장되고 있었다.