Annotation of researchv8dc/cmd/adb/udb.t, revision 1.1.1.1

1.1       root        1: .po .5i
                      2: .bd S B 3
                      3: .de UX
                      4: .ie \\n(GA>0 \\$2UNIX\\$1
                      5: .el \{\
                      6: .if n \\$2UNIX\\$1*
                      7: .if t \\$2UNIX\\$1\\f1\(dg\\fP
                      8: .FS
                      9: .if n *UNIX
                     10: .if t \(dgUNIX
                     11: .ie \\$3=1 is a Footnote of Bell Laboratories.
                     12: .el is a Trademark of Bell Laboratories.
                     13: .FE
                     14: .nr GA 1\}
                     15: ..
                     16: .TL
                     17: Using ADB to Debug the
                     18: .UX
                     19: Kernel
                     20: .AU
                     21: Samuel J. Leffler
                     22: .AU
                     23: William N. Joy
                     24: .AI
                     25: Computer Systems Research Group
                     26: Department of Electrical Engineering and Computer Science
                     27: University of California, Berkeley
                     28: Berkeley, California  94720
                     29: (415) 642-7780
                     30: .de IR
                     31: \fI\\$1\fP\\$2
                     32: ..
                     33: .de DT
                     34: .TA 8 16 24 32 40 48 56 64 72 80
                     35: ..
                     36: .AB
                     37: .PP
                     38: .FS
                     39: *DEC and VAX are trademarks of
                     40: Digital Equipment Corporation.
                     41: .FE
                     42: This document describes the use of extensions made
                     43: to the 4.1bsd release of the VAX*
                     44: .UX
                     45: debugger adb for the purpose of debugging the
                     46: .UX
                     47: kernel.
                     48: It discusses the changes made to allow
                     49: standard adb commands to
                     50: function properly with the kernel and
                     51: introduces the basics necessary for users
                     52: to write adb command scripts which
                     53: may be used to augment the standard adb
                     54: command set.  The examination techniques described here
                     55: may be applied to running systems, as well as 
                     56: the post-mortem dumps automatically created
                     57: by the 
                     58: .IR savecore (8)
                     59: program after a system crash.
                     60: The reader is expected to have at least a
                     61: passing familiarity with the debugger command
                     62: language.
                     63: .AE
                     64: .ds LH "Using ADB on the UNIX Kernel
                     65: .ds RH Introduction
                     66: .ds CF \*(DY
                     67: .LP
                     68: .nr H1 1
                     69: .ds CH "
                     70: .bp
                     71: .nr % 1
                     72: .ds CH "\(hy \\n(PN \(hy
                     73: .LG
                     74: .B
                     75: .ce
                     76: 1. INTRODUCTION
                     77: .sp 2
                     78: .R
                     79: .NL
                     80: .PP
                     81: Modifications have been made to the
                     82: standard VAX
                     83: .UX
                     84: debugger adb to simplify
                     85: examination of post-mortem
                     86: dumps automatically generated following a system crash.
                     87: These changes may also be used when examining
                     88: .UX
                     89: in its normal operation.
                     90: This document serves as
                     91: an introduction to the \fBuse\fP of
                     92: these facilities, and
                     93: should not be construed as a description
                     94: of \fIhow to debug the kernel\fP.
                     95: .NH 2
                     96: Invocation
                     97: .PP
                     98: When examining the
                     99: .UX
                    100: kernel a new option, \fB\-k\fP, should be used, e.g.
                    101: .sp 1
                    102: .ti +5
                    103: adb \-k /vmunix /dev/mem
                    104: .sp 1
                    105: This flag causes adb to partially simulate
                    106: the VAX virtual memory hardware when
                    107: accessing the \fIcore\fP file.
                    108: In addition the internal state maintained
                    109: by the debugger is initialized from
                    110: data structures maintained by the
                    111: .UX
                    112: kernel explicitly for debugging\(dd.
                    113: A post-mortem dump may be examined in a similar
                    114: fashion,
                    115: .sp 1
                    116: .ti +5
                    117: adb \-k vmunix.? vmcore.?
                    118: .sp 1
                    119: where the appropriate version of the saved operating system
                    120: image and core dump are supplied in place of ``?''.
                    121: .FS
                    122: \(dd If the \-k flag is not used when invoking
                    123: adb the user must explicitly calculate virtual
                    124: addresses.  With the \-k option adb interprets
                    125: page tables to automatically
                    126: perform virtual to physical address translation.
                    127: .FE
                    128: .NH 2
                    129: Establishing Context
                    130: .PP
                    131: During initialization adb attempts to establish the
                    132: context of the ``currently active process'' by examining
                    133: the value of the kernel variable \fImasterpaddr\fP.
                    134: This variable contains the virtual address of the 
                    135: process context block of the last process which
                    136: was set executing by the \fISwtch\fP routine.
                    137: \fImasterpaddr\fP normally provides sufficient information
                    138: to locate the current stack frame (via the stack
                    139: pointers found in the context block).
                    140: By locating the VAX process context block for the
                    141: process, adb may then perform virtual to
                    142: physical address translation using that process's
                    143: in-core page tables.
                    144: .PP
                    145: When examining post-mortem dumps establishing the
                    146: context of the ``currently active process'' is nontrivial.
                    147: This is due to the different ways in which the
                    148: VAX may save state after a nonrecoverable error. 
                    149: Crashes may or may not be ``clean'' (i.e.
                    150: the top of the interrupt stack contains the process's
                    151: kernel mode stack pointer and program counter);
                    152: an ``unclean'' crash will occur, for instance,
                    153: if the interrupt stack overflows.
                    154: Thus, one must manually try one of two possible techniques
                    155: to get a stack trace from a post-mortem dump.  If the
                    156: crash was clean the current stack frame is present at the
                    157: ``top'' of the interrupt stack, \fIintstack\-4\fP,
                    158: and the command
                    159: .sp 1
                    160: .ti +5
                    161: *(\fBintstack\fP\-4)$c
                    162: .sp 1
                    163: will generate a stack trace all the way from the kernel
                    164: to the top of the user process's stack (e.g. to the
                    165: \fImain\fP routine in the user process which was running).
                    166: Otherwise, one must scan through the interrupt stack
                    167: looking for the stack frame.  This is usually indicated
                    168: by a zero longword entry (the argument count),
                    169: .sp 1
                    170: .in +5
                    171: .nf
                    172: \fBintstack\fP/\fBX\fP
                    173: .fi
                    174: .in -5
                    175: .sp 1
                    176: Once the stack frame has been located, the command
                    177: .sp 1
                    178: .ti +5
                    179: \fB*.$c\fP
                    180: .sp 1
                    181: will generate a stack trace.
                    182: An alternate method may be used when a trace of a particular
                    183: process is required, see section 2.3.
                    184: .ds RH "Command Scripts
                    185: .LP
                    186: .nr H1 2
                    187: .bp
                    188: .LG
                    189: .B
                    190: .ce
                    191: 2. ADB COMMAND SCRIPTS
                    192: .sp 2
                    193: .R
                    194: .nr H2 0
                    195: .NL
                    196: .NH 2
                    197: Extending the Formatting Facilities
                    198: .PP
                    199: Once the process context has been established, the
                    200: complete adb command set is available for interpreting
                    201: data structures.  In addition, a number of adb scripts have
                    202: been created to simplify the structured printing of commonly
                    203: referenced kernel data structures.  The scripts normally
                    204: reside in
                    205: the directory \fI/usr/lib/adb\fP, and are invoked
                    206: with the ``$<'' operator.
                    207: (A later table lists the ``standard'' scripts.)
                    208: .PP
                    209: As an example, consider the following listing which
                    210: contains a dump of a faulty process's state
                    211: (our typing is shown emboldened).
                    212: .sp 1
                    213: .nf
                    214: .DT
                    215: % \fBadb \-k vmunix.17 vmcore.17\fP
                    216: sbr 8001d064 slr d9c
                    217: p0br 800efa00 p0lr 34 p1br 7f8efe00 p1lr 1ffff2
                    218: \fB*(intstack\-4)$c\fP
                    219: _boot() from 80004025
                    220: _boot(0,4) from 80004025
                    221: _panic(80021185) from 800057e2
                    222: _soreceive(8017478c,0) from 80007c90
                    223: _read() from 800098d7
                    224: _syscall() from 8000b6e2
                    225: _Xsyscall(3,7fffe834,258) from 80000f64
                    226: ?() from c1c
                    227: ?() from 26a
                    228: ?(0,7fffef18,7fffef1c) from 1d3
                    229: ?() from 2f
                    230: \fB800021185/s\fP
                    231: _icpreg+99:    receive
                    232: \fBu$<u\fP
                    233: _u:
                    234: _u:            ksp             usp
                    235:                7fffff9c        7fffe59c
                    236:                r0              r1              r2              r3
                    237:                155c00          800237d4        80041800        3
                    238:                r4              r5              r6              r7
                    239:                0               0               11090           80041800
                    240:                r8              r9              r10             r11
                    241:                80021244        c               7fffe5b4        80000000
                    242:                ap              fp              pc              psl
                    243:                7fffffe8                7fffffa4                8000b784        d80004
                    244:                p0br            p0lr            p1br            p1lr
                    245:                800efa00        4000034 7f8efe00        1ffff2
                    246:                szpt            cmap2           sswap
                    247:                2               94000307        0
                    248:                sigc1           sigc2           sigc3
                    249:                1af03fb         fa007f02        40cbc6c
                    250: _u+78:         arg0            arg1            arg2
                    251:                3               7fffe834        258
                    252: _u+8c:         segflg  error   uid     gid     ruid    rgid    procp
                    253:                0       0       4       a       4       a       80041800
                    254: 
                    255: _u+d4:         uap             rv1             rv2             ubase
                    256:                7ffff078                0               1               7fffe834
                    257:                count           off             cdir            rdir
                    258:                258             150             8003cf00        0
                    259: _u+f4:         pathname
                    260:                .netrc
                    261:                dirp            dino    entry   pdir
                    262:                3               1395    .netrc0
                    263: 7ffff11c:      ofiles
                    264:                80040818        80040818        80040818        800406b0
                    265:                800406d4        800406ec        0               0
                    266:                0               0               0               0
                    267:                0               0               0               0
                    268:                0               0               0               0
                    269: 
                    270:                ofileflg
                    271:                0       0       0       0       0       0       0       0
                    272:                0       0       0       0       0       0       0       0
                    273:                0       0       0       0
                    274: 7ffff180:      sigs
                    275:                0               360c            1               360c
                    276:                0               0               0               aae
                    277:                0               0               0               0
                    278:                0               0               0               0
                    279:                0               0               0               0
                    280:                1               0               0               0
                    281:                0               0               0               0
                    282:                0               0               0               0
                    283: 
                    284:                code            ar0             prbase          prsize
                    285:                0               80000000        0               0
                    286: 
                    287: .ne 2
                    288: 7ffff248:      proff           prscal          eosys   sep     ttyp
                    289:                0               0               0       0       800288b4
                    290: 
                    291: 7ffff258:      ttymin  ttymaj
                    292:                0       0
                    293: 7ffff25e:      xmag            xtsiz           xdsiz           xbsiz
                    294:                3c000000        10000000        108c0000        a680000
                    295: 
                    296:                xssiz           entloc          relflg
                    297:                0               0               6c720000
                    298: 7ffff27e:      directory
                    299:                ogin
                    300:                start           acflg   fpflg   cmsk    tsiz    dsiz
                    301:                11688           0       12      0       160000          60000
                    302: 
                    303: 7ffff2a2:      ssiz
                    304:                80000
                    305: \fB80041800$<proc\fP
                    306: 80041800:      link            rlink           addr
                    307:                800237d4        0               800efde0
                    308: 8004180c:      upri    pri     cpu     stat    time    nice    slp     cursig
                    309:                073     073     045     03      023     024     0       0
                    310: 80041814:      sig             siga0           siga1           flag
                    311:                0               80002           45              8001
                    312: 80041824:      uid     pgrp    pid     ppid    poip    szpt    tsize
                    313:                4       bb      bc      bb      0       2       1e
                    314: 80041834:      dsize           ssize           rssize          maxrss
                    315:                16              6               14              3fffff
                    316: 80041844:      swrss           swaddr          wchan           textp
                    317:                0               0               0               80044ee0
                    318: 80041854:      clktim          p0br            xlink           ticks
                    319:                0               800efa00        80041720        22
                    320: 80041864:      %cpu                            ndx     idhash  pptr
                    321:                +5.1369253545999527e\-02        1c      8       80041720
                    322: \fB80044ee0$<text\fP
                    323: 80044ee0:      daddr
                    324:                7e2             0               0               0
                    325:                0               0               0               0
                    326:                0               0               0               0
                    327: 
                    328:                ptdaddr size            caddr           iptr
                    329:                352             1e              80041800        8003cfa0
                    330: 
                    331:                rssize  swrss   count   ccount  flag    slptim  poip
                    332:                1a      0       02      02      042     0       0
                    333: .sp 1
                    334: .fi
                    335: .PP
                    336: The cause of the crash was a ``panic''
                    337: (see the stack trace) due to the 0
                    338: argument passed the \fIsoreceive\fP routine.  The majority
                    339: of the dump was done to illustrate the use of two command
                    340: scripts used to format kernel data structures.  The ``u''
                    341: script, invoked by the command ``u$<u'', is a lengthy series
                    342: of commands which pretty-prints the user vector.  Likewise,
                    343: ``proc'' and ``text'' are scripts used to format the obvious
                    344: data structures.  Let's quickly examine the ``text'' script (the
                    345: script has been broken into a number of lines for convenience
                    346: here; in actuality it is a single line of text).
                    347: .sp 1
                    348: .nf
                    349: \&./"daddr"n12Xn\e
                    350: "ptdaddr"16t"size"16t"caddr"16t"iptr"n4Xn\e
                    351: "rssize"8t"swrss"8t"count"8t"ccount"8t"flag"8t"slptim"8t"poip"n2x4bx++n
                    352: .sp 1
                    353: .fi
                    354: The first line produces the list of disk block addresses associated
                    355: with a swapped out text segment.  The ``n'' format forces a new-line
                    356: character, with 12 hexadecimal integers printed immediately after.
                    357: Likewise, the remaining two lines of the command format the remainder
                    358: of the text structure.  The expression ``16t'' causes adb to tab
                    359: to the next column which is a multiple of 16.  
                    360: The last two plus operators are present
                    361: to round ``.'' to the end of the text structure.  This allows the
                    362: user to reinvoke the format on consecutive text structures without
                    363: having to be concerned about proper alignment of ``.''.
                    364: .PP
                    365: The majority of the scripts provided are of this nature.
                    366: When possible, the formatting scripts print a data structure
                    367: with a single format to allow subsequent reuse when interrogating
                    368: arrays of structures.  That is, the previous script could have
                    369: been written
                    370: .sp 1
                    371: .nf
                    372: \&./"daddr"n12Xn
                    373: +/"ptdaddr"16t"size"16t"caddr"16t"iptr"n4Xn
                    374: +/"rssize"8t"swrss"8t"count"8t"ccount"8t"flag"8t"slptim"8t"poip"n2x4bx++n
                    375: .sp 1
                    376: .fi
                    377: but then reuse of the format would have invoked only the last
                    378: line of the format.
                    379: .NH 2
                    380: Traversing Data Structures
                    381: .PP
                    382: The adb command language can be used to traverse complex data
                    383: structures.  One such data structure, a linked list, occurs
                    384: quite often in the kernel.  By using adb variables and the
                    385: normal expression operators it is a simple matter to construct
                    386: a script which chains down the list printing each element
                    387: along the way.
                    388: .PP
                    389: For instance, the queue of processes awaiting timer events,
                    390: the callout queue, is printed with the following two scripts:
                    391: .sp 1
                    392: .nf
                    393: .ne 4
                    394: \fBcallout\fP:
                    395: .in +5
                    396: .sp 1
                    397: calltodo/"time"16t"arg"16t"func"12+
                    398: *+$<callout.next
                    399: .sp 1
                    400: .ne 6
                    401: .ti -5
                    402: \fBcallout.next\fP:
                    403: .sp 1
                    404: \&./Dpp
                    405: *+>l
                    406: ,#<l$<
                    407: <l$<callout.next
                    408: .sp 1
                    409: .in -5
                    410: .fi
                    411: .PP
                    412: The first line of the script \fBcallout\fP starts the traversal
                    413: at the global symbol
                    414: \fIcalltodo\fP and prints a set of headings.
                    415: It then skips the empty portion of the structure used
                    416: as the head of the queue.
                    417: The second line then invokes the script \fBcallout.next\fP
                    418: moving ``.'' to
                    419: the top of the queue (``*+'' performs the indirection
                    420: through the link entry of the structure at the head of the queue).
                    421: .PP
                    422: \fBcallout.next\fP prints values for each column, then performs
                    423: a conditional test on the link to the next entry.  This test
                    424: is performed as follows,
                    425: .IP "*+>l" 9
                    426: Place the value of the ``link'' in the adb variable ``<l''.
                    427: .IP ",#<l$<"
                    428: If the value stored in ``<l'' is non-zero, then the current
                    429: input stream (i.e. the script \fBcallout.next\fP) is terminated.
                    430: Otherwise, the expression ``#<l'' will be zero, and the ``$<''
                    431: will be ignored.  That is, the combination of the logical negation
                    432: operator ``#'', adb variable ``<l'', and ``$<'' operator
                    433: creates a statement of the form,
                    434: .sp 1
                    435: .ce
                    436: if (!link) exit;
                    437: .sp 1
                    438: The remaining line of \fBcallout.next\fP simply reapplies the
                    439: script on the next element in the linked list.
                    440: .LP
                    441: A sample \fIcallout\fP dump is shown below.
                    442: .nf
                    443: .sp 1
                    444: .ne 14
                    445: % \fBadb \-k /vmunix /dev/mem\fP
                    446: sbr 8001f864 slr d9c
                    447: p0br 800efa00 p0lr 8e p1br 7f8efe00 p1lr 1ffff2
                    448: \fB$<callout\fP
                    449: _calltodo:
                    450: _calltodo:     time            arg                     func
                    451: 8004ecfc:      26              0                       _dzscan
                    452: 8004ed0c:      8               0                       _upwatch
                    453: 8004ed1c:      0               0                       _ip_timeo
                    454: 8004ed5c:      0               0                       _tcp_timeo
                    455: 8004ed6c:      0               0                       _rkwatch
                    456: 8004ecfc:      52              0                       _dzscan
                    457: 8004ed2c:      68              _Syssize+70     _tmtimer
                    458: 8004ed3c:      2920            0                       _memenable
                    459: .fi
                    460: .sp 1
                    461: .NH 2
                    462: Supplying Parameters
                    463: .PP
                    464: If one is clever, a command script may use the address
                    465: and count portions of an adb command as parameters.  An example of
                    466: this is the \fBsetproc\fP script used to switch to the
                    467: context of a process with a known process-id;
                    468: .sp 1
                    469: .ti +5
                    470: \fB99$<setproc\fP
                    471: .sp 1
                    472: The body of \fBsetproc\fP is
                    473: .sp 1
                    474: .in +5
                    475: .nf
                    476: \&.>4
                    477: *nproc>l
                    478: *proc>f
                    479: $<setproc.nxt
                    480: .in -5
                    481: .sp 1
                    482: .fi
                    483: while \fBsetproc.nxt\fP is
                    484: .sp 1
                    485: .nf
                    486: .in +5
                    487: (*(<f+28))&0xffff="pid "X
                    488: ,#((*(<f+28)&0xffff)-<4)$<setproc.done
                    489: <l-1>l
                    490: <f+70>f
                    491: ,#<l$<
                    492: $<setproc.nxt
                    493: .in -5
                    494: .sp 1
                    495: .fi
                    496: The process-id, supplied as the parameter, is stored in the
                    497: variable ``<4'', the number of processes is placed in ``<l'',
                    498: and the base of the array of process structures in ``<f''.
                    499: \fBsetproc.nxt\fP then performs a linear search through the
                    500: array until it matches the process-id requested, or until
                    501: it runs out of process structures to check.  The script
                    502: \fBsetproc.done\fP simply establishes the context of the
                    503: process, then exits.
                    504: .NH 2
                    505: Standard Scripts
                    506: .PP
                    507: The following table summarizes the command scripts currently
                    508: available in the directory \fI/usr/lib/adb\fP.
                    509: .TS
                    510: center, box;
                    511: c s s
                    512: l | l | l
                    513: lb | l | l.
                    514: Standard Command Scripts
                    515: _
                    516: Name   Use     Description
                    517: _
                    518: buf    \fIaddress\fP$<\fBbuf\fP        format block I/O buffer
                    519: callout        $<\fBcallout\fP print timer queue
                    520: clist  \fIaddress\fP$<\fBclist\fP      format character I/O linked list
                    521: dino   \fIaddress\fP$<\fBdino\fP       format directory inode
                    522: dir    \fIaddress\fP$<\fBdir\fP        format directory entry
                    523: file   \fIaddress\fP$<\fBfile\fP       format open file structure
                    524: filsys \fIaddress\fP$<\fBfilsys\fP     format in-core super block structure
                    525: findproc       \fIpid\fP$<\fBfindproc\fP       find process by process id
                    526: ifnet  \fIaddress\fP$<\fBifnet\fP      format network interface structure
                    527: ifuba  \fIaddress\fP$<\fBifuba\fP      format UNIBUS resource structure
                    528: inode  \fIaddress\fP$<\fBinode\fP      format in-core inode structure
                    529: inpcb  \fIaddress\fP$<\fBinpcb\fP      format internet protocol control block
                    530: mact   \fIaddress\fP$<\fBmact\fP       show ``active'' list of mbuf's
                    531: mbstat $<\fBmbstat\fP  show mbuf statistics
                    532: mbuf   \fIaddress\fP$<\fBmbuf\fP       show ``next'' list of mbuf's
                    533: mount  \fIaddress\fP$<\fBmount\fP      format mount structure
                    534: pcb    \fIaddress\fP$<\fBpcb\fP        format process context block
                    535: proc   \fIaddress\fP$<\fBproc\fP       format process table entry
                    536: setproc        \fIpid\fP$<\fBsetproc\fP        switch process context to \fIpid\fP
                    537: socket \fIaddress\fP$<\fBsocket\fP     format socket structure
                    538: tcpcb  \fIaddress\fP$<\fBtcpcb\fP      format TCP control block
                    539: text   \fIaddress\fP$<\fBtext\fP       format text structure
                    540: traceall       $<\fBtraceall\fP        show stack trace for all processes
                    541: tty    \fIaddress\fP$<\fBtty\fP        format tty structure
                    542: u      \fIaddress\fP$<\fBu\fP  format user vector, including pcb
                    543: vtimes \fIaddress\fP$<\fBvtimes\fP     format process times
                    544: .TE
                    545: .ds RH "Summary
                    546: .LP
                    547: .nr H1 2
                    548: .bp
                    549: .LG
                    550: .B
                    551: .ce
                    552: 3. SUMMARY
                    553: .sp 2
                    554: .R
                    555: .nr H2 0
                    556: .NL
                    557: .PP
                    558: The extensions made to adb provide basic support for
                    559: debugging the
                    560: .UX
                    561: kernel by eliminating the need for a user to carry
                    562: out virtual to physical address translation.  A collection
                    563: of scripts have been written to nicely format the major
                    564: kernel data structures and aid in switching between
                    565: process contexts.  This has been carried out with
                    566: only minimal changes to the debugger.
                    567: .PP
                    568: More work is needed to provide enough information
                    569: for the debugger to automatically establish context
                    570: after a system crash.  The system currently does not
                    571: always save enough state to allow the debugger to reliably
                    572: locate the stack frame just prior to an exception.
                    573: .PP
                    574: More work is also required on the user interface
                    575: to adb.  It appears the inscrutable adb command language
                    576: has limited widespread use of much of the power of
                    577: adb.  One possibility is to provide a more comprehensible
                    578: ``adb frontend'', just as \fIbc\fP(1) is used to
                    579: frontend \fIdc\fP(1).
                    580: .PP
                    581: Finally, adb could be significantly improved if it
                    582: were knowledgeable about a programs data structures.
                    583: This would eliminate the use of numeric offsets into
                    584: C structures.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.