· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
EmacsGDB Quick Note

Emacs GDB 모드 초간단 사용법


1. 준비

GDB 모드 실행 방법
M-x gdb

Emacs에서 효과적인 디버깅을 하기 위해서는 Gdb Many Windows 설정 사용을 추천합니다.

방법1.
M-x customize-browse or 메뉴 : Options -> Customize Emacs -> Browse Customization Groups 에서

Emacs -> Programming -> Tools -> Gdb -> Gdb Many Windows
Gdb Many Windows : on 

State 버튼 누르고 Save for Future Sessions

방법2.
.emacs 설정파일에
(setq gdb-many-windows t)
추가

방법3.
M-x gdb 로 GDB 모드 진입 후 
메뉴 : Gud -> GDB-UI -> Display Other Windows 에서 토글

2. ECB(Emacs Code Browser)와 레이아웃 충돌 해결

ECB와 Gdb Many Windows 모드가 충돌하여 레이아웃이 이상해집니다.
해결 방법으로는

방법1.
ECB가 활성화되어 있으면 M-x ecb-deactivate 하고 M-x gdb 를 실행하세요.

방법2.
M-x make-frame (C-x 5 2) 로 프레임을 하나 더 만들고 거기서 M-x gdb 를 실행하세요.

방법3.
아래 같은 함수를 만들어서 .emacs 설정파일에 추가후 사용하세요.
(defun gdb-in-new-frame ()
  (interactive)
  (select-frame-set-input-focus (make-frame))
  (call-interactively 'gdb) )

(global-set-key [(control c)(D)] 'gdb-in-new-frame)

3. GDB 모드 전체 구성

emacs-gdb.png
[PNG image (28.41 KB)]

그림에 나온 각 윈도우 창을 설명하자면 아래와 같습니다.
GUD buffer Locals buffer
Source buffer
Stack buffer Breakpoints buffer
참고:
현재(2009년 11월 21일) 버전에서는 IO buffer가 하나 더 나타남.

주의하셔야 할 것은 동일한 명령에 GUD buffer에서는 두가지 단축키가 가능하고 어떤 buffer는 고유한 단축키를 가지고 있습니다.
예를 들어 브레이크 포인트 설정(gud-break)은 전체 buffer에서 C-x C-a C-b 이지만 GUD buffer에서는 C-c C-b 도 사용할수도 있습니다.
또한 Breakpoints buffer 에는 브레이크 포인트를 활성/비활성 하는 SPC 같은 고유한 단축키를 가지고 있습니다.

그리고 각 윈도우창에 포커스가 있는 상태(위 그림에서는 GUD buffer 가 해당)에서
C-h m (describe-mode)하시면 각 윈도우 창에 해당하는 모드의 도움말이 나옵니다.
참고하셔서 사용하시면 됩니다.

4. 단축키 정리

아래 단축키에서 아주 기본적인 것을 정리하면
gud-break 브레이크 포인트 설정
gud-remove 브레이크 포인트 해제
gud-next VS의 Step Over
gud-step VS의 Step Into
gud-finish VS의 Step Out
이 정도 입니다.
그리고 마우스와 툴바도 활용하세요.

Source buffer 단축키는 위 그림에 나온 모든 GDB 모드 buffer에서 사용할수 있습니다.
심지어 GUD buffer에서도 됩니다.
단 GDB "run" 실행 전에는 Source buffer에서만 브레이크 포인트 설정을 할 수 있습니다.
참고로 보통 Source buffer에서 소스코드를 보면서 디버깅하는 것이 편합니다.
Source buffer(All buffer) 명령어 GUD buffer
C-x C-a C-b (or C-x space) gud-break C-c C-b
C-x C-a C-d gud-remove C-c C-d
C-x C-a C-f gud-finish C-c C-f
C-x C-a TAB gud-stepi C-c TAB
C-x C-a C-j gud-jump C-c C-j
C-x C-a C-l gud-refresh C-c C-l
C-x C-a C-n gud-next C-c C-n
C-x C-a C-p gud-print C-c C-p
C-x C-a C-r gud-cont C-c C-r
C-x C-a C-s gud-step C-c C-s
C-x C-a C-t gud-tbreak C-c C-t
C-x C-a C-u gud-until C-c C-u
C-x C-a C-v gud-pv C-c C-v
C-x C-a C-w gud-watch C-c C-w
C-x C-a < gud-up C-c <
C-x C-a > gud-down C-c >
comint-bol-or-process-mark C-c C-a
comint-interrupt-subjob C-c C-c
comint-show-maximum-output C-c C-e
comint-delete-output C-c C-o
comint-get-next-from-history C-c C-x
comint-stop-subjob C-c C-z
comint-quit-subjob C-c C-\
comint-insert-previous-argument C-c .
comint-previous-matching-input-from-input C-c M-r
comint-next-matching-input-from-input C-c M-s

Breakpoints buffer 명령어
RET gdb-goto-breakpoint
SPC gdb-toggle-breakpoint
D gdb-delete-breakpoint
- negative-argument
0 .. 9 digit-argument
q gdb-delete-frame-or-window

5. Emacs 초보자 분을 위한 단축키 사용에 대한 조언

예를 들어 설명하자면 브레이크 포인트 설정(gud-break)은 Source buffer에서
C-x C-a C-b 인데 이것을 각각 따로 따로 입력하셔도 되지만
C(계속 누른 상태)-xa C-b 또는
C(계속 누른 상태)-xab
이런 식으로 하셔도 됩니다.

즉, 아래 세가지는 모두 같은 것입니다.
C-x C-a C-b
C-xa C-b
C-xab

gud-break에서 C-b 는 GUD buffer와 Source buffer에서 공통이기 때문에
표기는 위에 있는 것처럼 하더라도 실사용에서는
GUD buffer(C-c C-b), Source buffer(C-xa C-b) 이런 방식이 단축키 암기에 편할 것입니다.

6. 마우스 사용법

emacs_gdb_fringe.png
[PNG image (1.48 KB)]
기호
C Ctrl 키
Mouse-1 마우스 왼쪽 버튼
Mouse-3 마우스 오른쪽 버튼

그림에 나온 Source buffer 가장자리에서
Mouse-1 브레이크 포인트 설정/해제
C-Mouse-1 브레이크 포인트 활성/비활성

GDB "run" 명령 실행 후 Source buffer 가장자리에 세모 화살표 나오면
세모 화살표 Mouse-1 Drag Mouse-1 버튼 놓은 자리까지 실행
Mouse-3 Mouse-3 버튼 클릭한 자리까지 실행
C-Mouse-3 Mouse-3 버튼 클릭한 자리까지 점프(실행 없음)

7. 마우스로 브레이크 포인트 설정이 잘 안되는 경우

gdb에 처음 진입시 디버깅할 실행 파일을 로드하지 않고 진입후에 실행 파일을 로드하면
마우스로 브레이크 포인트 설정이 안되는 경우가 있습니다.

예들 들어 test.cc(main 함수 있는)라는 파일이 있고 컴파일을 완료해서
test라는 실행 파일이 만들어졌다면
M-x gdb 후에
미니버퍼에 아래 처럼
Run gdb (like this): gdb --annotate=3 test
이런 식으로 하셔야 합니다.

그렇지 않고 만약 test를 위에서 처럼 gdb에 넘겨주는 것을 잊으셔서
GUD buffer에서 "file test"하셨다면 키보드로 브레이크 포인트를 한번 설정해 주셔야
그 다음부터 마우스로도 브레이크 포인트 설정이 됩니다.

8. gud-run, gud-kill, gud-quit 키바인딩 추가 + α

gud-run, gud-kill, gud-quit 은 키바인딩이 안되어 있는데 필요하신 분은 아래를 .emacs 설정파일에 추가하세요.
(defun gdb-mode-additional-keys()
  "Key bindings to add to `gdb-mode'."
  (gud-def gud-run "run" "\C-g" "Run the program.")
  (gud-def gud-kill "kill" "\C-k" "Kill the program.")
  (gud-def gud-quit "quit" "\C-q" "Quit the program.")
  )

(add-hook 'gdb-mode-hook 'gdb-mode-additional-keys)
위 설정을 추가하시면 아래 키바인딩을 쓰실 수 있습니다.
GUD buffer 명령어 Source buffer
C-c C-g gud-run C-x C-a C-g
C-c C-k gud-kill C-x C-a C-k
C-c C-q gud-quit C-x C-a C-q

그리고 아래 소스코드처럼 gud-answer-with-yes, gud-answer-with-no 함수와 키바인딩을 더 추가하면
포커스가 GUD buffer에 없는 상태에서 gud-kill를 실행후 아래 메세지가 나와서
Kill the program being debugged? (y or n)
"y or n"를 입력하러 GUD buffer로 이동해야하는 불편을 줄일 수 있습니다.
예들 들어 Source buffer에서 gud-kill(C-x C-a C-k)후 GUD buffer에 "y or n" 입력하라는 메세지가 나오면
포커스가 Source buffer에 있는 그 상태에서 (C-x C-a y)를 입력하면 GUD buffer에 "y"가 입력되는 것입니다.

또한 gdb-toggle-breakpoint-in-source-buffer 함수와 키바인딩을 좀더 추가하면
Source buffer에서 C-x space 로 브레이크 포인트를 토글할수 있습니다.
물론 기존에 있던 gud-break(브레이크 포인트 설정) 키바인딩(C-x space)을 덮어씁니다.
이점 숙지하시고 원하시는 분은 다른 키바인딩으로 바꾸세요.
그러나 C-x C-a C-b (gud-break)는 그대로 쓸수있기 때문에 C-x space 는 토글로 쓰시는 것을 추천합니다.
(defun gud-answer-with-yes()
  (interactive)
  (save-excursion
    (set-buffer gud-comint-buffer)
    (insert "y")
    (comint-send-input)) )

(defun gud-answer-with-no()
  (interactive)
  (save-excursion
    (set-buffer gud-comint-buffer)
    (insert "n")
    (comint-send-input)) )

(defun gdb-toggle-breakpoint-in-source-buffer ()
  (interactive)
  (if (eq (car (fringe-bitmaps-at-pos)) 'breakpoint)
      (gud-remove nil)
    (gud-break nil)) )

(defun gdb-mode-additional-keys()
  "Key bindings to add to `gdb-mode'."
  (gud-def gud-run "run" "\C-g" "Run the program.")
  (gud-def gud-kill "kill" "\C-k" "Kill the program.")
  (gud-def gud-quit "quit" "\C-q" "Quit the program.")
  (global-set-key [(control x)(control a)(y)] 'gud-answer-with-yes)
  (global-set-key [(control x)(control a)(n)] 'gud-answer-with-no)
  (global-set-key [(control x)(?\  )] 'gdb-toggle-breakpoint-in-source-buffer)
  )


(add-hook 'gdb-mode-hook 'gdb-mode-additional-keys)

9. gdb-many-windows 상태 toggle 하기

gdb-many-windows 상태에서 디버깅하는 것이 편하지만
가끔 gdb-many-windows 상태가 아닌 심플한 상태에서 디버깅하는 것이 편할 수도 있으므로
아래 함수를 추가해서 사용하면 편리합니다.
(defun gdb-many-windows-toggle-switch ()
  (interactive)
  (if gdb-many-windows 
      (gdb-many-windows nil)
    (gdb-many-windows t)) )
위 gdb-mode-additional-keys 함수에 아래 키바인딩 추가
(global-set-key [(control x)(control a)(*)] 'gdb-many-windows-toggle-switch)

10. 실례 스크린샷(Screenshots)

emacs-gdb-exam1.png
[PNG image (47.3 KB)]

emacs-gdb-exam2.png
[PNG image (47.44 KB)]

위처럼 사용하려면 아래 소스를 다운로드 받고 적당한 곳에 설치 후
@gdb-snippets-rev2.tar.gz (2.25 KB)
@gdb-snippets.tar.gz (2.24 KB)

.emacs 에 아래를 추가해 줍니다.
(add-to-list 'load-path "설치/경로")
(load "gdb-snippets")
사용법은
C-x C-a R registers와 locals buffer 사이 전환
C-x C-a T threads와 breakpoints buffer 사이 전환
C-x C-a A assembler buffer 토글
C-x C-a M memory buffer 토글
C-x C-a I io buffer 토글

11. 어쩌면 가장 중요한 사항

컴파일 하실때 꼭 "-g" 옵션 잊으시면 안됩니다.!


(!) primewizard - 20080803



sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-11-21 16:13:03
Processing time 0.0168 sec