¸¶ºî Paul Richards <paul@FreeBSD.ORG> and Jörg Wunsch <joerg@FreeBSD.ORG>
Ìõ: ÆâÀî ´î¾Ï <yoshiaki@kt.rim.or.jp>. 18 March 1997.
¤³¤³¤Ç¤Ï¥¯¥é¥Ã¥·¥å¥À¥ó¥× (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
¾å¤Î½ÐÎϤˤĤ¤¤Æ¤Î¥³¥á¥ó¥È¤ò¤·¤Þ¤¹.
¤³¤ì¤Ï DDB (¸å½Ò) ¤«¤é¤Î¥À¥ó¥×¤Ç¤¹. ¤³¤Î¤¿¤á ``because you said to!'' ¤È¤¤¤¦ panic¥³¥á¥ó¥È¤¬¤Ä¤, ¥Ú¡¼¥¸¥Õ¥©¥ë¥È¤Î¥È ¥é¥Ã¥×¤Ë¤è¤Ã¤Æ DDB¤ËÆþ¤Ã¤¿¤³¤È¤¬¸¶°ø¤Î, ¤ä¤äŤ¤¥¹¥¿¥Ã¥¯¥È¥ì¡¼ ¥¹¤¬¤¢¤ê¤Þ¤¹.
¥¹¥¿¥Ã¥¯¥È¥ì¡¼¥¹¤Ç¤Î¤³¤ì¤Ï trap()´Ø¿ô¤Î°ÌÃÖ¤Ç ¤¹.
¿·¤·¤¤¥¹¥¿¥Ã¥¯¥Õ¥ì¡¼¥à¤Î»ÈÍѤò»ØÄꤷ¤Æ¤¤¤Þ¤¹. ¤³¤ì¤Ï¸½ ºß¤ÏɬÍפ¢¤ê¤Þ¤»¤ó. trap¤Î¾ì¹ç¤Ç¤Ï¥¹¥¿¥Ã¥¯¥Õ¥ì¡¼¥à¤ÏÀµ ¤·¤¤¾ì½ê¤ò»Ø¤·¤Æ¤¤¤ë¤È¹Í¤¨¤é¤ì¤Þ¤¹. (»ä¤Ï¿·¤·¤¤¥³¥¢¥À¥ó¥× ¤ò»ý¤Ã¤Æ¤¤¤Þ¤»¤ó. »ä¤Î¥«¡¼¥Í¥ë¤ÏŤ¤´Ö panic¤òµ¯¤³¤·¤Æ¤¤¤Þ ¤»¤ó.) ¥½¡¼¥¹¥³¡¼¥É¤Î 403¹Ô¤ò¸«¤ë¤È,``tp''¥Ý¥¤¥ó¥¿¤Î¥¢¥¯ ¥»¥¹¤¬¼ºÇÔ¤·¤Æ¤¤¤ë¤«ÇÛÎó¤Î¥¢¥¯¥»¥¹¤¬Èϰϳ°¤Ç¤¢¤ë²ÄǽÀ¤¬¹â ¤¤¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹.
²ø¤·¤¤¥Ý¥¤¥ó¥¿¤Ç¤¹¤¬, ¥¢¥¯¥»¥¹¤ÏÀµ¾ï¤Ë¤ª¤³¤Ê¤¨¤Þ¤·¤¿.
¤È¤³¤í¤¬, ÌÀ¤é¤«¤Ë¥Ý¥¤¥ó¥¿¤Ï¥´¥ß¤ò»Ø¤·¤Æ¤¤¤Þ¤¹. ¤³¤ì¤Ç ¥¨¥é¡¼¤ò¸«¤Ä¤±¤Þ¤·¤¿! (¤³¤³¤Î¥³¡¼¥É¤ÎÉôʬ¤«¤é¤Ï¤è¤¯¤ï¤«¤ê ¤Þ¤»¤ó¤¬, tp->t_line¤Ï¥³¥ó¥½¡¼¥ë¥Ç¥Ð¥¤¥¹¤Îµ¬Äê ¤¹¤ë¹Ô¤ò»²¾È¤·¤Æ¤¤¤ë¤Î¤Ç, ¤â¤Ã¤È¾®¤µ¤ÊÀ°¿ô¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤» ¤ó. )