Chapter 22. ¥«¡¼¥Í¥ë¥Ç¥Ð¥Ã¥°

Table of Contents
kgdb ¤Ë¤è¤ë¥«¡¼¥Í¥ë¤Î¥¯¥é¥Ã¥·¥å¥À¥ó¥×¤Î¥Ç¥Ð¥Ã¥°
DDD ¤Ë¤è¤ë¥¯¥é¥Ã¥·¥å¥À¥ó¥×¤Î¥Ç¥Ð¥Ã¥°
ÆÍÁ³¥À¥ó¥×¤·¤¿¾ì¹ç¤Î²òÀÏ
DDB¤ò»È¤Ã¤¿¥ª¥ó¥é¥¤¥ó¥«¡¼¥Í¥ë¥Ç¥Ð¥Ã¥°
¥ê¥â¡¼¥È GDB ¤ò»È¤Ã¤¿¥ª¥ó¥é¥¤¥ó¥«¡¼¥Í¥ë¥Ç¥Ð¥Ã¥°
¥³¥ó¥½¡¼¥ë¥É¥é¥¤¥Ð¤Î¥Ç¥Ð¥Ã¥°

¸¶ºî Paul Richards and Jörg Wunsch

Ìõ: ÆâÀî ´î¾Ï . 18 March 1997.

kgdb ¤Ë¤è¤ë¥«¡¼¥Í¥ë¤Î¥¯¥é¥Ã¥·¥å¥À¥ó¥×¤Î¥Ç¥Ð¥Ã¥°

¤³¤³¤Ç¤Ï¥¯¥é¥Ã¥·¥å¥À¥ó¥× (crash dump : ÌõÃí ¤³¤Îʸ̮¤Ç¤Ï kernel ¼«¿È ¤Î°Û¾ï¤Ë¤è¤Ã¤ÆÄä»ß¤·¤¿¾ì¹ç¤Ë½ÐÎϤµ¤ì¤ë¥¤¥á¡¼¥¸¤ò»Ø¤·¤Þ¤¹) ¤Ë¤è¤ë¥«¡¼ ¥Í¥ë¥Ç¥Ð¥Ã¥°¤ÎÊýË¡¤ò¼¨¤·¤Þ¤¹.

¤³¤³¤Ç¤Ï¥À¥ó¥×¤¹¤ë¤¿¤á¤Î½½Ê¬¤Ê¥¹¥ï¥Ã¥× (swap) ¤ÎÍÆÎ̤¬¤¢¤ë¤â¤Î¤È¤·¤Þ¤¹. ¤â¤·Ê£¿ô¤Î¥¹¥ï¥Ã¥×¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤ò»ý¤Á, ºÇ½é¤Î¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤¬¥À¥ó¥× ¤òÊÝ»ý¤¹¤ë¤Î¤Ë½½Ê¬¤ÊÂ礭¤µ¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ï Ê̤ΥÀ¥ó¥×¥Ç¥Ð¥¤¥¹¤ò»È¤¦¤è ¤¦¤Ë (config kernel ¹Ô¤Ç) ¥«¡¼¥Í¥ë¤Î¥³¥ó¥Õ¥£¥°¤ò¤ª¤³¤Ê¤¦¤«, dumpon(8) ¥³¥Þ¥ó¥É¤ò»È¤Ã¤ÆÊ̤ΥǥХ¤¥¹¤ò¼¨¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹. dumpon(8) ¤ò»È¤¦¤â¤Ã¤È¤â¤è¤¤ÊýË¡¤ÏÊÑ¿ô dumpdev ¤ò /etc/rc.conf ¤ÇÀßÄꤹ¤ë¤³¤È¤Ç¤¹. °ìÈÌŪ¤Ë¤Ï /etc/fstab ¤ÇÀßÄꤵ¤ì¤Æ¤¤¤ë¥¹¥ï¥Ã¥×¥Ç¥Ð¥¤¥¹¤¬ »È¤ï¤ì¤ë¤Ç¤·¤ç¤¦. ¥¹¥ï¥Ã¥×¤Ë»È¤¨¤Ê¤¤¥Ç¥Ð¥¤¥¹¤Ø¤Î¥À¥ó¥×, Î㤨¤Ð¥Æ¡¼¥×¤Ø¤Î¥À¥ó¥×¤Ï¸½ºß¥µ¥Ý¡¼¥È¤µ ¤ì¤Æ¤¤¤Þ¤»¤ó. ¥«¡¼¥Í¥ë¤Î¥³¥ó¥Õ¥£¥°¤Ï config -g ¤Ë¤è¤Ã¤Æ¹Ô¤Ã¤Æ¤¯¤À¤µ¤¤. FreeBSD ¥«¡¼¥Í¥ë¤Î¥³¥ó¥Õ¥£¥°¥ì¡¼¥·¥ç¥ó ¤Ë¤Ï FreeBSD ¤Î¥«¡¼¥Í¥ë¤ÎÀßÄê¤Î¾ÜºÙ¤¬¤¢¤ê¤Þ¤¹¤Î¤Ç »²¾È¤·¤Æ¤¯¤À¤µ¤¤.

dumpon(8) ¥³¥Þ¥ó¥É¤ò»È¤Ã¤Æ¤É¤³¤Ø¥À¥ó¥×¤¹¤ë¤« ¥«¡¼¥Í¥ë¤ËÅÁ¤¨¤Æ¤¯¤À¤µ¤¤ (swapon(8) ¤Ë¤è¤Ã¤Æ¤½¤Î¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤¬ ¥¹¥ï¥Ã¥×¤È¤·¤ÆÀßÄꤵ¤ì¤¿ ¸å¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤). ¤³¤ì¤ÏÉáÄÌ¤Ï /etc/rc.conf ¤ä /etc/rc ¤ÇÀßÄꤵ¤ì¤Þ¤¹. ¤¢¤ë¤¤¤Ï Ê̤ÎÊýË¡¤È¤·¤Æ¥«¡¼¥Í¥ë¥³¥ó¥Õ¥£¥°¥ì¡¼¥·¥ç¥ó¥Õ¥¡¥¤¥ë¤Î config ¹Ô¤Î dump Àá ¤Ç ¥À¥ó¥×¥Ç¥Ð¥¤¥¹¤ò¥Ï¡¼¥É¥³¡¼¥É¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹. ¤³¤ÎÊýË¡¤Ï¤¢¤Þ¤ê¤è¤¯¤Ï ¤¢¤ê¤Þ¤»¤ó. ¥«¡¼¥Í¥ë¤¬¥Ö¡¼¥È»þ¤Ë crash ¤¹¤ë¾ì¹ç¤Î¥¯¥é¥Ã¥·¥å¥À¥ó¥×¤ò¼è¤ê ¤¿¤¤»þ¤À¤±»È¤¦¤Ù¤­¤Ç¤¹.

Note: °Ê²¼¤Ç¤Ï kgdb¤È¤¤¤¦ÍѸì¤Ï gdb¤ò ``¥«¡¼¥Í¥ë¥Ç¥Ð¥Ã¥°¥â¡¼¥É'' ¤Çư¤«¤·¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹. gdb¤ò -k¥ª¥×¥·¥ç¥ó¤ò¤Ä¤±¤Æµ¯Æ°¤¹¤ë¤« kgdb¤È¤¤¤¦Ì¾Á°¤Ç¥ê¥ó ¥¯¤·¤Æµ¯Æ°¤¹¤ë¤³¤È¤Ç¤³¤Î¥â¡¼¥É¤Ë¤Ê¤ê¤Þ¤¹. ¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï ¤³¤Î¥ê¥ó¥¯ ¤Ïºî¤é¤ì¤Æ¤¤¤Þ¤»¤ó. ¤Þ¤¿, ¤³¤Î¥¢¥¤¥Ç¥¢¤Ï GNU´Ø·¸¼Ô¤¿¤Á¤¬Èà¤é¤Î¥Ä¡¼¥ë ¤òÊ̤Î̾Á°¤Ç¸Æ¤Ó½Ð¤·¤¿»þ¤Ë°Û¤Ê¤Ã¤¿Æ°ºî¤ò¤¹¤ë¤È¤¤¤¦¤³¤È¤ò ¹¥¤Þ¤Ê¤¤, ¤È ¤¤¤¦ÅÀ¤ÇÉÔɾ¤Ç¤¹. ¤¢¤ë¤¤¤Ï¾­Í褳¤Îµ¡Ç½¤òÇѻߤ¹¤ë¤³¤È¤Ë¤Ê¤ë¤«¤â¤·¤ì¤Þ¤»¤ó.

¥«¡¼¥Í¥ë¤òºî¤Ã¤¿»þ¤Ë¤½¤Î¥³¥Ô¡¼¤ò kernel.debug ¤È¤¤¤¦Ì¾Á°¤Çºî ¤ê¤Þ¤·¤ç¤¦. ¤Þ¤¿, ¥ª¥ê¥¸¥Ê¥ë¤ËÂФ·¤Æ strip -d¤ò¼Â¹Ô¤·¤Þ¤¹. ¥ª¥ê¥¸¥Ê¥ë¤òÉáÄ̤˥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹. ¤Þ¤¿ strip ¤·¤Æ¤¤¤Ê¤¤¥«¡¼¥Í¥ë ¤âƱÍͤ˥¤¥ó¥¹¥È¡¼¥ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬, ¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤Î»²¾È»þ´Ö ¤¬¤¤¤¯¤Ä¤«¤Î¥×¥í¥°¥é¥à¤Ç¤Ï·àŪ¤ËÁý²Ã¤¹¤ë¤Ç¤·¤ç¤¦. ¤Þ¤¿, ¥«¡¼¥Í¥ëÁ´ÂÎ ¤Ï¥Ö¡¼¥È»þ¤ËÆÉ¤ß¹þ¤Þ¤ì ¥¹¥ï¥Ã¥×¥¢¥¦¥È¤µ¤ì¤Ê¤¤¤¿¤á¿ô¥á¥¬¥Ð¥¤¥È¤ÎʪÍý¥á ¥â¥ê¤¬ÌµÂ̤ˤʤê¤Þ¤¹.

Î㤨¤Ð¥Ö¡¼¥È¥×¥í¥ó¥×¥È¤Ç ¿·¤·¤¤¥«¡¼¥Í¥ë¤Î̾Á°¤ò¥¿¥¤¥×¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ, ¿·¤·¤¤¥«¡¼¥Í¥ë¤ò¥Æ¥¹¥È¤·¤¿¾ì¹ç¤Ç, ºÆ¤Ó¥·¥¹¥Æ¥à¤òư¤«¤¹¤Î¤ËÊ̤Υ«¡¼¥Í ¥ë¤ÇΩ¤Á¾å¤²¤ë¤³¤È¤¬É¬Íפʾì¹ç¤Ï¥Ö¡¼¥È¥×¥í¥ó¥×¥È¤Ç -s¥Õ¥é¥° ¤ò»È¤¤¥·¥ó¥°¥ë¥æ¡¼¥¶¤Î¾õÂ֤ˤ·¤Æ¤¯¤À¤µ¤¤. ¤½¤·¤Æ°Ê²¼¤Î¤è¤¦¤ÊÁàºî¤ò¤ª¤³¤Ê ¤¤¤Þ¤¹.

# fsck -p
# mount -a -t ufs       # /var/crash ÍѤΥե¡¥¤¥ë¥·¥¹¥Æ¥à¤ò½ñ¤­¹þ¤ß²Äǽ¤Ë¤¹¤ë
# savecore -N /kernel.panicked /var/crash
# exit                  # ...¥Þ¥ë¥Á¥æ¡¼¥¶¥â¡¼¥É¤Ø°Ü¹Ô

¤³¤³¤Ë¼¨¤·¤¿ savecore(8) ¤Ï (¸½ºßư¤¤¤Æ¤¤¤ë¤â¤Î¤È¤ÏÊ̤Î) ¥«¡¼¥Í¥ë¤Î¥·¥ó¥Ü¥ë̾¤ÎÃê½Ð¤ò¤ª¤³¤Ê¤¦¤¿¤á¤Ë»È¤Ã¤Æ¤¤¤Þ¤¹. Ãê½Ð¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç ¤Ï¸½ºßư¤¤¤Æ¤¤¤ë¥«¡¼¥Í¥ë¤ËÂФ·¤Æ¤ª¤³¤Ê¤ï¤ì, ¥¯¥é¥Ã¥·¥å¥À¥ó¥×¤È¥«¡¼¥Í¥ë¥·¥ó¥Ü ¥ë¤Î¤¯¤¤°ã¤¤¤Î¤¿¤á¤Ë¤Þ¤Ã¤¿¤¯²¿¤â¤·¤Þ¤»¤ó (ÌõÃí:¤½¤Î¤¿¤á¤Ë¥ª¥×¥·¥ç¥ó ¤Ç¼ÂºÝ¤Ë¥À¥ó¥×¤ò¤ª¤³¤·¤¿¥«¡¼¥Í¥ë¤ò»ØÄꤷ¤Þ¤¹).

¥¯¥é¥Ã¥·¥å¥À¥ó¥×¤Îµ¯¤­¤¿¸å¤Ë /sys/compile/WHATEVER¤Ø¹Ô¤­ kgdb¤òư¤«¤·¤Þ¤¹. kgdb ¤è¤ê¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹.

symbol-file kernel.debug
exec-file /var/crash/kernel.0
core-file /var/crash/vmcore.0

¤³¤¦¤¹¤ë¤È, ¥¯¥é¥Ã¥·¥å¥À¥ó¥×¤ò»È¤Ã¤Æ¥«¡¼¥Í¥ë¥½¡¼¥¹¤ò¾¤Î¥×¥í¥°¥é¥à¤ÈƱÍÍ¤Ë ¥Ç¥Ð¥Ã¥°¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹.

¼¡¤Ë kgdb ¤Ç¤Î¼ê½ç¤Î¥»¥Ã¥·¥ç¥ó¤Î¥í¥°¤ò¼¨¤·¤Þ¤¹. Ť¤¹Ô¤ÏÆÉ ¤ß¤ä¤¹¤¯¤¹¤ë¤¿¤á¤Ë²þ¹Ô¤·¤Þ¤·¤¿. ¤Þ¤¿, »²¾È¤Î¤¿¤á¤Ë¹ÔÈÖ¹æ¤òÆþ¤ì¤Æ¤¢¤ê ¤Þ¤¹. ¤¿¤À¤·, ¤³¤ì¤Ï¼ÂºÝ¤Î pcvt¥³¥ó¥½¡¼¥ë¥É¥é¥¤¥Ð¤Î³«È¯Ãæ¤Î¼ÂºÝ¤Î¥¨ ¥é¡¼¤Î¥È¥ì¡¼¥¹¤Ç¤¹.

 1:Script started on Fri Dec 30 23:15:22 1994
 2:# cd /sys/compile/URIAH
 3:# kgdb kernel /var/crash/vmcore.1 
 4:Reading symbol data from /usr/src/sys/compile/URIAH/kernel...done.
 5:IdlePTD 1f3000
 6:panic: because you said to!
 7:current pcb at 1e3f70
 8:Reading in symbols for ../../i386/i386/machdep.c...done.
 9:(kgdb) where
10:#0  boot (arghowto=256) (../../i386/i386/machdep.c line 767)
11:#1  0xf0115159 in panic ()
12:#2  0xf01955bd in diediedie () (../../i386/i386/machdep.c line 698)
13:#3  0xf010185e in db_fncall ()
14:#4  0xf0101586 in db_command (-266509132, -266509516, -267381073)
15:#5  0xf0101711 in db_command_loop ()
16:#6  0xf01040a0 in db_trap ()
17:#7  0xf0192976 in kdb_trap (12, 0, -272630436, -266743723)
18:#8  0xf019d2eb in trap_fatal (...)
19:#9  0xf019ce60 in trap_pfault (...)
20:#10 0xf019cb2f in trap (...)
21:#11 0xf01932a1 in exception:calltrap ()
22:#12 0xf0191503 in cnopen (...)
23:#13 0xf0132c34 in spec_open ()
24:#14 0xf012d014 in vn_open ()
25:#15 0xf012a183 in open ()
26:#16 0xf019d4eb in syscall (...)
27:(kgdb) up 10
28:Reading in symbols for ../../i386/i386/trap.c...done.
29:#10 0xf019cb2f in trap (frame={tf_es = -260440048, tf_ds = 16, tf_\
30:edi = 3072, tf_esi = -266445372, tf_ebp = -272630356, tf_isp = -27\
31:2630396, tf_ebx = -266427884, tf_edx = 12, tf_ecx = -266427884, tf\
32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, tf_eip = -26\
33:6672343, tf_cs = -266469368, tf_eflags = 66066, tf_esp = 3072, tf_\
34:ss = -266427884}) (../../i386/i386/trap.c line 283)
35:283                             (void) trap_pfault(&frame, FALSE);
36:(kgdb) frame frame->tf_ebp frame->tf_eip
37:Reading in symbols for ../../i386/isa/pcvt/pcvt_drv.c...done.
38:#0  0xf01ae729 in pcopen (dev=3072, flag=3, mode=8192, p=(struct p\
39:roc *) 0xf07c0c00) (../../i386/isa/pcvt/pcvt_drv.c line 403)
40:403             return ((*linesw[tp->t_line].l_open)(dev, tp));
41:(kgdb) list
42:398        
43:399             tp->t_state |= TS_CARR_ON;
44:400             tp->t_cflag |= CLOCAL;  /* cannot be a modem (:-) */
45:401     
46:402     #if PCVT_NETBSD || (PCVT_FREEBSD >= 200)
47:403             return ((*linesw[tp->t_line].l_open)(dev, tp));
48:404     #else
49:405             return ((*linesw[tp->t_line].l_open)(dev, tp, flag));
50:406     #endif /* PCVT_NETBSD || (PCVT_FREEBSD >= 200) */
51:407     }
52:(kgdb) print tp
53:Reading in symbols for ../../i386/i386/cons.c...done.
54:$1 = (struct tty *) 0x1bae
55:(kgdb) print tp->t_line
56:$2 = 1767990816
57:(kgdb) up
58:#1  0xf0191503 in cnopen (dev=0x00000000, flag=3, mode=8192, p=(st\
59:ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c line 126)
60:       return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p));
61:(kgdb) up
62:#2  0xf0132c34 in spec_open ()
63:(kgdb) up
64:#3  0xf012d014 in vn_open ()
65:(kgdb) up
66:#4  0xf012a183 in open ()
67:(kgdb) up
68:#5  0xf019d4eb in syscall (frame={tf_es = 39, tf_ds = 39, tf_edi =\
69: 2158592, tf_esi = 0, tf_ebp = -272638436, tf_isp = -272629788, tf\
70:_ebx = 7086, tf_edx = 1, tf_ecx = 0, tf_eax = 5, tf_trapno = 582, \
71:tf_err = 582, tf_eip = 75749, tf_cs = 31, tf_eflags = 582, tf_esp \
72:= -272638456, tf_ss = 39}) (../../i386/i386/trap.c line 673)
73:673             error = (*callp->sy_call)(p, args, rval);
74:(kgdb) up
75:Initial frame selected; you cannot go up.
76:(kgdb) quit
77:# exit
78:exit
79:
80:Script done on Fri Dec 30 23:18:04 1994

¾å¤Î½ÐÎϤˤĤ¤¤Æ¤Î¥³¥á¥ó¥È¤ò¤·¤Þ¤¹.

line 6:

¤³¤ì¤Ï DDB (¸å½Ò) ¤«¤é¤Î¥À¥ó¥×¤Ç¤¹. ¤³¤Î¤¿¤á ``because you said to!'' ¤È¤¤¤¦ panic¥³¥á¥ó¥È¤¬¤Ä¤­, ¥Ú¡¼¥¸¥Õ¥©¥ë¥È¤Î¥È ¥é¥Ã¥×¤Ë¤è¤Ã¤Æ DDB¤ËÆþ¤Ã¤¿¤³¤È¤¬¸¶°ø¤Î, ¤ä¤äŤ¤¥¹¥¿¥Ã¥¯¥È¥ì¡¼ ¥¹¤¬¤¢¤ê¤Þ¤¹.

line 20:

¥¹¥¿¥Ã¥¯¥È¥ì¡¼¥¹¤Ç¤Î¤³¤ì¤Ï trap()´Ø¿ô¤Î°ÌÃÖ¤Ç ¤¹.

line 36:

¿·¤·¤¤¥¹¥¿¥Ã¥¯¥Õ¥ì¡¼¥à¤Î»ÈÍѤò»ØÄꤷ¤Æ¤¤¤Þ¤¹. ¤³¤ì¤Ï¸½ ºß¤ÏɬÍפ¢¤ê¤Þ¤»¤ó. trap¤Î¾ì¹ç¤Ç¤Ï¥¹¥¿¥Ã¥¯¥Õ¥ì¡¼¥à¤ÏÀµ ¤·¤¤¾ì½ê¤ò»Ø¤·¤Æ¤¤¤ë¤È¹Í¤¨¤é¤ì¤Þ¤¹. (»ä¤Ï¿·¤·¤¤¥³¥¢¥À¥ó¥× ¤ò»ý¤Ã¤Æ¤¤¤Þ¤»¤ó. »ä¤Î¥«¡¼¥Í¥ë¤ÏŤ¤´Ö panic¤òµ¯¤³¤·¤Æ¤¤¤Þ ¤»¤ó.) ¥½¡¼¥¹¥³¡¼¥É¤Î 403¹Ô¤ò¸«¤ë¤È,``tp''¥Ý¥¤¥ó¥¿¤Î¥¢¥¯ ¥»¥¹¤¬¼ºÇÔ¤·¤Æ¤¤¤ë¤«ÇÛÎó¤Î¥¢¥¯¥»¥¹¤¬Èϰϳ°¤Ç¤¢¤ë²ÄǽÀ­¤¬¹â ¤¤¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹.

line 52:

²ø¤·¤¤¥Ý¥¤¥ó¥¿¤Ç¤¹¤¬, ¥¢¥¯¥»¥¹¤ÏÀµ¾ï¤Ë¤ª¤³¤Ê¤¨¤Þ¤·¤¿.

line 56:

¤È¤³¤í¤¬, ÌÀ¤é¤«¤Ë¥Ý¥¤¥ó¥¿¤Ï¥´¥ß¤ò»Ø¤·¤Æ¤¤¤Þ¤¹. ¤³¤ì¤Ç ¥¨¥é¡¼¤ò¸«¤Ä¤±¤Þ¤·¤¿! (¤³¤³¤Î¥³¡¼¥É¤ÎÉôʬ¤«¤é¤Ï¤è¤¯¤ï¤«¤ê ¤Þ¤»¤ó¤¬, tp->t_line¤Ï¥³¥ó¥½¡¼¥ë¥Ç¥Ð¥¤¥¹¤Îµ¬Äê ¤¹¤ë¹Ô¤ò»²¾È¤·¤Æ¤¤¤ë¤Î¤Ç, ¤â¤Ã¤È¾®¤µ¤ÊÀ°¿ô¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤» ¤ó. )