ÀÌ ±â´ÉÀº FreeBSD 2.2 ºÎÅÍ Áö¿øÇØ¿Â °ÍÀ̸ç, ¸Å¿ì »õ·Î¿î ±â´ÉÀÔ´Ï´Ù.
GDB´Â ÀÌ¹Ì ¿À·§µ¿¾È *¿ø°Ý µð¹ö±ë*À» Áö¿øÇß½À´Ï´Ù. µð¹ö±ëÀº ½Ã¸®¾ó ¶óÀÎÀ» ÅëÇØ ¸Å¿ì °£´ÜÇÑ ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÏ¿© ÀÌ·ç¾îÁý´Ï´Ù. À§¿¡¼ ¾ð±ÞÇß´ø ´Ù¸¥ ¹æ¹ýµé°ú ´Þ¸®, ÀÌ ÀÛ¾÷À» À§Çؼ´Â µÎ ´ëÀÇ ½Ã½ºÅÛÀÌ ÇÊ¿äÇÕ´Ï´Ù. Çϳª´Â ¸ðµç ¼Ò½º¿Í ¸ðµç µð¹ö±ë ½Éº¼ÀÌ ´ã±ä Ä¿³Î ¹ÙÀ̳ʸ®ÀÇ º¹»çÆÇÀ» Æ÷ÇÔÇÏ´Â µð¹ö±ë ȯ°æÀ» Á¦°øÇϴ ȣ½ºÆ®ÀÌ°í, ´Ù¸¥ ÇÑ´ë´Â µð¹ö±ë Á¤º¸¸¦ ¶¼¾î³½ °°Àº Ä¿³ÎÀÌ ½ÇÇàµÇ°í ÀÖ´Â µð¹ö±ë ÇÏ°íÀÚ Çϴ ȣ½ºÆ®ÀÔ´Ï´Ù.
Ä¿³Î ¼³Á¤ ÆÄÀÏ¿¡ DDB ¸¦ Æ÷ÇÔÇÏ¿© config -g
À» ½ÇÇàÇÏ°í,
ÀϹÝÀûÀÎ ¹æ¹ýÀ¸·Î Ä¿³ÎÀ» ÄÄÆÄÀÏÇÕ´Ï´Ù. ±× °á°ú µð¹ö±ë Á¤º¸·Î ÀÎÇÏ¿© Å«
Å©±âÀÇ ¹ÙÀ̳ʸ® ÆÄÀÏÀ» Á¦°øÇÕ´Ï´Ù. ÀÌ Ä¿³ÎÀ» Ÿ°Ù ¸Ó½ÅÀ¸·Î º¹»çÇÏ°í,
strip -x
¸í·ÉÀ¸·Î µð¹ö±ë ½Éº¼À» ¶¼¾î³½ ´ÙÀ½ -d
ºÎÆÃ
¿É¼ÇÀ» »ç¿ëÇÏ¿© ºÎÆÃÇÕ´Ï´Ù. Ÿ°Ù ¸Ó½ÅÀÇ Ã¹¹ø° ½Ã¸®¾ó ¶óÀÎÀ» µð¹ö±ë
È£½ºÆ®ÀÇ ÀÓÀÇÀÇ ½Ã¸®¾ó ¶óÀο¡ ¿¬°áÇÕ´Ï´Ù. µð¹ö±ë ¸Ó½Å »ó¿¡¼ ÄÄÆÄÀÏ
µð·ºÅ丮·Î °¡¼ gdb¸¦ ½ÇÇà½Ãŵ´Ï´Ù.
% gdb -k kernel
GDB 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 4.16 (i386-unknown-freebsd),
Copyright 1996 Free Software Foundation, Inc...
(kgdb)
¿ø°Ý µð¹ö±ë ¼¼¼ÇÀ» ´ÙÀ½°ú °°ÀÌ ÃʱâÈ ÇÕ´Ï´Ù(ù¹ø° ½Ã¸®¾ó Æ÷Æ®°¡ »ç¿ë ÁßÀ̶ó°í °¡Á¤ÇÕ´Ï´Ù).
(kgdb) target remote /dev/cuaa0
±×¸®°í ³ª¼, (µð¹ÙÀ̽º °¨Áö¸¦ ½ÃÀÛÇϱâ Á÷Àü¿¡ DDB¿¡ µé¾î°£ »óÅÂÀÇ) Ÿ°Ù È£½ºÆ®¿¡¼ ´ÙÀ½À» ÀÔ·ÂÇÕ´Ï´Ù.
Debugger("Boot flags requested debugger")
Stopped at Debugger+0x35: movb $0, edata+0x51bc
db> gdb
DDB´Â ´ÙÀ½°ú °°ÀÌ ÀÀ´äÇÒ °ÍÀÔ´Ï´Ù.
Next trap will enter GDB remote protocol mode
``gdb''À̶ó°í Ä¥ ¶§¸¶´Ù, ¿ø°Ý GDB ¸ðµå¿Í ·ÎÄà DDB ¸ðµå°¡ ÀüȯµÉ °ÍÀÔ´Ï´Ù. ´ÙÀ½ Æ®·¦À» °Á¦·Î ½ÇÇàÇϱâ À§Çؼ, ``s'' (step)À» Ĩ´Ï´Ù. GDB´Â Ÿ°Ù Ä¿³Î¿¡ ´ëÇÑ Á¦¾î±ÇÀ» °¡Áö°Ô µÉ °ÍÀÔ´Ï´Ù.
Remote debugging using /dev/cuaa0
Debugger (msg=0xf01b0383 "Boot flags requested debugger")
at ../../i386/i386/db_interface.c:257
(kgdb)
ÀÌ ¼¼¼ÇÀº ´Ù¸¥ ¾î¶² ¼¼¼Çµé¿¡¼µµ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹·Î¼ Emacs ³»¿¡¼ (¶Ç ´Ù¸¥ Emacs â¿¡ ÀÚµ¿À¸·Î ¼Ò½º Äڵ带 Ãâ·ÂÇÏ´Â) GUD ¸ðµå·Î µ¿ÀÛÇÔÀ¸·Î½á Àüü ¼Ò½º¸¦ ¾ï¼¼½º ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
¶ÇÇÑ, ¿ø°Ý GDB´Â LKMµéÀ» µð¹ö±ëÇÒ ¶§¿¡µµ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ù¹ø°·Î, LKMÀÌ µð¹ö±ë ½Éº¼À» Æ÷ÇÔÇϵµ·Ï ºôµåÇÕ´Ï´Ù.
# cd /usr/src/lkm/linux
# make clean; make COPTS=-g
±× ÈÄ¿¡ ÀÌ ¸ðµâÀ» Ÿ°Ù ¸Ó½Å¿¡ ÀνºÅç ÇÏ°í, ·ÎµùÇÑ ´ÙÀ½ ¾î´À ºÎºÐ¿¡
·ÎµùÇß´ÂÁö ÆľÇÇϱâ À§ÇØ modstat
À» »ç¿ëÇÕ´Ï´Ù.
# linux
# modstat
Type Id Off Loadaddr Size Info Rev Module Name
EXEC 0 4 f5109000 001c f510f010 1 linux_mod
¸ðµâÀÇ ·Îµù ¾îµå·¹½º¸¦ ÃëÇÏ¿© 0x20(a.out Çì´õÀÇ Å©±â¸¦ °í·ÁÇÕ´Ï´Ù)¸¦
´õÇÕ´Ï´Ù. ÀÌ °è»êÀ¸·Î ³ª¿À´Â ÁÖ¼Ò´Â ¸ðµâ Äڵ尡 ÀçÀ§Ä¡µÈ ÁÖ¼Ò°¡ µË´Ï´Ù.
µð¹ö°Å¿¡°Ô ÇØ´ç ¸ðµâ¿¡ ´ëÇØ ¾Ë·ÁÁÖ±â À§ÇØ GDB¿¡¼ add-symbol-file
¸í·ÉÀ» »ç¿ëÇÕ´Ï´Ù.
(kgdb) add-symbol-file /usr/src/lkm/linux/linux_mod.o 0xf5109020
add symbol table from file "/usr/src/lkm/linux/linux_mod.o" at
text_addr = 0xf5109020?
(y or n) y
(kgdb)
ÀÌÈķδ LKM ³»ÀÇ ¸ðµç ½Éº¼µéÀ» ¾ï¼¼½º ÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù.