GDB 사용법
실행방법
gdb program_name [core|pid]
소스 보기
내용 출력
> list
다음 페이지 보기
> enter
특정 페이지 보기
> l [line_number]
함수 보기
> l [func_name]
멤버함수 보기
> l [Class::func_name]
다른 파일의 함수 보기
> l [file_name:func_name]
이전 행의 출력
> l -
출력 행의 수 조절
> set listsize 20
브레이크 포인트
실행
> r
프로그램 스택 추적
> bt
그 밖에 명령어
b func | func 함수 시작 부분에 브레이크 포인트 설정 |
b 10 | 10행에 브레이크 포인트 설정 |
b file.c:func | file.c 파일의 func 함수에 브레이크 포인트 설정 |
b file.c:10 | file.c 파일의 10행에 브레이크 포인트 설정 |
b +2 | 현재 행에서 2개 행 이후 지점에 브레이크 포인트 설정 |
b -2 | 현재 행에서 2개 행 이전 지점에 브레이크 포인트 설정 |
b *0x8049000 | 0x8049000 주소에 브레이크 포인트 설정(어셈블리로 디버깅 시 시용) |
b 10 if var == 0 | 변수 var 값이 0 일 때, 10행에 브레이크 포인트 설정 |
브레이크 명령어 상태 설정
> condition [break_point no.] var == 0
중지
> disable [break_point no.]
시작
> enable [break_point no.]
일회용 브레이크 포인트 지정
> tb
삭제 명령
cl func | func 함수의 시작 부분에 브레이크 포인트 지움 |
cl 10 | 10행의 브레이크 포인트 지움 |
cl file.c:func | file.c 파일의 func 함수에 브레이크 포인트 지움 |
cl file.c:10 | file.c 파일의 10행의 브레이크 포인트 지움 |
d | 모든 브레이크 포인트를 지움 |
브레이크 포인트 리스트
> info breakpoints
자동 완성
> TAB
프로그램 실행
시작
> r arg1 arg2
종료
> k
s | 현재 행 수행 후 정지, 함수 호출 시 함수 내부로 들어감 |
s 5 | s를 5번 입력한 것과 동일 |
n | 현재 행 수행한 후 정지, 함수 호출 시 함수 수행 후 다음 행으로 감 |
n 5 | n을 5번 입력한 것과 동일 |
c | 브레이크 포인트를 만날 때까지 계속 진행 |
그 밖에 주요 진행 명령어
u | 현재 루프를 빠져 나감 |
finish | 현재 함수를 수행하고 빠져 나감 |
return | 현재 함수를 수행하지 않고 빠져 나감 |
return 123 | 현재 함수를 수행하지 않고 빠져 나감, 리턴 값은 123 |
si | 현재의 인스트럭션을 수행, 함수 호출 시 함수 내부로 들어감 |
ni | 현재의 인스트럭션을 수행, 함수 호출 시 함수 내부로 들어가지 않음 |
와치 포인트
와치 포인트를 설정하면 변수 값이 변할 때마다 break가 걸리면서 멈춘다
> watch [variable]
변수와 레지스터 값 검사
지역 변수의 출력
> info locals
전역 변수의 출력
> info variables
개별 변수의 출력
> p [변수명|함수명]
포인트 변수의 출력 (c 문법과 동일)
> p **ppt
레지스트 값 출력
> p $[레지스트명:eax|ebx|ecx|edx|eip]
레지스트 값 보기
> info registers
MMX를 비롯한 특수 레지스트 값 전체 보기
> info all-registers
포인터가 가리키는 구조체 배열 출력
> p *pt@[구조체 배열 크기]
포인터가 가리키는 구조체 배열의 첫째 원소만 출력
> p *pt
- 중복된 변수명이 있을 경우,
특정한 파일의 전역변수를 지정하고자 할 때,
p '[파일명]'::[변수명]
특정한 함수의 static 값을 확인하고자 할 때,
p [함수명]::[변수명]
특정 변수를 지정해서 출력
> p/[출력형식]
t | 2진수로 출력 |
o | 8진수로 출력 |
d | 부호가 있는 10진수로 출력(int) |
u | 부호가 없는 10진수로 출력(unsigned) |
x | 16진수로 출력 |
c | 최초 1바이트 값을 문자형으로 출력 |
f | 부동 소수점 값 형식으로 출력 |
a | 가장 가까운 심벌의 offset을 출력 |
타입이 틀릴 경우, 타입을 변환하여 출력
> p (char *)vstr
특별한 위치 지정
> p lstr + 4
> p (array[1] + 1)
변수 값 설정
> p lval = 1000
변하는 변수 값을 자동으로 display하기
display [변수명] | 변수 값을 매번 화면에 보여준다 |
display/[출력형식] [변수명] | 변수 값을 출력 형식으로 보여준다 |
undisplay [디스플레이 번호] | 디스플레이 설정을 없앤다 |
disable display [디스플레이 번호] | 디스플레이 설정을 일시중단한다 |
enable display [디스플레이 번호] | 디스플레이 설정을 활성화한다 |
스택의 상태 검사
스택 프레임 보기
> bt
frame [frame_no] | n번 스택 프레임으로 변경 |
up | 상위 스택 프레임으로 이동 |
up [frame_no] | n번 상위 스택 프레임으로 이동 |
down | 하위 스택 프레임으로 이동 |
down [frame_no] | n번 하위 스택 프레임으로 이동 |
info frame | 스택 프레임 정보를 출력 |
info args | 함수가 호출될 때 인자를 출력 |
info locals | 함수의 지역변수 출력 |
info catch | 함수의 예외 핸들러 출력 |
함수 모듈 테스트
> call func(args...)
프로세스에 시그널 전달
> signal SIGKILL
메모리 특정 영역에 값을 설정
> set {타입}[주소] = [값]
실행 중인 프로세스 디버깅
attach [PID]
- 멀티 프로세스의 경우도 attach를 사용하여 디버깅하면 된다.
멀티쓰레드 프로그램
pthread_join 함수가 호출되기 전에 pthread_create가 호출된 직후,
브레이크 포인트를 일반 프로그램과 같이 설정한다.
쓰레드 정지
> ctrl+z
프로세스 정지
> ctrl+c
쓰레드 정보 얻기
> info threads
브레이크 포인트 설정
> b [행번호] thread [브레이크될 쓰레드 번호]
쓰레드 이동
> thread [thread_no]
라이브러리 디버깅
소스 파일 정보 알려주기
> dir /usr/src/debug/glibc-2.3.2-201008303934/stdio-common
그 밖에 유용한 도구
-GUI 디버거 DDD
> ddd [prog_name] [core|pid]
strace
> strace -fFp [PID]
-f : 자식 프로세스의 시스템 콜까지 출력
-F : vfork()에 의해 생성된 프로세스까지 출력
-p : pid를 인자로 받는다
프로세스가 호출하는 공유라이브러리 알아내기
> ltrace