ÀÌ Àå¿¡¼´Â Å©·¡½Ã ´ýÇÁ·ÎºÎÅÍ Ä¿³Î µð¹ö±ë ÀÛ¾÷À» Çϱâ À§ÇÑ
¸í·ÉµéÀ» ¼³¸íÇÕ´Ï´Ù. ÀÌ ¸í·ÉµéÀ» »ç¿ëÇϱâ À§Çؼ´Â Å©·¡½Ã ´ýÇÁ¸¦
À§ÇÑ ÃæºÐÇÑ µð½ºÅ© ¿ë·®ÀÌ ÇÊ¿äÇÕ´Ï´Ù. ¸¸¾à ¿©·¯ °³ÀÇ
½º¿Ò ÆÄƼ¼ÇÀÌ ÀÖ´Â ½Ã½ºÅÛ¿¡¼ ù¹ø° ½º¿Ò ÆÄƼ¼ÇÀÌ
´ýÇÁ¸¦ ÀúÀåÇϱ⿡ ¿ë·®ÀÌ ÀÛÀ» ¶§¿¡´Â ´Ù¸¥ ÆÄƼ¼Ç¿¡
´ýÇÁ¸¦ ¹Þµµ·Ï Ä¿³Î ¼³Á¤À» º¯°æÇϰųª(config kernel
¶óÀÎ),
dumpon(8) ¸í·ÉÀ» »ç¿ëÇÏ¿© ´Ù¸¥ ÆÄƼ¼ÇÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
dumpon(8) ¸í·ÉÀ» »ç¿ëÇÒ °æ¿ì, /etc/rc.conf
ÀÇ
dumpdev
º¯¼ö¿¡ ¼³Á¤ÇØÁÖ´Â °ÍÀÌ Á¦ÀÏ ÁÁÀº ¹æ¹ýÀÔ´Ï´Ù.
ÀϹÝÀûÀ¸·Î /etc/fstab
ÆÄÀÏ¿¡ ÁöÁ¤µÇ¾î ÀÖ´Â ½º¿Ò ÀåÄ¡µé Áß
Çϳª¸¦ ÁöÁ¤ÇØÁÖ¸é µË´Ï´Ù.
Å×ÀÌÇÁ¿Í °°ÀÌ ½º¿Ò ÀåÄ¡°¡ ¾Æ´Ñ ´Ù¸¥ ÀåÄ¡¿¡ ´ýÇÁÇÏ´Â °ÍÀº ÇöÀç
Áö¿øµÇÁö ¾Ê½À´Ï´Ù. config -g
¸¦ ½ÇÇàÇÏ¿© Ä¿³ÎÀ»
¼³Á¤ÇϽñ⠹ٶø´Ï´Ù.
FreeBSD Ä¿³Î ¼³Á¤¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº
FreeBSD Ä¿³Î ¼³Á¤À» Âü°íÇϽñâ
¹Ù¶ø´Ï´Ù.
Ä¿³Î¿¡ ¾î´À ÀåÄ¡·Î ´ýÇÁÇÒ °ÍÀÎÁö ÁöÁ¤ÇØÁÖ±â À§Çؼ dumpon(8)
¸í·ÉÀ» »ç¿ëÇÕ´Ï´Ù (ÁÖ: swapon(8)
¸í·ÉÀ» ÅëÇØ ¾î¶²
ÆÄƼ¼ÇÀ» ½º¿Ò ¿µ¿ªÀ¸·Î »ç¿ëÇÒ °ÍÀÎÁö ¼³Á¤ÇÑ ´ÙÀ½¿¡ »ç¿ëÇؾß
ÇÕ´Ï´Ù). ÀϹÝÀûÀ¸·Î /etc/rc.conf
¿Í /etc/rc
ÆÄÀÏ¿¡ ³ª¶õÈ÷ ¼³Á¤µË´Ï´Ù.
´Ù¸¥ ¹æ¹ýÀ¸·Î, Ä¿³Î ¼³Á¤ ÆÄÀÏ ³»ÀÇ 'config' ¶óÀÎÀÇ 'dump' Àý¿¡
´ýÇÁ ÀåÄ¡¸¦ Çϵå ÄÚµùÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀÌ´Â ±ÇÀåµÇÁö ¾Ê´Â ¹æ¹ýÀ̸ç, ºÎÆà µµÁß¿¡ ¼Õ»óµÈ
Ä¿³ÎÀ¸·ÎºÎÅÍ Å©·¡½Ã ´ýÇÁ¸¦ ¾ò°íÀÚ ÇÒ ¶§¸¸ »ç¿ëÇÏ´Â ÆíÀÌ ¹Ù¶÷Á÷ÇÕ´Ï´Ù.
ÁÖ: ÀÌÁ¦ºÎÅÍ `kgdb
' ¶ó´Â ¿ë¾î´Â
'Ä¿³Î µð¹ö±ë ¸ðµå'¿¡¼ ½ÇÇàµÇ´Â gdb
¸¦ ÀǹÌÇÕ´Ï´Ù.
gdb
¸¦ -k
¿É¼Ç°ú °°ÀÌ ½ÇÇà
½ÃÅ°°Å³ª, kgdb
¶ó´Â À̸§À¸·Î ¸µÅ©½ÃÄÑ ½ÇÇà½Ãų ¼ö ÀÖ½À´Ï´Ù.
±×·¯³ª kgdb¶ó´Â À̸§Àº ±âº»À¸·Î Á¦°øµÈ °ÍÀÌ ¾Æ´Ï¸ç,
GNU ±¸¼º¿øµéÀº ÀÚ½ÅÀÇ ÇÁ·Î±×·¥µéÀÌ ¼·Î ´Ù¸¥ À̸§À¸·Î ºÒ¸®¿ì¸é¼
´Ù¸¥ ±â´ÉÀ» Á¦°øÇÏ´Â °ÍÀ» ¿øÄ¡ ¾Ê½À´Ï´Ù.
ÀÌ·± Ư¡Àº ÇâÈÄ ¸±¸®Áîµé¿¡¼´Â »ç¶óÁú °ÍÀÔ´Ï´Ù.
Ä¿³Î ºôµå ½Ã kernel.debug
µîÀÇ À̸§À¸·Î º¹»çº»À»
Çϳª ¸¸µç ´ÙÀ½, Ä¿³Î ¿øº»¿¡ ´ëÇÏ¿© strip -d
¸í·ÉÀ» ¼öÇàÇÏ°í
Á¤»óÀûÀ¸·Î ÀνºÅçÇÕ´Ï´Ù. ½Éº¼ Å×À̺íÀ» »èÁ¦ÇÏÁö
¾ÊÀº Ä¿³Î·Î ÀνºÅçÀÌ °¡´ÉÇÏÁö¸¸, ¸î¸î ÇÁ·Î±×·¥¿¡ ´ëÇÑ
½Éº¼ Å×ÀÌºí °Ë»ö ½Ã°£ÀÌ ½É°¢ÇÏ°Ô Áõ°¡ÇÏ°Ô µÇ°í, ºÎÆà ½Ã
½Éº¼ Å×À̺íÀ» Æ÷ÇÔÇÑ Àüü Ä¿³ÎÀÌ ·ÎµùµÇ¾î ³ªÁß¿¡ ½º¿ÒÇÒ ¼ö ¾ø°Ô µÇ¸ç,
¼ö¸Þ°¡ ¹ÙÀÌÆ®ÀÇ ¹°¸®Àû ¸Þ¸ð¸®°¡ ³¶ºñµË´Ï´Ù.
ºÎÆ® ÇÁ·ÒÇÁÆ®¿¡¼ »õ·Î¿î Ä¿³Î À̸§À» ŸÀÌÇÎÇÏ¿© ºÎÆÃÇÏ´Â ½ÄÀ¸·Î
»õ·Î¿î Ä¿³ÎÀ» Å×½ºÆ®ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ´Ù½Ã ½Ã½ºÅÛÀ»
Á¤»óÀûÀ¸·Î µ¿ÀÛ½ÃÅ°±æ ¿øÇÒ ¶§¿¡´Â, ºÎÆ® ÇÁ·ÒÇÁÆ®¿¡¼
-s
Ç÷¢À» ÀÌ¿ëÇÏ¿© ´ÜÀÏ À¯Àú »óÅ·ΠºÎÆÃÇÕ´Ï´Ù.
±× ÀÌÈĺÎÅÍ ´ÙÀ½ÀÇ ÀýÂ÷¸¦ ¼öÇàÇÕ´Ï´Ù.
fsck -p
mount -a -t ufs # so your file system for /var/crash is writable
savecore -N /kernel.panicked /var/crash
exit # ...to multi-user
À§ÀÇ ¸í·ÉµéÀº 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:uriah # cd /sys/compile/URIAH
3:uriah # 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:uriah # exit
78:exit
79:
80:Script done on Fri Dec 30 23:18:04 1994
´ÙÀ½Àº À§ ½ºÅ©¸³Æ®¿¡ ´ëÇÑ ¼³¸íÀÔ´Ï´Ù.
À§ ½ºÅ©¸³Æ®´Â DDB(¾Æ·¡ ÂüÁ¶) ³»¿¡¼ ¾òÀº ´ýÇÁÀ̸ç, ``because you said to!''´Â ÆдÐ(panic) ¸Þ½ÃÁöÀÌ¸ç ´Ù¼Ò ±ä ½ºÅà ÃßÀû(trace)À» º¸¿©ÁÝ´Ï´Ù. DDB·Î ¿Å°Ü°£ ÀÌÀ¯´Â Ä¿³ÎÀÌ ÆäÀÌÁö ÆúÆ® Æ®·¦¿¡ ºüÁ³±â ¶§¹®ÀÔ´Ï´Ù.
½ºÅà ÃßÀû¿¡¼ trap()
ÇÔ¼öÀÇ À§Ä¡ÀÔ´Ï´Ù.
»õ·Î¿î ½ºÅà ÇÁ·¹ÀÓÀ» °Á¦·Î »ç¿ëÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. ÇöÀç´Â ´õ ÀÌ»ó ÇÊ¿ä·Î ÇÏÁö ¾Ê½À´Ï´Ù. Æ®·¦¿¡ ÀâÈù °æ¿ì¶ó ÇÏ´õ¶óµµ ½ºÅà ÇÁ·¹ÀÓÀÌ ÇöÀç ¿Ã¹Ù¸¥ À§Ä¡¸¦ °¡¸®Å°°í ÀÖ´Ù°í °¡Á¤ÇÕ´Ï´Ù. (Àú´Â <g> ¿¡ À¯¿ëÇÑ ÄÚ¾î ´ýÇÁ¸¦ °¡Áö°í ÀÖÁö ¾Ê½À´Ï´Ù. Á¦ Ä¿³ÎÀº ²Ï ¿À·£ ½Ã°£ µ¿¾È Æдп¡ ºüÁø ÀûÀÌ ¾ø¾ú½À´Ï´Ù.) ¼Ò½º ÄÚµåÀÇ 403ÁÙ¿¡¼ º¼ ¼ö ÀÖ´Â ¹Ù¿Í °°ÀÌ, ``tp''¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ°¡ ¾ûÄװųª, ¹è¿ ¾ï¼¼½º¿¡¼ °æ°è¸¦ ³Ñ¾î¼¹À» °¡´É¼ºÀÌ ³ô½À´Ï´Ù.
Æ÷ÀÎÅÍ°¡ Àǽɽº·´Áö¸¸, ¿Ã¹Ù¸¥ ÁÖ¼Ò¸¦ °¡¸®Å°°í ÀÖ½À´Ï´Ù.
±×·¯³ª, ºÐ¸íÈ÷ Æ÷ÀÎÅÍ´Â ¾µ¸ð ¾ø´Â ¿µ¿ªÀ» °¡¸®Å°°í ÀÖ°í,
µû¶ó¼ À̺κп¡¼ ¿¡·¯¸¦ ã¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù.
(ÀÌ·± Ư¼öÇÑ Äڵ忡 ´ëÇØ Àͼ÷ÇÏÁö ¸øÇÑ ºÐµéÀ» À§ÇØ, ¿©±â¼
tp->t_line
Àº ÄÜ¼Ö ÀåÄ¡ÀÇ ¶óÀÎ ±ÔÄ¢À» ³ªÅ¸³»´Â
°ÍÀ̸ç, ÀÛÀº Á¤¼ö °ªÀ» °¡Á®¾ß ÇÏ´Â Á¡À» ¾Ë·Á µå¸³´Ï´Ù.)