Chapter 22. Ä¿³Î µð¹ö±ë

Table of Contents
22.1. gdb¸¦ ÀÌ¿ëÇÑ Ä¿³Î Ãæµ¹ ´ýÇÁ(crash dump)ÀÇ µð¹ö±ë
22.2. DDD¸¦ ÀÌ¿ëÇÑ Ãæµ¹ ´ýÇÁÀÇ µð¹ö±ë
22.3. ´ýÇÁÀÇ »çÈÄ(Post-Mortem) ºÐ¼®
22.4. DDB¸¦ ÀÌ¿ëÇÑ ¿Â¶óÀÎ Ä¿³Î µð¹ö±ë
22.5. ¿ø°Ý(remote) GDB¸¦ ÀÌ¿ëÇÑ ¿Â¶óÀÎ Ä¿³Î µð¹ö±ë
22.6. GDB¸¦ ÀÌ¿ëÇÑ ¸ðµâ(loadable module) µð¹ö±ë
22.7. ÄÜ¼Ö µå¶óÀ̹öÀÇ µð¹ö±ë

Paul Richards , Jörg Wunsch Àú

¹ÚÀÏ±Õ ¹ø¿ª

22.1. gdb¸¦ ÀÌ¿ëÇÑ Ä¿³Î Ãæµ¹ ´ýÇÁ(crash dump)ÀÇ µð¹ö±ë

º» Àå¿¡¼­´Â Ä¿³Î µð¹ö±ëÀ» À§ÇØ Ãæµ¹ ´ýÇÁ¸¦ ÀÌ¿ëÇÏ´Â ¸î°¡Áö ¹æ¹ýÀ» ¼³¸íÇÕ´Ï´Ù. À̸¦ À§ÇÏ¿© ¿©·¯ºÐÀÇ ½Ã½ºÅÛ¿¡´Â Ãæµ¹ ´ýÇÁ¸¦ À§ÇÑ ÃæºÐÇÑ ½º¿Ò °ø°£À» ÇÊ¿ä·Î ÇÕ´Ï´Ù. ¸¸¾à ¿©·¯ °³ÀÇ ½º¿Ò ÆÄƼ¼Ç Áß¿¡ ù¹øÂ° ÆÄƼ¼ÇÀÇ °ø°£ÀÌ ´ýÇÁ¸¦ ÀúÀåÇϱ⿡ ÃæºÐÄ¡ ¾ÊÀ» ¶§¿¡´Â Ä¿³Î ¼³Á¤À» º¯°æÇϰųª(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 Àý¿¡ ´ýÇÁÇÒ ½º¿Ò ÀåÄ¡¸¦ Çϵå ÄÚµùÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ÀÌ´Â ±ÇÀåµÇÁö ¾Ê´Â ¹æ¹ýÀ̸ç, ºÎÆÃ °úÁ¤ Áß¿¡ ¼Õ»óµÇ´Â Ä¿³Î·ÎºÎÅÍ Ãæµ¹ ´ýÇÁ¸¦ ¾ò°í ÇÒ ¶§¸¸ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.

Note: ÀÌÁ¦ºÎÅÍ gdb ¶ó´Â ¿ë¾î´Â "Ä¿³Î µð¹ö±ë ¸ðµå"¿¡¼­ µ¿ÀÛÇÏ´Â gdb µð¹ö°Å¸¦ °¡¸®Åµ´Ï´Ù. gdb ¸í·ÉÀ» -k ¿É¼Ç°ú °°ÀÌ ½ÇÇà½Ã۸é Ä¿³Î µð¹ö±ë ¸ðµå·Î µð¹ö±ëÇÒ ¼ö ÀÖ½À´Ï´Ù. Ä¿³Î µð¹ö±ë ¸ðµå¿¡¼­, gdb´Â ÇÁ·ÒÇÁÆ®¸¦ (kgdb)·Î ¹Ù²ß´Ï´Ù.

Tip: FreeBSD 3À̳ª ±× ÀÌÀü ¹öÀü¿¡¼­´Â Å©±â°¡ Å« µð¹ö±ë¿ë Ä¿³Î ´ë½Å µð¹ö±ë¿ë ½Éº¼À» Á¦°ÅÇÑ º¹»çº»À» ¸¸µé¾î¼­ ¼³Ä¡ÇØ¾ß ÇÕ´Ï´Ù.

    # cp kernel kernel.debug
    # strip -g kernel

¹Ýµå½Ã ÇÊ¿äÇÑ ÀÛ¾÷ÀÌ ¾Æ´ÏÁö¸¸ ½ÇÇàÇÒ °ÍÀ» ÃßõÇÕ´Ï´Ù. (FreeBSD 4³ª ±× ÀÌÈÄ ¸±¸®Áî¿¡¼­´Â Ä¿³Î make °úÁ¤ÀÇ ¸¶Áö¸·¿¡ ÀÚµ¿À¸·Î ½ÇÇàµË´Ï´Ù.) ÀÌ·¯ÇÑ °úÁ¤À» °ÅÃÄ Ä¿³ÎÀÇ µð¹ö±ë¿ë ½Éº¼ÀÌ Á¦°ÅµÇ°í ³ª¸é, make install ¸í·ÉÀ» ½ÇÇàÇÏ¿© Ä¿³ÎÀ» ¼³Ä¡ÇÒ ¼ö ÀÖ½À´Ï´Ù.

¿¹ÀüÀÇ FreeBSD ¸±¸®Áî(3.1 ÀÌÀü ¹öÀü)´Â ±âº»ÀûÀ¸·Î a.out Ä¿³ÎÀ» »ç¿ëÇϰí ÀÖÀ¸¸ç, ¹°¸®ÀûÀÎ ¸Þ¸ð¸®¿¡ ½Éº¼ Å×À̺íÀ» Ç×»ó »óÁÖ½Ã۰í ÀÖÀ½À» ÁÖÀÇÇϱ⠹ٶø´Ï´Ù. µð¹ö±ë ½Éº¼ÀÌ Á¦°ÅµÇÁö ¾ÊÀº µð¹ö±ë¿ë Ä¿³ÎÀº º¸´Ù Å« ½Éº¼ Å×À̺íÀ» °¡Áö°Ô µÇ¹Ç·Î ¸Þ¸ð¸®°¡ ´õ ³¶ºñµË´Ï´Ù. ÃÖ±ÙÀÇ FreeBSD ¸±¸®Áî´Â ÀÌ·± ¹®Á¦¸¦ ÀÏÀ¸Å°Áö ¾Ê´Â ELF Ä¿³ÎÀ» »ç¿ëÇϰí ÀÖ½À´Ï´Ù.

ºÎÆ® ÇÁ·ÒÇÁÆ®¿¡¼­ »õ·Î¿î Ä¿³ÎÀÇ À̸§À» ÀÔ·ÂÇÏ¸é »õ·Î¿î Ä¿³ÎÀ» Å×½ºÆ® ÇÒ ¼ö ÀÖÀ¸¸ç, Å×½ºÆ® µµÁß Ãæµ¹ÀÌ ¹ß»ýÇÏ¿© ´Ù¸¥ Ä¿³Î·Î ½Ã½ºÅÛÀ» »ì¸± °æ¿ì¿¡´Â ºÎÆ® ÇÁ·ÒÇÁÆ®¿¡¼­ -s Ç÷¡±×¸¦ ÀÔ·ÂÇÏ¿© ´ÜÀÏ À¯Àú ¸ðµå·Î µé¾î°©´Ï´Ù. ±×¸®°í ´ÙÀ½ ¸í·ÉµéÀ» ½ÇÇàÇÕ´Ï´Ù.

    # fsck -p
    # mount -a -t ufs       # /var/crashÀÇ ÀúÀåÀ» À§ÇØ ÆÄÀÏ ½Ã½ºÅÛÀ» ¾²±â °¡´ÉÇÏ°Ô ¹Ù²ß´Ï´Ù.
    # savecore -N /kernel.panicked /var/crash
    # exit                  # ¸ÖƼ À¯Àú ¸ðµå·Î ÁøÀÔ...

ÀÌ·¸°Ô ÇÔÀ¸·Î½á savecore(8)´Â ´Ù¸¥ Ä¿³ÎÀÇ ½Éº¼ÀÇ À̸§À» ÃßÃâÇÏ°Ô µË´Ï´Ù. ±âº»ÀûÀ¸·Î´Â ÇöÀç µ¿ÀÛÇÏ´Â Ä¿³ÎÀÌ ½Éº¼ À̸§ ÃßÃâÀÇ ´ë»óÀÌ µÉ °ÍÀ̰í, Ãæµ¹ ³»¿ëÀÌ ´ýÇÁµÈ Ä¿³ÎÀÇ ½Éº¼°ú ´Ù¸£±â ¶§¹®¿¡ ¾Æ¹« °Íµµ ÇÒ ¼ö ¾ø°Ô µË´Ï´Ù.

Ãæµ¹ ´ýÇÁ ÈÄ¿¡´Â /sys/compile/WHATEVER·Î °¡¼­ gdb -k ¸í·ÉÀ» ½ÇÇàÇÕ´Ï´Ù. gdb¿¡¼­ ´ÙÀ½À» ¼öÇàÇÕ´Ï´Ù.

    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:# gdb -k 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!"¿Í ¾à°£ ±ä ½ºÅà ÃßÀû¹®À» º¼ ¼ö ÀÖ½À´Ï´Ù. Ä¿³ÎÀÌ ÆäÀÌÁö ¿À·ù Æ®·¦¿¡ °É·Á¼­ DDB·Î ºüÁ³½À´Ï´Ù.

line 20:

¿©±â´Â ½ºÅà ÃßÀû¹® Áß¿¡¼­ trap() ÇÔ¼öÀÇ À§Ä¡¸¦ ³ªÅ¸³À´Ï´Ù.

line 36:

»õ·Î¿î ½ºÅà ÇÁ·¹ÀÓÀ» °­Á¦·Î »ç¿ëÇÏ°Ô ÇÕ´Ï´Ù. ÀÌ´Â ÇöÀç ´õ ÀÌ»ó ÇÊ¿äÇÏÁö ¾Ê½À´Ï´Ù. Æ®·¦¿¡ ÀâÈù °æ¿ì¿¡µµ ½ºÅà ÇÁ·¹ÀÓÀº ¿Ã¹Ù¸¥ À§Ä¡¸¦ °¡¸®Å°°í ÀÖ´Ù°í °¡Á¤ÇÕ´Ï´Ù. (Àú´Â »õ Ä¿³Î¿¡ ´ëÇÏ¿© <g>¸¦ ÀÌ¿ëÇÑ À¯¿ëÇÑ ´ýÇÁ¸¦ °¡Áö°í ÀÖÁö ¾Ê½À´Ï´Ù. Á¦ Ä¿³ÎÀº ²Ï ¿À·£ ½Ã°£ ÆÐ´Ð¿¡ ºüÁø ÀûÀÌ ¾ø¾ú½À´Ï´Ù.) ¼Ò½º ÄÚµåÀÇ 403 ¶óÀο¡¼­ º¼ ¼ö ÀÖ´Â ¹Ù¿Í °°ÀÌ, "tp"¸¦ °¡¸®Å°´Â Æ÷ÀÎÅͰ¡ ¾ûÄװųª, ¹è¿­ ¾ï¼¼½º¿¡¼­ °æ°è¸¦ ³Ñ¾î¼¹À» °¡´É¼ºÀÌ ³ô½À´Ï´Ù.

line 52:

Æ÷ÀÎÅͰ¡ Àǽɽº·´Áö¸¸, ¿Ã¹Ù¸¥ À§Ä¡¸¦ °¡¸®Å°°í ÀÖ½À´Ï´Ù.

line 56:

±×·¯³ª, ºÐ¸íÈ÷ Æ÷ÀÎÅÍ´Â ¾µ¸ð ¾ø´Â ¿µ¿ªÀ» °¡¸®Å°°í ÀÖ°í, µû¶ó¼­ ÀÌ ºÎºÐ¿¡¼­ ¿¡·¯¸¦ ã¾Æ³¾ ¼ö ÀÖ¾ú½À´Ï´Ù. (ÀÌ·± Ư¼öÇÑ Äڵ忡 ´ëÇØ Àͼ÷Ä¡ ¸øÇÑ ºÐµéÀ» À§ÇØ ¼³¸íÇϸé, tp->t_lineÀº ÄÜ¼Ö ÀåÄ¡ÀÇ ¶óÀÎ ±ÔÄ¢À» ³ªÅ¸³»´Â °ÍÀ̸ç, ÀÛÀº Á¤¼ö °ªÀ» °¡Á®¾ß ÇÕ´Ï´Ù.)