GDB:Command
GDB 명령 목록 정리.
Basic
기본적인 GDB사용방법은 아래와 같다.
- prog
- 디버깅할 프로그램.
- core
- 프로그램 실행 중에 'segmentation fault' 등의 오류에 의해 비정상적으로 종료할 때 생성되는 파일로, 그때의 시스템의 내부 상태를 그대로 저장해 놓은 것이다. 이 파일을 인자로 주면 실행파일이 비정상적으로 종료된 곳이 소스코드의 어느 부분인지를 표시해 준다.
- procID
- 이미 실행중인 프로그램을 debugging하려면 해당 process의 id (PID)를 주면 되는데, 이 때 주의 할 것은 PID와 같은 이름의 파일이 있을 경우 gdb가 core파일로 여기게 되는 점이다.
GCC와 연결방법
GCC 컴파일시 -g
옵션을 사용하여 컴파일한다. 이후 gdb의 첫 번째 인자로 실행파일을 넣어준다.
축약형
긴 명령어 대신 간단한 명령어로 대신할 경우 아래와 같이 사용하면 된다.
break | b |
clear | cl |
delete | d |
run | r |
kill | k |
step | s |
next | n |
continue | c |
until | u |
List of GDB command
GDB명령에 대하여 나열하고 설명한다.
-
break [file:]function
: (file안의) function에 Breakpoint을 설정한다.-
b file.cpp:linenumber
: file.cpp의 linenumber에 Breakpoint를 설정한다.
-
r
, run [arglist]
: (지정되었다면, arglist를 가지고) 프로그램을 시작한다. bt
: 역추적(backtrace): 프로그램 스택을 보여준다. print expr
: 수식의 값을 보여준다. c
: (정지점등에서 정지한) 프로그램을 계속 수행한다. next
: (정지한 후) 다음 행을 수행한다; 그 행에서 호출되는 함수를 수행하지않고 건너뛴다. step
: (정지한 후) 다음 행을 수행한다; 그 행에서 호출되는 함수를 수행한다. until
: 만일 step명령을 이용중 루프에 빠져 나오지 못할경우에는 until 명령어를 이용한다. help [name]
: GDB 명령어 name에 대한 정보를 보여거나 GDB 사용에 관한 일반적인 정보를 보여준다. q
, quit
, Ctrl+d
: GDB를 종료한다. l
, list
: 소스코드를 출력한다.-
list 10
-
list [함수명]
-
list -
(이전 10라인을 출력) -
list [파일명]:[함수명]
-
list [파일명]:10
set listsize 20
: list 출력 단위 변경. finish
: 함수가 매우 길어 끝나는 지점으로 이동하기 위해서는 finish 명령어를 사용한다. return
: 함수의 남은 부부을 수행하지 않고 빠져나오기 위해서는 return 명령어를 사용한다.-
return 1234
: return 값을 임의로 지정하여, 함수를 종료한다.
watch
: 와치포인트는 변수값의 변화와 코드의 변화를 확인할때 편리하게 이용가능하다.-
watch [변수명]
: 변수에 값이 써질 때 브레이크 -
rwatch [변수명]
: 변수의 값이 읽혀질 때 브레이크 -
awatch [변수명]
: 변수에 읽기, 쓰기 경우에 브레이크
info sources
: 전체 소스 목록 출력. cd [Directory]
: Change Directory. 작업 디렉터리를 변경한다. file [Program]
: 디버깅할 파일을 선택한다. set args [Arguments]
: 명령행 인자를 설정한다. show args
: 현재 설정된 명령행 인자 목록을 확인한다. d
: 모든 Breaking point 삭제. info breakpoints
: Breaking point 보기. cl [LINE | FUNC]
: Breaking point 삭제. k
: 프로그램 수행 종료. s
: 현재 행 수행 후 정지, 함수 호출 시 함수 내부 진입. n
: 현재 행 수행 후 정지, 함수 호출 시 함수 수행 후 다음 행 진행. c
: Breaking points 발생전까지 계속 진행. u
: 현재 루프 빠져나감. si
: 현재의 인스트럭션을 수행, 함수 호출 시 함수 내부로 들어감. ni
: 현재의 인스트럭션을 수행, 함수 호출 시 함수 내부로 들어가지 않음. 중단점 사용방법
- watch [EXP]
- expression EXP에 대한 watchpoint를 설정한다. EXP의 값이 변할 때마다 프로그램의 수행을 멈춘다.
- break [[file:]n|function]
- 특정 라인(n)이나 함수(function)에 breakpoint를 설정한다. Argument가 없으면 현재 수행 위치에 breakpoint를 설정한다. 프로그램이 수행 중에 지정된 breakpoint에 도착하면 수행을 멈춘다.
- clear [[file:]n|function]
- 특정 라인(n)이나 함수(function)에 설정된 breakpoint를 제거한다. Argument가 없으면 현재 수행 위치에 설정된 모든 breakpoint를 제거한다.
- delete [N …]
- 몇몇 breakpoint나 자동 출력 expression을 제거한다. N은 제거할 breakpoint 번호를 가리킨다. Argument가 없으면 모든 breakpoint를 제거한다.
- disable [N …]
- 몇몇 breakpoint를 disable시킨다. N은 disable할 breakpoint를 가리킨다. Argument가 없으면 모든 breakpoint를 disable시킨다. disable된 breakpoint는 enable에 의해 다시 동작하도록 할 수 있다.
- enable [N …]
- 몇몇 breakpoint를 enable시킨다. N은 enable할 breakpoint를 가리킨다.
- condition [N COND]
- breakpoint N에서 COND가 true일 때만 멈추도록 명시한다.
데이터 검사
데이터 검사와 관련된 GDB사용방법은 아래와 같다.
- whatis EXP
- expression EXP의 data 타입을 출력한다.
- ptype TYPE
- 타입 TYPE의 정의를 출력한다.
- print [EXP]
- expression EXP의 값을 출력한다. EXP에 사용될 수 있는 변수는 선택된 프레임에 있는 변수이거나 전역 변수이다.
- printf ["format string", arg1, arg2, arg3, ..., argn]
- printf 형식으로 출력한다.
- display [EXP]
- expression EXP의 값을 프로그램이 멈출 때마다 출력한다.
- delete display (또는 undisplay) [N …]
- 프로그램이 정지할 때마다 출력되는 몇몇 expression을 취소한다. N은 취소할 expression의 번호를 지정한다.
- Argument가 없으면 모든 자동 출력 expression을 취소한다.
- disable display [N …]
- 프로그램이 정지할 때마다 출력되는 몇몇 expression을 disable한다. N은 disable할 expression의 번호를 지정한다.
- Argument가 없으면 모든 자동 출력 expression을 disable한다.
- enable display [N …]
- 프로그램이 정지할 때마다 출력되는 몇몇 expression을 enable한다. N은 enable할 expression의 번호를 지정한다.
- Argument가 없으면 모든 자동 출력 expression을 enable한다.
파일 검사
파일 검사와 관련된 GDB사용방법은 아래와 같다.
- cd [DIR]
- 작업 디렉토리를 DIR로 설정한다
- pwd
- 작업 디렉토리를 출력한다.
- core-file [FILE]
- FILE을 core dump 파일로 사용한다.
- file [FILE]
- FILE을 디버깅할 프로그램으로 사용한다.
- list [[file:]n|function][, [file:]n|function]
- 지정된 함수나 라인 앞뒤의 10라인을 출력한다. 콤마로 분리된 두 개의 Argument는 출력할 시작 라인과 끝 라인을 가리킨다.
- Argument가 없으면 앞서 출력된 라인 이후의 10개 라인을 출력한다. list –는 앞서 출력된 라인 이전의 10개 라인을 출력한다.
- set listsize [n]
- 리스트에 보이는 라인수를 n으로 설정 (기본 10 line).
프로그램 수행
프로그램 수행과 관련된 GDB사용방법은 아래와 같다.
- kill
- 디버깅 중인 프로그램의 실행을 강제로 종료시킨다.
- run [args]
- 디버깅할 프로그램의 수행을 시작한다. 프로그램 실행에 필요한 argument (args)를 지정할 수 있다.
- args를 지정하지 않으면 바로 이전의 run실행이나 'set args'명령에 의해 미리 주어진 argument를 사용한다. 입출력 방향 재지정(>, <, >>)을 사용할 수 있다.
- set args [args]
- 프로그램이 시작될 때, 디버깅할 프로그램에 전달할 argument를 설정한다.
- next [n]
- 멈춰진 프로그램에서 프로그램의 다음 n(default=1)개의 문장을 수행한 후 멈춘다. 함수일 경우, 함수 전체를 수행한다.
- step [n]
- 멈춰진 프로그램에서 프로그램의 다음 n(default=1)개의 문장을 수행한 후 멈춘다. 함수일 경우, 함수 내부로 들어가 한 문장씩 수행한다.
- continue [n]
- 시그널(Ctrl-C)이나 breakpoint 등에 의해 멈춰진 프로그램의 수행을 계속한다. n이 지정될 경우, 이후 n-1번의 breakpoint는 무시하고, n번째 breakpoint에서 수행을 멈춘다.
- until [[file:]n|function]
- 프로그램이 현재 라인보다 큰 라인이나 또는 지정된 라인이나 어드레스 또는 함수에 도달할 때까지 수행한다.
- (break 명령과 동일한 argument) 또한, 현재 stack frame을 빠져나올 때도 멈춘다. loop를 지날 때, 첫번째 loop수행에서는 next명령과 동일하지만 두번째 loop수행부터는 그 loop를 벗어날 때까지 멈추지 않는다.
스택
스택은 스택 프레임으로 구성된다. gdb는 스택 프레임에 번호를 지정하는데, 가장 안쪽에 있는(현재 실행중인) 프레임에 대해 0번부터 번호를 부여한다. gdb는 항상 한 프레임을 선택된 프레임으로 간주하며, 선택된 프레임에 대하여 변수 값 보기가 이루어진다. 아래 명령어들에서 숫자나 어드레스를 사용하여 다른 프레임을 지정할 수도 있다.
- bt [[-]N]
- 모든 스택 프레임이나 가장 안쪽에 있는 N개의 프레임에 대한 backtrace를 출력한다. argument가 음수(-N)일 때, 가장 바깥쪽에 있는 N개의 프레임을 출력한다.
- (bt 대신 backtrace 또는 where를 사용해도 무방하다.)
- frame [N]
- 스택 프레임을 선택하고 출력한다. N은 선택할 프레임 번호(혹은 프레임의 주소)를 가리킨다. Argument가 없으면 현재 선택된 프레임을 출력한다.
- up [N]
- 현재 선택된 프레임을 호출한 스택 프레임 (caller)을 선택하고 출력한다. N은 몇 개의 프레임 위로 올라가야 할지를 말해준다.
- down [N]
- 현재 선택된 프레임에 의해 호출된 스택 프레임 (callee)을 선택하고 출력한다. N은 몇 개의 프레임 아래로 내려가야 할지를 말해준다.
- return [rvalue]
- 선택된 스택 프레임으로 하여금 호출자 (caller)에게로 리턴하게 한다. 실행은 현재 선택된 것보다 위에 있는 프레임 (caller)에서 계속될 것이다. rvalue는 리턴 값을 지정한다.
- set variable [variable] = [exp]
- [variable]의 값을 [exp] 계산 결과로 대치한다. set variable 대신 set만 써도 된다.
상태조회
상태조회와 관련된 GDB사용방법은 아래와 같다.
- info
- 디버깅 중인 프로그램에 대한 여러가지를 보여 주기 위한 포괄적인 명령어.
- info breakpoints [N]
- 설정된 breakpoint의 상태를 보여준다. N은 특정 breakpoint 번호를 가리킨다.
- Argument가 없으면 모든 breakpoint의 상태를 보여 준다.
- (info watchpoints를 사용해도 무방하다.)
- info args
- 현재 스택 프레임의 인자 변수를 보여준다.
- info display
- 프로그램이 멈출 때 출력할 expression들을 보여준다.
Memory watch mode
What you're looking for is called a watchpoint.
- watch: gdb will break when a write occurs
- rwatch: gdb will break wnen a read occurs
- awatch: gdb will break in both cases
Usage:
-
watch foo
: watch the value of variable foo. -
watch *(int*)0x12345678
: watch the value pointed by an address, casted to whatever type you want. -
watch a*b + c/d
: watch an arbitrarily complex expression, valid in the program's native language.
Multi process debugging
-
set follow-fork-mode child
- 위와 같이 설정하면 fork() 후에 child process를 디버깅 상태로 만들고 parent는 계속 실행시킨다.
follow-fork-mode
의 기본값은parent
이다.
-
show follow-fork-mode
- 현재
follow-fork-mode
상태를 출력.
-
set detach-on-fork off
- parent와 child process를 모두 디버깅해야한다면 이들을 모두 제어하기 위해 다음 명령을 이용할 수 있다.
-
catch exec
- 만약 fork/vfork/exec와 같은 특정 이벤트 발생 시 실행을 중지시키고 싶다면 catchpoint를 설정할 수 있다.
GDB 관련 지원도구
- help [class|command]
- 도움말, 명령어 분류 목록 출력, 해당 class에 속한 명령어 목록 표시, 해당 command에 대한 도움말 표시.
- quit
- gdb를 종료한다.
- make [args]
- make를 실행한다.