프로그래밍/tools

GDB 사용법

붐비붐비 2011. 2. 7. 11:38

실행방법

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