· 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

ID
Password
Join
Might as well be frank, monsieur. It would take a miracle to get you out of Casablanca.


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.0132 sec