리처드 스톨만이 개발한 디버거로써 유닉스 계열과 윈도우에서 사용 가능합니다.
gdb
gdb 명령 실행후 file이라는 명령으로 프로그램을 호출할 수 있습니다.
gdb [프로그램]
인자로 받은 실행파일을 디버깅 합니다.
gdb [프로그램][core file]
코어파일을 사용할 때 동시에 인자로 줍니다.
코어파일 확인하기
//list 생성시간을 역순으로 보여주여 제일 아래 있는 core파일이 최근 생성된 파일
ls -lrt /var/coredumps/
gdb [프로그램][PID]
실행중인 프로세스를 디버깅하기위해 프로세스 ID를 두번째 인자로 주면, 1234라는 파일이 없다면 프로세스 1234에 접속시킵니다. (단, core파일을 먼저 찾습니다)
만약 컴파일 옵션에 -g 를 주지 않았다면 gdb 실행사 다음과 같은 에러를 만날 수 있다.
No symbol table is loaded. Use the "file" command.
명령어 | 설명 |
---|---|
list | 현재 위치에서 소스 파일의 내용을 10줄 보여줌 |
run | 프로그램 시작 (break가 있다면 break까지 실행)run arg : 새로운 인수를 가지고 프로그램 시작 |
break | 특정 라인이나 함수에 중지점을 설정, break function : 현재 파일 안의 함수 function에 정지 설정, break file function : 파일 file안의 function에 중지 설정, watch : 감시점 설정, until : 실행 중 line까지 실행, clear 특정 라인이나 함수에 있던 중지점 삭제 |
delete | 몇몇 정지점이나 자동으로 출력되는 표현 삭제 |
next | 다음 행을 수행. 서브루틴을 호출하면서 계속 수행, next n : n번 수행 |
step | 한 줄씩 실행 함수를 포함하고 있으면 함수 내부로 들어가서 한 줄씩 실행 |
print expr : 수식의 값을 보여줌 | |
display | 현재 display된 명령의 목록을 보여줌 |
bt | 프로그램 스택을 보을 보여줌(backtrace) |
kill | 디버깅 중인 프로그램의 실행 취소 |
file | file program : 디버깅할 프로그램으로서 파일을 사용 |
cont | continue : 현재 위치에서 프로그램을 계속 실행 |
help | 명령에 관한 정보를 보여주거나 일반적인 정보를 보여줌 |
quit | gdb에서 빠져나감 |
//main 함수를 기점으로 소스의 내용이 출력됩니다.
ㅣ
//5행부터 15행까지 출력됩니다. (10행 기준으로 10줄)
l 10
//func함수의 소스를 출력합니다.
l func
//a.c파일의 func 함수를 출력합니다.
l a.c:func
//a.c 파일의 10행을 기준으로 출력합니다.
l a.c:10
//한번에 출력하는 라인 수를 20으로 바꿉니다.
set listsize 20
//마지막 실행 명령어를 한번 더 실행합니다.
ENTER 키 입력
//프로그램 재시작
r
// a1, a2를 인자로 프로그램 실행
r a1 a2
// 프로그램 종료
k
//오류가 발생한 함수를 역으로 찾아감
bt
//같은 동작
where
// func 함수에 브레이크 포인트 설정
b func
// 10행에 브레이크 포인트 설정
b 10
// a.c 파일의 func 함수에 브레이크 포인트 설정
b a.c:func
//a.c 파일의 10행에 브ㄹ이크 포인트 설정
b a.c:10
//현재 행에서 2개 행 이후 지점에 브레이크 포인트 설정
b +2
//현재 행에서 2개 행 이전 지점에 브레이크 포인트 설정
b -2
// 0x1234 주소에 브레이크 포인트 설정 (어셈블리 디버깅시 사용)
b 0x1234
// 10행에 브레이크 포인트를 성정하되 var == 10일 때 작동
b 10 if var = 0
//임시 중단점을 사용하는 것으로 한번만 설정되며 이후 삭제됨
tb
// 고유번호 2인 브레이크 포인트에 var == 0이면 동작하라고 설정
condition 2 var == 0
//func 함수의 시작부분의 브레이크 포인트 지움
cl func
// 10행의 브레이크 포인트 지움
cl 10
//고유번호 1인 브레이크 포인트 지움
delete 1
// a.c 파일의 func 함수의 브레이크 포인트 지움
cl
// a.c file의 func 함수의 브레이크 포인트 지움
cl a.c:func
//a.c 파일의 10행의 브레이크 포인트 지움
cl a.c:10
//모든 브레이크 포인트 지움
cl
// 현제 설정된 브레이크 포인트 정보를 보여줌
info b
// 방향키 up/down에 따라 히스토리 기능 제공
방향키 up/down
//info br 로 시작하느 키워드가 히스토리에 있다면 보여줌
info br + TAB
//info 뒤에 올 수 있는 인자 리스트를 보여줌
info TAB TAB
//현재 사용가능한 모든 명령어 리스트 보여줌
TAB + TAB
//고유번호 2번인 브레이크 포인트 활성화
enable 2
//고우번호 2번인 브레이크 포인트 비활성화
disable2
// 현재 출력된 행을 수행하고 멈추지만, 함수의 경우 함수의 내부로 들어가서 수행
s
// s를 5번 입력한 것과 동일
s5
//현재 행을 수행하고 멈추지만, 함수의 경우 함수를 수행하고 넘어감
n
// n을 5번 입력한 것과 동일
n5
//다음 브레이크 포인트를 만날때 까지 계속 수행
c
//for문에서 빠져나와서 다음 브레이크 포인트 까지 수행(for문에 braek point가 있을 때 쓰면 될 듯!)
u
// 현재 함수를 수행하고 빠져나감
finish
// 현재 함수를 수행하지 않고 빠져나감
return
//현재 함수를 수행하지 않고 빠져나가는데 리턴값은 123 (원하는 리턴값을 받았을 때 이후 동작을 확인하기 위해 사용하면 될 듯!)
reutrn 123
// 현재의 인스트럭션을 수행, 함수 호출시 내부로 들어감
si
// 현재의 인스트럭션을 수행, 함수 호출하더라도 내부로 들어가지 않는다.
ni
인스트럭션(instruction)은 컴퓨터에게 일을 시키는 단위로서, 컴퓨터가 알아들을 수 있는 기계어로 이루어져 있는 명령이다. 지시 또는 명령이라고 한다.
// i라는 변수에 watch 포인트를 설정하고 i 변수가 바뀔 때 마다 브레이크가 걸리며 이전 값과 현재 값을 비교함
watch i
// 현재 상태에서 어떤 지역 변수들이 있은지 ,값은 어떤지 알 수 있음
info locals
// 현재 상태에서의 전역 변수 리스트를 확인할 수 있음
info variables
// lval 값 확인
p lval
// func 함수의 주소 값 확인
p func
// pt가 구조체라면 구조체 주소 확인
p pt
// pt가 구조체라면 구조체 값 확인
p *pt
// *pt가 구조체라면 구조체 값 확인
p **pt
// 레지스트 값 전체를 한 번에 확인
info registers
p [변수명] : 변수 값을 출력
p [함수명] : 함수의 주소를 출력
p/[출력형식][변수명] : 변수 값을 출력 형식으로 출력
p '[파일명]'::[변수명] : 파일명에 있는 전역변수 값을 출력
p [함수명]::[변수명] : 함수에 있는 변수 값을 출력
p [변수명]@[배열크기] : 변수의 내용을 변수 배열의 크기 형태로 출력
// MMX 레지스트를 포함하여 거의 대부분의 레지스트 값 확인
info all-registers
// eax 레지스트의 값을 확인
p $eax
// 4 크기의 배열로 gdb가 알 수 있으므로 4개의 크기만큼 가져와서 확인
p *pt@4
// main.c 파일에 있는 전역 변수인 var 변수의 값 출력
p 'main.c'::var
// hello 함수에 포함된 static 변수인 var 변수의 값 출력
p hello::var
더 자세한 출력 기능은 reference 글을 확인해보자
//변수 값을 매번 화면에 표시
display [변수명]
//변수 값을 출력형식으로 디스플레이
display/[출력형식] [변수명]
//해당 디스플레이 설정 제거
undisplay [디스플레이 번호]
// 디스플레이 일시 중단
disable display [디스플레이 번호]
// 디스플레이 재개
enable display [디스플레이 번호]
undisplay 예시😊
// 현재 스택 프레임의 함수 내의 지역변수 출력
info locals
// 현재 스택 프레임의 함수내의 예외 핸들러 출력
info catch
더 자세한 출력 기능은 reference 글을 확인해보자
// 특정 함수 func를 arg1, arg2 파라미터를 포함하여 호출하고, 반환 값은 출력
call func(arg1, arg2)
// 보낼 수 있는 시그널의 종류를 확인
info signals
// 디버깅 대상의 프로세스에게 KILL 시그널을 보냄
signal SIGKILL
// 변경 가능한 환경설정 정보를 출력
info set
// 함수들의 리스트를 출력
info functions
// 선언된 타입에 대한 리스트를 출력
info types
// 프롬프트를 psyoblade: 로 변경할 수 있음
set prompt psyoblade:
// 배열을 출력할 때 여러 행에 출력한다.
set print array on