노무현 대통령 배너


2007. 10. 4. 12:10

GDB를 이용한 디버깅

GDB를 이용한 디버깅

GNU 소스-레벨 디버거

Fifth Edition, for GDB version

April 1998

Richard M. Stallman and Roland H. Pesch

초벌 번역 : 정강훈


차례


Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.

Published by the Free Software Foundation
59 Temple Place - Suite 330,
Boston, MA 02111-1307 USA
Printed copies are available for $20 each.
ISBN 1-882114-11-6
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.

GDB 개요

GDB같은 디버거의 목적은 프로그램 실행동안 프로그램 내부에서 진행되고 있는 것이 무엇인지를 여러분이 알도록 하는데에 있다. -- 또는 다른 프로그램이 죽는 순간에 무엇을 했는지.

GDB는 여러분이 버그를 잡도록 도와주는 4 종류의 일들(또 이것들을 지원하는 다른 것들)을 할수 있다.

  • 프로그램을 시작할때 프로그램의 행동에 영향을 줄수 있는 것을 지정할수 있다.
  • 여러분의 프로그램을 지정된 조건에서 멈추도록 만든다.
  • 여러분의 프로그램이 멈추었을때 무엇이 일어났는지를 시험할수 있다.
  • 여러분의 프로그램내의 어떤것을 바꾸어서, 여러분이 버그를 고칠수 있도록 실험을 할수 있게 하고 다른것에 대해 배우도록 한다.

여러분은 C나 C++로 쓰여진 프로그램을 디버깅하기 위해 GDB를 사용할수 있다. 더 많은 정보를 위해서, C 그리고 C++ 섹션을 참조해라.

Modula-2 와 Chill는 부분적으로 지원한다. Modula-2에 관한 정보를 위해서, Modula-2 섹션을 참조해라. Chill에 관한 문서는 아직 없다.

sets, subranges, 파일 변수들 또는 중첩된 함수들을 사용하는 Pascal 프로그램에 대한 디버깅은 현재 작동되지 않는다. GDB는 표현식 들어가기, 값 출력, 또는 Pascal 문법을 사용하는 비슷한 특징들은 지원하지 않는다.

비록 표현식 들어가기, 값 출력, 또는 Fortran 문법에서 사용하는 비슷한 특징들을 아직 지원하지 않아도 GDB는 Fortran으로 짜여진 프로그램을 디버깅하기 위해 사용 될수 있다. 중요 부분을 추적하기 위해 몇몇 변수를 참조하는것이 필요하다.

자유 소프트웨어

GDB는 GNU General Public License(GPL)에 의해 보호되는 자유 소프트웨어 이다. GPL은 라이센스된 프로그램을 복사하거나 사용하는것이 자유스럽다. -- 그러나 복사본을 가진 모든 사람은 또한 그 복사본(소스 코드에 접근할수 있다는 의미)을 수정하기 위한 자유를 가지며 그 복사본을 배포하는것도 자유이다. 전형적인 소프트웨어 회사들은 여러분의 자유를 제한하기 위해 저작권을 사용한다; Free Software Foundation은 이들 자유를 보호하기 위해 GPL을 사용한다.

기본적으로, General Public License는 여러분이 이러한 자유를 가진다는 라이센스이고 여러분은 이러한 자유를 그밖의 다른 사람에게서 제한할수 없다.

GDB 공헌자들

Richard Stallman은 GDB의 원 저자이며 다른 많은 GDB프로그램의 저자이기도 하다. 많은 다른 사람들이 이 개발에 공헌하였다. 이 섹션은 주요 공헌자들을 밝히기 위한 것이다. 자유 소프트웨어의 미덕중 하나는 모든 사람들이 프로그램에 공헌하는것이 자유라는 점이다; 유감스럽게, 우리는 여기서 모든사람들을 알릴수 없다. GDB 배포판에 있는 `ChangeLog'는 사건들에 대해 대체로 정확히 기술하고 있다.

버전 2.0 이전의 많은 변화들은 오랜 시간때문에 잃어버렸다.

변명: 이 섹션에 추가 하는것은 부분적으로 환영한다. 만일 여러분이나 여러분의 친구들(또는 적)이 이 리스트에서 빠져있다면 우리는 여러분의 이름을 추가하길 원한다.

이들은 보답이 없는 오랜 작업을 하였으며, 우리는 주요 릴리즈 버전시에 GDB를 도와준 이들에게 감사한다.: Stan Shebs (release 4.14), Fred Fish (releases 4.13, 4.12, 4.11, 4.10, and 4.9), Stu Grossman and John Gilmore (releases 4.8, 4.7, 4.6, 4.5, and 4.4), John Gilmore (releases 4.3, 4.2, 4.1, 4.0, and 3.9); Jim Kingdon (releases 3.5, 3.4, and 3.3); and Randy Smith (releases 3.2, 3.1, and 3.0). 얼마간의 기간동안 GDB의 주요 메인테이너로써, 각 공헌자들은 구조와 안정성 그리고 전체 디버거의 능력에 대해 공헌했다.

Peter TerMaat, Chris Hanson, 그리고 Richard Mlynarik 가 여러번 도와주었으며 Richard Stallman은 2.8까지 버전을 관리했다.

Michael Tiemann은 중요한 공헌자인 Per Bothner와 함께 GDB에서 GNU C++지원의 대부분의 저자이다. James Clark는 C++ 디맹글러(demangler)를 썼다. 초기 C++ 작동은 Peter TerMatt(3.0 릴리즈시 많은 일반적인 업데이트 작업을 하였다.)에 의해서이다.

GDB 4는 다중 객체-파일 포맷을 검사하기 위해 BFD 서브루틴 라이브러리를 사용하였다; BFD는 David V.Henkel-Wallace, Rich Pixley, Steve Chamberlain, 그리고 John Gilmore의 공동 프로젝트이다.

David Johnson은 원 COFF 지원을 썼다; Pace Willson은 캡슐화된 COFF를 지원했다.

Harris Computer Systems의 Brent Benson은 DWARF2 지원의 공헌자이다.

Adam de Boor와 Bradley Davis는 ISI Optimum V 지원에 공헌했다. Per Bothner, Noboyuki Hikichi, 그리고 Alessandro Forin는 MIPS 지원에 공헌했다. Jean-Daniel Fekete는 Sun 386i 지원에 공헌했다. Chris Hanson 는 HP9000 지원을 개선했다. Noboyuki Hikichi 그리고 Tomoyuki Hasei는 Sony/News OS 3 지원에 공헌했다. David Johnson는 Encore Umax 지원에 공헌했다. Jyrki Kuoppala는 Altos 3068 지원에 공헌했다. Jeff Law는 HP PA 그리고 SOM 지원에 공헌했다. Keith Packard는 NS32K 지원에 공헌했다. Doug Rabson는 Acorn Risc Machine 지원에 공헌했다. Bob Rusk는 Harris Nighthawk CX-UX 지원에 공헌했다. Chris Smith는 Convex 지원(그리고 포트란 디버깅)에 공헌했다. Jonathan Stone는 Pyramid 지원에 공헌했다. Michael Tiemann는 SPARC 지원에 공헌했다. Tim Tucker는 Gould NP1와 Gould Powernode 지원에 공헌했다. Pace Willison는 Intel 386 지원에 공헌했다. Jay Vosburgh는 Symmetry 지원에 공헌했다.

Rich Schaefer 그리고 Peter Schauer는 SunOS 공유 라이브러리 지원을 도와주었다.

Jay Fenlason 그리고 Roland McGrath는 GDB와 GAS가 몇몇 머신 명령어 집합에 일치하도록 확실히 해주었다.

Patrick Duval, Ted Goldstein, Vikram Koka 그리고 Glenn Engel는 원격 디버깅 개발을 도와 주었다. Intel Corporation, Wind River Systems, AMD, 그리고 ARM는 각각 i960, VxWorks, A29K UDI, 그리고 RDI targets를 위한 원격 디버깅 모듈에 공헌했다.

Brian Fox는 명령어 라인 편집과 명령어 히스토리를 제공하는 readline 라이브러리의 저자이다.

SUNY Buffalo의 Andrew Beers는 언어-switch 코드, Modula-2 지원 그리고 이 매뉴얼의 Language chapter에 공헌했다.

Fred Fish는 Unix System Vr4 지원의 대부분을 작업했다. 기리고 C++ 오버로딩 심볼을 지원하기 위해 명령어-완성에 대한 지원을 강화했다.

Hitachi America, Ltd. Hitachi microprocessors를 지원하도록 후원했다.

Kung Hsu, Jeff Law, 그리고 Rick Sladkey는 하드웨어 watchpoints에 대한 지원을 추가했다.

Michael Snyder는 tracepoint 지원을 추가했다.

Stu Grossman는 gdbserver를 썼다.

Jim Kingdon, Peter Schauer, Ian Taylor, 그리고 Stu Grossman는 많은 버그를 고쳤으며 GDB를 깔끔하게 해주었다.

Cygnus Solutions은 1991년 이후 GDB 유지와 개발의 많은것을 지원했다.

간단한 GDB 세션

여러분은 GDB에 관한 것을 읽기 위해 여가시간에 이 매뉴얼을 사용할수 있다. 그러나, 약간의 명령어들로만으로도 디버거 사용을 시작하는데 충분하다. 이 장은 이들 명령어들에 대해 기술한다.

이 예제 세션에서, 우리는 주위 출력과 쉽게 구별하기 위해 다음처럼 사용자 입력을 강조한다:input,

GNU m4(일반 매크로 프로세서)의 초기 버전중 하나는 다음과 같은 버그를 가지고 있다: 가끔 우리가 디폴트에서 인용 문자열을 바꿀때, 이 명령어들은 다른 stop 작업내에 있는 하나의 매크로 정의를 캡쳐하기 위해 사용될수 있다. 다음의 간단한 m4 세션에서, 우리는 0000로 확장되는 매크로 foo를 정의한다; 그리고 같은것으로 bar를 정의 하기 위해 m4 내장 defn를 사용한다. 그러나, 우리가 로 열린 인용 문자열과 로 닫힌 인용문자열을 바꾼다면, 같은 절차는 새로운 동의어 baz를 정의하는데 실패한다.

$ cd gnu/m4$ ./m4define(foo,0000)foo0000define(bar,defn(`foo'))bar0000changequote(,)define(baz,defn(foo))bazC-dm4: End of input: 0: fatal error: EOF in string

무엇이 일어나고 있는지 알아보기 위해 GDB를 사용해보자.

$ gdb m4GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see  the conditions.There is absolutely no warranty for GDB; type "show warranty"  for details.GDB , Copyright 1995 Free Software Foundation, Inc...(gdb)

GDB는 발견하기 위한 곳이 어디인지 알기 위해 필요한 심볼 데이터 만을 읽는다.; 결과적으로, 처음 프롬프트는 매우 빨리 나타난다. 우리는 지금 보통보다 좁은 디스플레이 폭을 사용하도록 GDB에게 말한다. 그래서 이 예제는 이 매뉴얼에 적용시켰다.

(gdb) set width 70

우리는 m4 내장 changequote가 작동하는 방법을 알 필요가 있다. 소스를 보고, 우리는 관련 서브루틴이 m4_changequote이라고 알고 있으므로, GDB break 명령어로 breakpoint를 설정한다.

(gdb) break m4_changequoteBreakpoint 1 at 0x62f4: file builtin.c, line 879.

run명령어를 사용하여, GDB 제어하에 m4를 시작한다; 제어가 m4_changequote에 도착하지 않는한, 프로그램은 보통처럼 작동한다.

(gdb) runStarting program: /work/Editorial/gdb/gnu/m4/m4define(foo,0000)foo0000

breakpoint를 트리거하기 위해, changequote를 호출한다. GDB는 m4의 실행을 일시 중지하고 멈춘 곳의 문맥에 관한 정보를 출력한다.

changequote(,)Breakpoint 1, m4_changequote (argc=3, argv=0x33c70)     at builtin.c:879879         if (bad_argc(TOKEN_DATA_TEXT(argv[0]),argc,1,3))

지금 현재 함수의 다음 라인으로 실행을 나아가기 위해 n(next)명령어를 사용한다.

(gdb) n882         set_quotes((argc >= 2) ? TOKEN_DATA_TEXT(argv[1]) : nil,

set_quotes는 약속된 서브루틴처럼 보인다. 우리는 next 대신에 s (step) 명령어를 사용하여 해당 서브루틴으로 들어간다. stepany 서브루틴에서 실행되기 위해 다음 라인으로 들어 간다. 그래서 set_quotes 안으로 들어간다.

(gdb) sset_quotes (lq=0x34c78 "", rq=0x34c88 "")    at input.c:530530         if (lquote != def_lquote)

현재 m4가 일시 중지된 서브루틴을 보여주는 출력을 스택 프레임 디스 플레이라 부른다. 이것은 스택의 개요를 보여준다. 우리는 대체로 스택에 있는곳을 보기 위해 backtrace(철자는 bt)를 사용한다: backtrace명령어는 현재 활성화된 서브루틴을 위해 스택 프레임을 출력한다.

(gdb) bt#0  set_quotes (lq=0x34c78 "", rq=0x34c88 "")    at input.c:530#1  0x6344 in m4_changequote (argc=3, argv=0x33c70)     at builtin.c:882#2  0x8174 in expand_macro (sym=0x33320) at macro.c:242#3  0x7a88 in expand_token (obs=0x0, t=209696, td=0xf7fffa30)    at macro.c:71#4  0x79dc in expand_input () at macro.c:40#5  0x2930 in main (argc=0, argv=0xf7fffb20) at m4.c:195

우리는 무엇이 일어났는지를 보기 위해 약간 더 많은 라인을 나아간다. 처음 몇번, 우리는 `s'를 사용한다; 다음 두번, 우리는 xstrdup 서브루틴으로 들어가는것을 피하기 위해 n를 사용한다.

(gdb) s0x3b5c  532         if (rquote != def_rquote)(gdb) s0x3b80  535         lquote = (lq == nil || *lq == '') ?  def_lquote : xstrdup(lq);(gdb) n536         rquote = (rq == nil || *rq == '') ? def_rquote : xstrdup(rq);(gdb) n538         len_lquote = strlen(rquote);

마지막 라인은 약간 이상하게 보인다; 우리는 그것들이 우리가 지정한 왼쪽 그리고 오른쪽 인용어구인지 아닌지를 보기 위해 lquote 그리고 rquote 를 검사할수 있다. 우리는 변수들을 보기 위해 p(print) 명령어를 사용한다.

(gdb) p lquote$1 = 0x35d40 ""(gdb) p rquote$2 = 0x35d50 ""

lquote 그리고 rquote는 실제로 새로운 왼쪽, 오른쪽 인용어구이다. 몇몇 문맥을 보기 위해, 우리는 l(list) 명령어를 가지고 현재 라인 주위 소스코드 10라인을 볼수 있다.

(gdb) l533             xfree(rquote);534535         lquote = (lq == nil || *lq == '') ? def_lquote : xstrdup (lq);536         rquote = (rq == nil || *rq == '') ? def_rquote : xstrdup (rq);537538         len_lquote = strlen(rquote);539         len_rquote = strlen(lquote);540     }541542     void

len_lquotelen_rquote를 설정하는 마지막 두 라인으로 가서 이들 변수값을 검사하자.

(gdb) n539         len_rquote = strlen(lquote);(gdb) n540     }(gdb) p len_lquote$3 = 9(gdb) p len_rquote$4 = 7

len_lquotelen_rquote가 각각 lquoterquote의 길이라고 가정할때 그것은 확실히 이상하게 보인다. 우리는 p 명령어를 사용하여 그것들을 적당한 값으로 설정할수 있다. 왜냐하면 이 명령어는 어떤 표현식의 값을 출력할수 있기 때문이다. -- 그리고 그 표현식은 서브루틴 콜과 대입을 포함할수 있다.

(gdb) p len_lquote=strlen(lquote)$5 = 7(gdb) p len_rquote=strlen(rquote)$6 = 9

m4 내장 defn로 새로운 인용어구 사용 문제를 고치기에 충분한가? 우리는 c(continue)명령어로 실행을 계속하기 위해 m4를 사용할수 있다. 그리고 문제를 야기한 예제를 다시 시도하자.

(gdb) cContinuing.define(baz,defn(foo))baz0000

성공! 새로운 인용어구는 지금 기본처럼 작동한다. 문제는 잘못된 길이를 정의한 두 오타 때문인거 같다. 우리는 입력에 EOF를 주어 m4를 종료할수 있다.

C-dProgram exited normally.

메세지 `Program exited normally.'는 GDB에서 나온것이다; 그것은 m4가 실행을 마쳤다는것을 가리킨다. 우리는 GDB quit 명령어를 가지고 GDB 세션을 마칠수 있다.

(gdb) quit

GDB에 들어가고 나가기

이 장은 GDB를 시작하는 방법과 나가는 방법에 대해 토론한다. 필수적인 것들:

  • GDB를 시작하기 위해 `gdb'를 타이핑해라.
  • 종료하기 위해 quitC-d를 타이핑해라.

GDB 실행

프로그램 gdb를 돌려 GDB를 실행해라. 일단 시작하면, GDB는 여러분이 종료(exit)를 할때까지 터미널에서 명령어를 읽는다.

여러분은 또한 시작시 여러분의 디버깅 환경을 지정하기 위해 인자와 옵션을 가지고 gdb를 돌릴수 있다.

여기서 기술한 명령어-라인 옵션들은 여러상황을 처리하도록 고완되었다.; 몇몇 환경에서, 이들 옵션 중 일부는 효과적으로 이용할수 없다.

GDB를 시작하기 위한 가장 일반적인 방법은 실행 프로그램을 지정하는 인자 1개를 가지는 것이다.

gdb program

여러분은 또한 실행 프로그램과 코어(core) 파일을 지정하여 시작할수 있다:

gdb program core

대신에 여러분은 돌아가는 프로그램을 디버깅하길 원한다면 두번째 인자로써 프로세스 ID를 지정해라.

gdb program 1234

프로세스 1234에 GDB를 연결한다.(여러분이 `1234'이라는 이름의 파일을 가지고 있지 않다면; GDB는 우선 코어파일 이름을 체크한다.)

두번째 명령어 라인 옵션을 이용하는것은 꽤 안전한 OS를 요구한다.; 여러분이 bare 보드에 연결된 디버거로써 GDB를 사용할때, 거기에는 "프로세스"에 대한 개념이 없을 것이다. 그리고 코어 덤프를 가지기 위한 방법도 없다.

여러분은 -silent를 지정하여 GDB의 앞부분을 출력하지 않고 gdb를 돌릴수 있다.

gdb -silent

여러분은 명령어-라인 옵션을 사용하여 GDB를 시작하는 방법을 제어할수 있다. GDB는 그것 자체로 사용할수 있는 옵션들을 알려줄수 있다.

이용할수 있는 모든 옵션들과 사용에 대해 간단한 기술을 보고자 하면

gdb -help

를 타이핑해라.(`gdb -h'와 동일하다.)

여러분이 준 모든 옵션과 명령어 라인 인자들은 순차적으로 처리된다. `-x' 옵션을 사용하면 순서가 달라진다.

파일들 선택하기

GDB가 시작할때, GDB는 실행파일과 코어 파일(또는 프로세스 ID)을 지정하는 것처럼 옵션이외의 다른 인자들을 읽는다. 이것은 인자들을 각각 `-se'`-c'로 지정한것과 같다. (GDB는 `-se'옵션 다음에 따르는 인자와 같기 때문에 관련된 옵션 플래그를 가지고 있지 않는 첫번재 인자를 읽는다; 그리고 `-c' 옵션 다음의 인자와 같기 때문에 관련된 옵션 플래그를 가지지 않는 두번째 인자를 읽는다.)

많은 옵션들은 long과 short형태를 가지고 있다; 두개는 다음리스트에서 보여진다. GDB는 또한 옵션이 모호하지 않는한 여러분이 줄여도 긴형태로 인식할수도 있다. (여러분이 원한다면, 여러분은 우리가 더 일반적인 변환을 설명하더라도 `-'보다 `--'로 옵션 인자를 플래그화 할수 있다.)

-symbols file
-s file
파일 file에서 심볼 테이블을 읽는다.
-exec file
-e file
실행 파일로써 그리고 코어 덤프와 결합된 순 데이터를 검사하기 위해 파일 file를 사용해라.
-se file
파일 file에서 심볼 테이블을 읽고 실행파일로써 이것을 사용해라.
-core file
-c file
검사하기 위한 코어 덤프로써 파일 file를 사용해라.
-c number
attach 명령어처럼 프로세스 ID number를 연결해라. (만일 number 이름의 코어-덤프 포맷 파일이 없다면, 이것은 `-c'에서 읽기 위한 코어 덤프로써 파일을 지정한 경우처럼)
-command file
-x file
파일 file에서 GDB 명령어를 실행한다. 명령어 파일들 섹션을 참조해라.
-directory directory
-d directory
소스 파일을 탐색하기 위해 패스에 directory를 추가해라.
-m
-mapped
경고: OS 기능에 의존하는 이 옵션은 모든 시스템에서 지원되지 않는다.
만일 메모리-대응(memory-map)파일들이 mmap를 통해 시스템에서 이용할 수 있다면, 여러분은 현재 디렉토리에서 여러분의 프로그램을 다시 재사용할수 있는 파일에 심볼들을 쓸수 있는 옵션을 사용할수 있다. 만일 여러분이 디버깅하는 프로그램이 `/tmp/fred'라 불린다면, 대응된 심볼 파일은 `./fred.syms'이다. 앞으로 GDB 디버깅 세션들은 이 파일의 존재를 확인하며 실행 프로그램에서 심볼 파일을 읽기보다 이 파일에서 심볼 정보를 빠르게 대응시킨다. `.syms'파일은 GDB가 돌아가고 있는 호스트 머신에 의존한다. 이것은 내부 GDB 심볼 테이블의 정확한 이미지를 가진다. 이것은 크로스 다중 호스트 플랫폼에서 공유 될수 없다.
-r
-readnow
필요할때 조금씩 읽는것보다 즉시 심볼 파일의 전체 심볼 테이블을 읽는다. 이것은 시작을 느리게 만들지만 앞으로의 작동은 더 빠르게 만든다.

-mapped-readnow 옵션은 전형적으로 완전한 심볼 정보를 포함하는 `.syms' 파일을 만들기 위해 결합된다. (정보를 위해서 파일을 지정하기 위한 명령어들를 참조해라.)

앞으로의 사용을 위해 파일 `.syms'는:

	gdb -batch -nx -mapped -readnow programname

모드 선택하기

여러분은 다양한 선택 모드에서 GDB를 돌릴수 있다--예를 들어, 배치모드나 조용한 모드

-nx
-n
초기화 파일들(보통 `.gdbinit'라 불린다)에서 명령어를 실행하지 마라. 보통, 이 파일들에 있는 명령어들은 모든 명령어 옵션과 인자들이 처리된 다음에 실행된다. 명령어 파일들 섹션을 참조해라.
-quiet
-q
"침묵". 소개와 저작권 메세지는 출력하지 마라. 이 메세지들은 배치 모드에서 작동되지 않는다.
-batch
배치모드로 돌려라. `-x'(그리고 `-n'로 저지되지 않은 초기화 파일에서 모든 명령어들)로 지정된 모든 명령파일들을 처리한후 0 상태로 종료된다. 만일 에러가 명령어 파일안에 있는 GDB명령어를 실행하는 동안 일어난다면 0이 아닌 상태로 종료된다. 배치 모드는 다운로드나 다른 컴퓨터에서 프로그램을 돌리기 위한 필터로써 GDB를 돌리는데 유용하다.; 더 유용하게 만들기 위해서 메세지가 배치모드에서 돌아갈때는 나타나지 않는다. (보통 GDB제어하에서 돌아가는 프로그램이 끝날때 나타난다.)
Program exited normally.
-cd directory
GDB는 현재 디렉토리 대신에 작업디렉토리로써 directory를 사용하여 작동한다.
-fullname
-f
GNU Emacs는 하위 프로세서로써 GDB를 돌릴때 이 옵션을 설정한다. 그것은 스택 프레임이 출력될때(프로그램이 멈춘 시간을 포함하여) 파일 이름과 라인 넘버를 출력하도록 GDB에게 말한다. 이것은 두개의 `32' 문자들 처럼 보이는 포맷을 허용하며, 파일 이름, 라인 넘버, 콜론과 뉴라인에 의해 분리되는 문자가 뒤따라온다. Emacs-to-GDB 인터페이스 프로그램은 프레엠에서 소스 코드를 보여주기 위한 신호로써 두개의 `32' 문자를 사용한다.
-b bps
원격 디버깅에서 GDB가 사용한 시리얼 인터페이스의 라인 스피드(baud rate 나 bits per second)를 설정한다.
-tty device
프로그램의 표준 입력과 출려을 위해 device를 사용하여 작동한다.

GDB 종료하기

quit
GDB를 종료하기 위해, quit(간단히 q)를 사용해라. 또는 EOF 문자(보통 C-d)를 타이핑해라. 만일 여러분이 expression를 제공하지 않는다면, GDB는 정상적으로 종료될 것이다; 그렇지 않으면 에러 코드로써 expression의 결과를 사용하고 종료할 것이다.

인터럽트(자주 C-c)는 GDB에서 나가지 않지만 처리중인 GDB명령 작동을 끝내며 GDB 명령어 레벨로 돌아온다. 어떤때든지 인터럽트 문자를 타이핑하는것은 보장된다. 왜냐하면 GDB는 안전한 시간이 될때까지 효과를 가지도록 허용하지 않기 때문이다.

만일 여러분이 연결된 프로세스나 디바이스를 제어하기 위해 GDB를 사용한다면, 여러분은 detach명령어를 가지고 놓아주어야 한다. (이미 돌고 있는 프로세스 디버깅하기섹션을 참조해라.)

Shell 명령어들

만일 여러분이 디버깅 세션동안 경우에 따라 shell 명령어를 실행할 필요가 있다면, GDB를 나가거나 일시중지할 필요가 없다; 여러분은 단지 shell 명령어를 사용할수 있다.

shell command string
command string를 실행하기 위해 표준 shell을 기동한다. 만일 shell이 존재한다면, 환경변수 SHELL는 기동될 shell을 결정한다. 그렇지 않으면 GDB는 /bin/sh를 사용한다.

make는 개발 환경에서 자주 필요하다. 여러분은 GDB에서 이 목적을 위해 shell명령어를 사용할 필요가 없다:

make make-args
지정된 인자를 가지고 make 프로그램을 실행해라. 이것은 `shell make make-args'와 같다.

GDB 명령어들

여러분은 축약형이 모호하지 않다면 명령어 이름의 처음 몇자로 GDB 명령어를 축약할수 있다; 그리고 여러분은 단지 RET를 타이핑하여 GDB 명령어를 반복할수 있다. 여러분은 또한 GDB 명령어 단어의 나머지를 채우기 위해 TAB을 사용할수 있다.(또는 만일 거기에 1개 이상의 단어가 있다면, 여러분이 선택적으로 이용할수 있도록 보여준다.)

명령어 구문

GDB 명령어는 단일 라인 입력이다. 길이에 대한 제한은 없다. 명령어 이름과 함께 시작하며 명령어 이름에 의존하는 의미가 있는 인자가 뒤따라 온다. 예를 들어, step명령어는 `step 5'처럼 스텝을 위한 갯수를 받는다. 여러분은 또한 인자 없이 step를 사용할수 있다. 몇몇 명령어 이름들은 어떤 인자도 허용하지 않는다.

GDB는 축약형이 모호하지 않다면 항상 명령어이름을 축약한다. 다른 가능한 명령어 축약형들은 문서안에 나열 되어 있다. 몇몇 경우에는, 모호한 축약형조차 혀용된다.; 예를 들어, s는 비록 s로 시작하는 다른 명령어들이 있다할지라도 step와 같은 것으로써 특별히 정의되어 있다. 여러분은 help 명령어에 인자로써 이것들을 사용하여 축약형을 테스트할수 있다.

GDB에 입력으로써 빈 라인(단지 RET를 타이핑하는것)은 전 명령어의 반복을 의미한다. 어떠한 명령어(예를 들어, run)는 이 방법으로 반복되지 않는다; 이들 명령어는 문제를 야기할수 있고 반복을 원하지 않는 명령어들이다.

listx명령어는 여러분이 RET로 반복할때, 타이핑처럼 정확히 반복하는것 이외에 새로운 인자를 만든다. 이것은 소스나 메모리를 쉽게 스케닝하는것을 허용한다.

GDB는 또한 다른 방법으로 RET를 사용할수 있다: more와 비슷한 방법으로 출력 길이를 분할하기 위해 사용할수 있다.(Screen 크기섹션을 참조해라.) 이것은 이 상황에서 너무 많이 RET를 누르기 쉽기 때문에, GDB는 디스플레이의 범위를 만드는 명령어후 명령어 반복을 불가능하게 한다.

#에서 라인끝까지의 텍스트는 주석이다; 아무것도 아니라는 것이다. 이것은 명령어 파일들에서 매우 유용하다.(명령어 파일들섹션을 참조해라.)

명령어 완성

GDB는 만일 한가지의 가능성만 있다면 여러분을 위해 명령어 단어의 나머지를 채워준다.; 또한 어떤때든지 명령어에서 다음 단어를 위한 가능한 모든 경우를 여러분에게 보여준다. 이것은 GDB명령어, GDB 하위 명령어, 그리고 여러분의 프로그램에서 심볼들의 이름에서 작동한다.

여러분은 단어의 나머지를 채우길 원할때마다 TAB키를 눌러라. 만일 한가지의 가능성만 있다면, GDB는 단어를 채우고 명령어를 끝마치길 기다린다. (또는 RET를 눌러라.) 예를 들어 여러분이 다음을 한다면,

(gdb) info bre TAB

GDB는 `breakpoints' 단어의 나머지를 채운다. 왜냐하면 `bre'로 시작하는 info의 하위 명령어는 이것뿐이기 때문이다.

(gdb) info breakpoints

여러분은 여기서 info breakpoints 명령어를 돌리기 위해 RET를 누르거나, 만일 여러분이 예상한 단어가 아니라면 backspace나 그밖의 다른 것을 눌러라. (만일 여러분이 info breakpoints를 원하는게 확실하다면, 여러분은 명령어 완성 대신 명령어 축약형을 이용하기 위해 단지 `info bre'후에 즉시 RET를 해도 된다.)

만일 여러분이 TAB을 누를때 다음 단어의 가능성이 한가지 이상이라면 GDB는 벨소리를 울린다. 여러분은 더 많은 단어를 제공하고 다시 시도하거나 단지 2번 TAB키를 누를수 있다.; GDB는 모든 가능한 완성형을 보여준다. 예를 들어, 여러분은 `make_'로 시작하는 이름의 서브루틴에 breakpoint를 설정하기 원할지 모른다. 그러나 여러분이 b make_TAB 를 한다면 GDB는 단지 벨소리만을 낸다.TAB을 다시 타이핑하면 이 문자들로 시작하는 모든 함수 이름을 보여준다. 예를 들어:

(gdb) b make_ TABGDB sounds bell; press TAB again, to see:make_a_section_from_file     make_environ               make_abs_section             make_function_type         make_blockvector             make_pointer_type          make_cleanup                 make_reference_type        make_command                 make_symbol_completion_list(gdb) b make_

가능한 모든 경우를 출력한후, GDB는 여러분의 부분적인 입력(예에서 `b make_')을 복사하고 명령어를 마칠수 있다.

여러분이 처음 위치에서 선택 리스트들을 보길 원한다면, 여러분은 TAB를 두번 누르기보다 M-?를 누를수 있다. M-?META ?를 의미한다. 여러분은 키보드에서 META shift 같은것으로 디자인 된 키를 누르고 ?를 타이핑 하거나 ESC 다음에 ?를 눌러 할수 있다.

보통 단어라고 하는 여러분이 필요한 문자열은 중괄호나 단어 개념에서 제외된 다른 단어를 포함할지도 모른다. 이런 경우 단어의 완성형을 이루기 위해서는, 여러분은 GDB 명령어들중에서 '(단일 인용 부호)안에 단어를 닫아야 한다.

여러분이 필요로 하는 대부분의 상황은 C++ 함수 이름을 쓸 경우이다. 왜냐하면 C++은 함수 오버로딩을 허용하기 때문이다.(인자 타입에 의해 구별되는 같은 함수의 다중 정의) 예를 들어, 여러분이 breakpoint를 설정하길 원한다면, 여러분은 int 인자를 가지는 name(int) 버전인지, 또는 float 인자를 가지는 name(float) 버전인지를 구별해야 한다. 단어-완성형기능을 사용하기 위해, 함수 이름 시작시 '를 타이핑해라. 이것은 여러분이 TAB를 누르거나 원하는 단어 완성형을 위해 M-?를 누를때 보통보다 더 많은 정보를 고혀할 필요가 있다는 것을 GDB에게 알려 주는 것이다.

(gdb) b 'bubble( M-?bubble(double,double)    bubble(int,int)(gdb) b 'bubble(

몇몇 경우에, GDB는 완성된 이름이 인용구 사용을 필요로 한다는 것을 알려 줄수 있다. 이런 경우, GDB는 만일 처음 위치에 인용구를 타이핑하지 않는다면 여러분을 위해 인용구를 넣는다.:

(gdb) b bub TABGDB는 여러분의 입력라인을 다음처럼 수정하고 벨을 울린다.(gdb) b 'bubble(

일반적으로, 만일 여러분이 오버로딩된 심볼의 완성형을 요구할때 인자 리스트를 타이핑하지 않았다면, GDB는 인용구가 필요하다는걸 말해 줄수 있다.

도움말 얻기

여러분은 help 명령어를 사용하여 명령어에 대한 정보를 GDB에게 요구할수 있다.

help
h
여러분은 명령어 클래스들의 이름들을 보기 위해 인자 없이 help( 간단히 h)를 사용할수 있다.
(gdb) helpList of classes of commands:running -- Running the programstack -- Examining the stackdata -- Examining databreakpoints -- Making program stop at certain pointsfiles -- Specifying and examining filesstatus -- Status inquiriessupport -- Support facilitiesuser-defined -- User-defined commandsaliases -- Aliases of other commandsobscure -- Obscure featuresType "help" followed by a class name for a list of commands in that class.Type "help" followed by command name for full documentation.Command name abbreviations are allowed if unambiguous.(gdb)
help class
인자처럼 help 클래스들 중 하나를 사용하여, 여러분은 그 클래스내 각 명령어 리스트를 볼수 있다. 예를 들어, 여기에 status 클래스를 위한 도움말 출력이 있다.
(gdb) help statusStatus inquiries.List of commands:s

'Utilities' 카테고리의 다른 글

가상머신  (0) 2008.11.26
[링크스크랩] 토렌토 파일검색 사이트 모음입니다.  (0) 2007.10.19
TortoiseSVN with Araxis Merge  (1) 2007.06.28
Torrento 사용법  (1) 2007.06.22
[본문스크랩] Doxygen 사용법  (0) 2007.06.22