Skip to content

GDB:Command

GDB 명령 목록 정리.

Basic

기본적인 GDB사용방법은 아래와 같다.

gdb [prog [core|procID]]
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를 실행한다.

See also