Annotation of 43BSDReno/share/doc/ps1/10.adb/adb.ms, revision 1.1.1.1

1.1       root        1: .\"    @(#)adb.ms      6.1 (Berkeley) 5/7/86
                      2: .\"
                      3: .EH 'PS1:10-%''A Tutorial Introduction to ADB'
                      4: .OH 'A Tutorial Introduction to ADB''PS1:10-%'
                      5: .de P1
                      6: .sp .5
                      7: .if \\n(.$>0 .ta \\$1 \\$2 \\$3 \\$4 \\$5 \\$6
                      8: .if \\n(.$=0 .ta 1i 1.7i 2.5i
                      9: .ft 3
                     10: .nf
                     11: ..
                     12: .de P2
                     13: .sp .5
                     14: .ft 1
                     15: .fi
                     16: ..
                     17: .\".RP
                     18: .....TM "77-8234-11 77-1273-10" "49170-220 39199" "40952-1 39199-11"
                     19: .ND May 5, 1977
                     20: .TL
                     21: A Tutorial Introduction to ADB
                     22: .AU "MH2F-207" "3816"
                     23: J. F. Maranzano
                     24: .AU "MH2C-512" 7419
                     25: S. R. Bourne
                     26: .AI
                     27: .MH
                     28: .OK
                     29: .\"UNIX
                     30: .\"Debugging
                     31: .\"C Programming
                     32: .AB
                     33: .PP
                     34: Debugging tools generally provide a wealth of information
                     35: about the inner workings of programs.
                     36: These tools have been available on
                     37: .UX
                     38: to allow users to
                     39: examine ``core'' files 
                     40: that result from aborted programs.
                     41: A new debugging program, ADB, provides enhanced capabilities
                     42: to examine "core" and other program files in a
                     43: variety of formats, run programs with embedded breakpoints and patch files.
                     44: .PP
                     45: ADB is an indispensable but complex tool for debugging crashed systems and/or
                     46: programs.
                     47: This document provides an introduction to ADB with examples of its use.
                     48: It explains the various formatting options, 
                     49: techniques for debugging C programs, examples of printing
                     50: file system information and patching.
                     51: .AE
                     52: .CS 12 15 27 13 0 5
                     53: .NH
                     54: Introduction
                     55: .PP
                     56: ADB is a new debugging program that is
                     57: available on UNIX.
                     58: It provides capabilities to look at
                     59: ``core'' files resulting from aborted programs, print output in a
                     60: variety of formats, patch files, and run programs
                     61: with embedded breakpoints.
                     62: This document provides examples of
                     63: the more useful features of ADB.
                     64: The reader is expected to be
                     65: familiar with the basic commands on
                     66: .UX
                     67: with the C
                     68: language, and with References 1, 2 and 3.
                     69: .NH
                     70: A Quick Survey
                     71: .NH 2
                     72: Invocation
                     73: .PP
                     74: ADB is invoked as:
                     75: .P1
                     76:        adb objfile corefile
                     77: .P2
                     78: where
                     79: .ul
                     80: objfile
                     81: is an executable UNIX file and 
                     82: .ul
                     83: corefile 
                     84: is a core image file.
                     85: Many times this will look like:
                     86: .P1
                     87:        adb a.out core
                     88: .P2
                     89: or more simply:
                     90: .P1
                     91:        adb
                     92: .P2
                     93: where the defaults are 
                     94: .ul
                     95: a.out
                     96: and
                     97: .ul
                     98: core
                     99: respectively.
                    100: The filename minus (\-) means ignore this argument as in:
                    101: .P1
                    102:        adb \- core
                    103: .P2
                    104: .PP
                    105: ADB has requests for examining locations in either file.
                    106: The
                    107: \fB?\fP
                    108: request examines the contents of 
                    109: .ul
                    110: objfile,
                    111: the
                    112: \fB/\fP
                    113: request examines the 
                    114: .ul
                    115: corefile.
                    116: The general form of these requests is:
                    117: .P1
                    118:        address ? format
                    119: .P2
                    120: or
                    121: .P1
                    122:        address / format
                    123: .P2
                    124: .NH 2
                    125: Current Address
                    126: .PP
                    127: ADB maintains a current address, called dot,
                    128: similar in function to the current pointer in the UNIX editor.
                    129: When an address is entered, the current address is set to that location,
                    130: so that:
                    131: .P1
                    132:        0126?i
                    133: .P2
                    134: sets dot to octal 126 and prints the instruction
                    135: at that address.
                    136: The request:
                    137: .P1
                    138:        .,10/d
                    139: .P2
                    140: prints 10 decimal numbers starting at dot.
                    141: Dot ends up referring to the address of the last item printed.
                    142: When used with the \fB?\fP or \fB/\fP requests,
                    143: the current address can be advanced by typing newline; it can be decremented
                    144: by typing \fB^\fP.
                    145: .PP
                    146: Addresses are represented by
                    147: expressions.
                    148: Expressions are made up from decimal, octal, and hexadecimal integers,
                    149: and symbols from the program under test.
                    150: These may be combined with the operators +, \-, *, % (integer division), 
                    151: & (bitwise and), | (bitwise inclusive or),  # (round up
                    152: to the next multiple), and ~ (not).
                    153: (All arithmetic within ADB is 32 bits.)
                    154: When typing a symbolic address for a C program, 
                    155: the user can type 
                    156: .ul
                    157: name
                    158: or
                    159: .ul
                    160: _name;
                    161: ADB will recognize both forms.
                    162: .NH 2
                    163: Formats
                    164: .PP
                    165: To print data, a user specifies a collection of letters and characters
                    166: that describe the format of the printout.
                    167: Formats are "remembered" in the sense that typing a request without one
                    168: will cause the new printout to appear in the previous format.
                    169: The following are the most commonly used format letters.
                    170: .P1
                    171: \fB    b       \fPone byte in octal
                    172: \fB    c       \fPone byte as a character
                    173: \fB    o       \fPone word in octal
                    174: \fB    d       \fPone word in decimal
                    175: \fB    f       \fPtwo words in floating point
                    176: \fB    i       \fPPDP 11 instruction
                    177: \fB    s       \fPa null terminated character string
                    178: \fB    a       \fPthe value of dot
                    179: \fB    u       \fPone word as unsigned integer
                    180: \fB    n       \fPprint a newline
                    181: \fB    r       \fPprint a blank space
                    182: \fB    ^       \fPbackup dot
                    183: .P2
                    184: (Format letters are also available for "long" values,
                    185: for example, `\fBD\fR' for long decimal, and `\fBF\fP' for double floating point.)
                    186: For other formats see the ADB manual.
                    187: .NH 2
                    188: General Request Meanings
                    189: .PP
                    190: The general form of a request is:
                    191: .P1
                    192:        address,count command modifier
                    193: .P2
                    194: which sets `dot' to \fIaddress\fP
                    195: and executes the command
                    196: \fIcount\fR times.
                    197: .PP
                    198: The following table illustrates some general ADB command meanings:
                    199: .P1
                    200:        Command Meaning
                    201: \fB        ?   \fPPrint contents from \fIa.out\fP file
                    202: \fB        /   \fPPrint contents from \fIcore\fP file
                    203: \fB        =   \fPPrint value of "dot"
                    204: \fB        :   \fPBreakpoint control
                    205: \fB        $   \fPMiscellaneous requests
                    206: \fB        ;   \fPRequest separator
                    207: \fB        !   \fPEscape to shell
                    208: .P2
                    209: .PP
                    210: ADB catches signals, so a user cannot use a quit signal to exit from ADB.
                    211: The request $q or $Q (or cntl-D) must be used
                    212: to exit from ADB.
                    213: .NH
                    214: Debugging C Programs
                    215: .NH 2
                    216: Debugging A Core Image 
                    217: .PP
                    218: Consider the C program in Figure 1.
                    219: The program is used to illustrate a common error made by
                    220: C programmers.
                    221: The object of the program is to change the
                    222: lower case "t" to upper case in the string pointed to by
                    223: .ul
                    224: charp
                    225: and then write the character string to the file indicated by
                    226: argument 1.
                    227: The bug shown is that the character "T"
                    228: is stored in the pointer 
                    229: .ul
                    230: charp
                    231: instead of the string pointed to by
                    232: .ul
                    233: charp.
                    234: Executing the program produces a core file because of an out of bounds memory reference.
                    235: .PP
                    236: ADB is invoked by:
                    237: .P1
                    238:        adb a.out core
                    239: .P2
                    240: The first debugging request:
                    241: .P1
                    242:        $c
                    243: .P2
                    244: is used to give a C backtrace through the
                    245: subroutines called.
                    246: As shown in Figure 2
                    247: only one function (\fImain\fR) was called and the
                    248: arguments 
                    249: .ul
                    250: argc 
                    251: and 
                    252: .ul
                    253: argv 
                    254: have octal values 02 and
                    255: 0177762 respectively.
                    256: Both of these values look
                    257: reasonable; 02 = two arguments, 0177762 = address on stack
                    258: of parameter vector.
                    259: .br
                    260: The next request:
                    261: .P1
                    262:        $C
                    263: .P2
                    264: is used to give a C backtrace plus an interpretation
                    265: of all the local variables in each function and their
                    266: values in octal.
                    267: The value of the variable 
                    268: .ul
                    269: cc
                    270: looks incorrect
                    271: since
                    272: .ul
                    273: cc
                    274: was declared as a character.
                    275: .PP
                    276: The next request:
                    277: .P1
                    278:        $r
                    279: .P2
                    280: prints out the registers including the program
                    281: counter and an interpretation of the instruction at that
                    282: location.
                    283: .PP
                    284: The request:
                    285: .P1
                    286:        $e
                    287: .P2
                    288: prints out the values of all external variables.
                    289: .PP
                    290: A map exists for each file
                    291: handled by
                    292: ADB.
                    293: The map for the
                    294: .ul
                    295: a.out
                    296: file is referenced by \fB?\fP whereas the map for 
                    297: .ul
                    298: core
                    299: file is referenced by \fB/\fP.
                    300: Furthermore, a good rule of thumb is to use \fB?\fP for
                    301: instructions and \fB/\fP for data when looking at programs.
                    302: To print out information about the maps type:
                    303: .P1
                    304:        $m
                    305: .P2
                    306: This produces a report of the contents of the maps.
                    307: More about these maps later.
                    308: .PP
                    309: In our example, it is useful to see the
                    310: contents of the string pointed to by
                    311: .ul
                    312: charp.
                    313: This is done by:
                    314: .P1
                    315:        *charp/s
                    316: .P2
                    317: which says use 
                    318: .ul
                    319: charp
                    320: as a pointer in the
                    321: .ul
                    322: core
                    323: file
                    324: and print the information as a character string.
                    325: This printout clearly shows that the character buffer
                    326: was incorrectly overwritten and helps identify the error.
                    327: Printing the locations around 
                    328: .ul
                    329: charp
                    330: shows that the buffer is unchanged
                    331: but that the pointer is destroyed.
                    332: Using ADB similarly, we could print information about the
                    333: arguments to a function.
                    334: The request:
                    335: .P1
                    336:        main.argc/d
                    337: .P2
                    338: prints the decimal 
                    339: .ul
                    340: core
                    341: image value of the argument 
                    342: .ul
                    343: argc
                    344: in the function 
                    345: .ul
                    346: main.
                    347: .br
                    348: The request:
                    349: .P1
                    350:        *main.argv,3/o
                    351: .P2
                    352: prints the octal values of the three consecutive
                    353: cells pointed to by 
                    354: .ul
                    355: argv
                    356: in the function 
                    357: .ul
                    358: main.
                    359: Note that these values are the addresses of the arguments
                    360: to main.
                    361: Therefore: 
                    362: .P1
                    363:        0177770/s
                    364: .P2
                    365: prints the ASCII value of the first argument.
                    366: Another way to print this value would have been
                    367: .P1
                    368:        *"/s
                    369: .P2
                    370: The " means ditto which remembers the last address
                    371: typed, in this case \fImain.argc\fP ; the \fB*\fP instructs ADB to use the address field of the
                    372: .ul
                    373: core 
                    374: file as a pointer.
                    375: .PP
                    376: The request:
                    377: .P1
                    378:        .=o
                    379: .P2
                    380: prints the current address (not its contents) in octal which has been set to the address of the first argument.
                    381: The current address, dot, is used by ADB to
                    382: "remember" its current location.
                    383: It allows the user 
                    384: to reference locations relative to the current
                    385: address, for example:
                    386: .P1
                    387:        .\-10/d
                    388: .P2
                    389: .NH 2
                    390: Multiple Functions
                    391: .PP
                    392: Consider the C program illustrated in
                    393: Figure 3.
                    394: This program calls functions 
                    395: .ul
                    396: f, g,
                    397: and
                    398: .ul
                    399: h 
                    400: until the stack is exhausted and a core image is produced.
                    401: .PP
                    402: Again you can enter the debugger via:
                    403: .P1
                    404:        adb
                    405: .P2
                    406: which assumes the names 
                    407: .ul
                    408: a.out
                    409: and 
                    410: .ul
                    411: core
                    412: for the executable
                    413: file and core image file respectively.
                    414: The request:
                    415: .P1
                    416:        $c
                    417: .P2
                    418: will fill a page of backtrace references to 
                    419: .ul
                    420: f, g,
                    421: and
                    422: .ul
                    423: h.
                    424: Figure 4 shows an abbreviated list (typing 
                    425: .ul
                    426: DEL
                    427: will terminate the output and bring you back to ADB request level).
                    428: .PP
                    429: The request:
                    430: .P1
                    431:        ,5$C
                    432: .P2
                    433: prints the five most recent activations.
                    434: .PP
                    435: Notice that each function 
                    436: (\fIf,g,h\fP) has a counter
                    437: of the number of times it was called.
                    438: .PP
                    439: The request:
                    440: .P1
                    441:        fcnt/d
                    442: .P2
                    443: prints the decimal value of the counter for the function
                    444: .ul
                    445: f.
                    446: Similarly 
                    447: .ul
                    448: gcnt
                    449: and
                    450: .ul
                    451: hcnt
                    452: could be printed.
                    453: To print the value of an automatic variable,
                    454: for example the decimal value of
                    455: .ul 
                    456: x
                    457: in the last call of the function
                    458: .ul
                    459: h,
                    460: type:
                    461: .P1
                    462:        h.x/d
                    463: .P2
                    464: It is currently not possible in the exported version to print stack frames other than the most recent activation of a function.
                    465: Therefore, a user can print everything with 
                    466: \fB$C\fR or the occurrence of a variable in the most recent call of a function.
                    467: It is possible with the \fB$C\fR request, however, to print the stack frame
                    468: starting at some address as \fBaddress$C.\fR
                    469: .NH 2
                    470: Setting Breakpoints
                    471: .PP
                    472: Consider the C program in Figure 5.
                    473: This program, which changes tabs into blanks, is adapted from
                    474: .ul
                    475: Software Tools
                    476: by Kernighan and Plauger, pp. 18-27.
                    477: .PP
                    478: We will run this program under the control of ADB (see Figure 6a) by:
                    479: .P1
                    480:        adb a.out \-
                    481: .P2
                    482: Breakpoints are set in the program as:
                    483: .ul
                    484: .P1
                    485:        address:b  [request]
                    486: .P2
                    487: The requests:
                    488: .P1
                    489:        settab+4:b
                    490:        fopen+4:b
                    491:        getc+4:b
                    492:        tabpos+4:b
                    493: .P2
                    494: set breakpoints at the start of these functions.
                    495: C does not generate statement labels.
                    496: Therefore it is currently not possible to plant breakpoints at locations
                    497: other than function entry points without a knowledge of the code
                    498: generated by the C compiler.
                    499: The above addresses are entered as
                    500: .ft B
                    501: symbol+4
                    502: .ft R
                    503: so that they will appear in any
                    504: C backtrace since the first instruction of each function is a call
                    505: to the C save routine 
                    506: (\fIcsv\fR).
                    507: Note that some of the functions are from the C library.
                    508: .PP
                    509: To print the location of breakpoints one types:
                    510: .P1
                    511:        $b
                    512: .P2
                    513: The display indicates a
                    514: .ul
                    515: count
                    516: field.
                    517: A breakpoint is bypassed
                    518: .ul
                    519: count \-1
                    520: times before causing a stop.
                    521: The
                    522: .ul
                    523: command
                    524: field indicates the ADB requests to be executed each time the breakpoint is encountered.
                    525: In our example no
                    526: .ul
                    527: command
                    528: fields are present.
                    529: .PP
                    530: By displaying the original instructions at the function
                    531: .ul
                    532: settab
                    533: we see that 
                    534: the breakpoint is set after the jsr to the C save routine.
                    535: We can display the instructions using the ADB request:
                    536: .P1
                    537:        settab,5?ia
                    538: .P2
                    539: This request displays five instructions starting at
                    540: .ul
                    541: settab
                    542: with the addresses of each location displayed.
                    543: Another variation is:
                    544: .P1
                    545:        settab,5?i
                    546: .P2
                    547: which displays the instructions with only the starting address.
                    548: .PP
                    549: Notice that we accessed the addresses from the 
                    550: .ul
                    551: a.out 
                    552: file with the \fB?\fP command.
                    553: In general when asking for a printout of multiple items,
                    554: ADB will advance the current address the number of
                    555: bytes necessary to satisfy the request; in the above
                    556: example five instructions were displayed and the current address was
                    557: advanced 18 (decimal) bytes.
                    558: .PP
                    559: To run the program one simply types:
                    560: .P1
                    561:        :r
                    562: .P2
                    563: To delete a breakpoint, for instance the entry to the function
                    564: .ul
                    565: settab,
                    566: one types:
                    567: .P1
                    568:        settab+4:d
                    569: .P2
                    570: To continue execution of the program from the breakpoint type:
                    571: .P1
                    572:        :c
                    573: .PP
                    574: Once the program has stopped (in this case at the breakpoint for
                    575: .ul
                    576: fopen),
                    577: ADB requests can be used to display the contents of memory.
                    578: For example:
                    579: .P1
                    580:        $C
                    581: .P2
                    582: to display a stack trace, or:
                    583: .P1
                    584:        tabs,3/8o
                    585: .P2
                    586: to print three lines of 8 locations each from the array called
                    587: .ul
                    588: tabs.
                    589: By this time (at location
                    590: .ul
                    591: fopen)
                    592: in the C program,
                    593: .ul
                    594: settab
                    595: has been called and should have set a one in every eighth location of 
                    596: .ul
                    597: tabs.
                    598: .NH 2
                    599: Advanced Breakpoint Usage
                    600: .PP
                    601: We continue execution of the program with:
                    602: .P1
                    603:        :c
                    604: .P2
                    605: See Figure 6b.
                    606: .ul
                    607: Getc
                    608: is called three times and  the contents of the variable 
                    609: .ul
                    610: c
                    611: in the function
                    612: .ul
                    613: main
                    614: are displayed
                    615: each time.
                    616: The single character on the left hand edge is the output from the C program.
                    617: On the third occurrence of 
                    618: .ul
                    619: getc
                    620: the program stops.
                    621: We can look at the full buffer of characters by typing:
                    622: .P1
                    623:        ibuf+6/20c
                    624: .P2
                    625: When we continue the program with:
                    626: .P1
                    627:        :c
                    628: .P2
                    629: we hit our first breakpoint at
                    630: .ul
                    631: tabpos
                    632: since there is a tab following the
                    633: "This" word of the data.
                    634: .PP
                    635: Several breakpoints of
                    636: .ul
                    637: tabpos
                    638: will occur until the program has changed the tab into equivalent blanks.
                    639: Since we feel that
                    640: .ul
                    641: tabpos
                    642: is working,
                    643: we can remove the breakpoint at that location by:
                    644: .P1
                    645:        tabpos+4:d
                    646: .P2
                    647: If the program is continued with:
                    648: .P1
                    649:        :c
                    650: .P2
                    651: it resumes normal execution after ADB prints
                    652: the message
                    653: .P1
                    654:        a.out:running
                    655: .P2
                    656: .PP
                    657: The UNIX quit and interrupt signals
                    658: act on ADB itself rather than on the program being debugged.
                    659: If such a signal occurs then the program being debugged is stopped and control is returned to ADB.
                    660: The signal is saved by ADB and is passed on to the test program if:
                    661: .P1
                    662:        :c
                    663: .P2
                    664: is typed.
                    665: This can be useful when testing interrupt
                    666: handling routines.
                    667: The signal is not passed on to the test program if:
                    668: .P1
                    669:        :c  0
                    670: .P2
                    671: is typed.
                    672: .PP
                    673: Now let us reset the breakpoint at
                    674: .ul
                    675: settab
                    676: and display the instructions located there when we reach the breakpoint.
                    677: This is accomplished by:
                    678: .P1
                    679:        settab+4:b  settab,5?ia  \fR*
                    680: .P2
                    681: .FS
                    682: * Owing to a bug in early versions of ADB (including the
                    683: version distributed in Generic 3 UNIX) these statements
                    684: must be written as:
                    685: .br
                    686: .in 1i
                    687: \fBsettab+4:b  settab,5?ia;0\fR
                    688: .ft B
                    689: .br
                    690: getc+4,3:b     main.c?C;0
                    691: .br
                    692: settab+4:b     settab,5?ia; ptab/o;0
                    693: .br
                    694: .ft R
                    695: .in -1i
                    696: Note that \fB;0\fR will set dot to zero and stop at the breakpoint.
                    697: .FE
                    698: It is also possible to execute the ADB requests for each occurrence of the breakpoint but
                    699: only stop after the third occurrence by typing:
                    700: .P1
                    701:        getc+4,3:b  main.c?C  \fR*
                    702: .P2
                    703: This request will print the local variable 
                    704: .ul
                    705: c
                    706: in the function 
                    707: .ul
                    708: main
                    709: at each occurrence of the breakpoint.
                    710: The semicolon is used to separate multiple ADB requests on a single line.
                    711: .PP
                    712: Warning:
                    713: setting a breakpoint causes the value of dot to be changed;
                    714: executing the program under ADB does not change dot.
                    715: Therefore:
                    716: .P1
                    717:        settab+4:b  .,5?ia
                    718:        fopen+4:b
                    719: .P2
                    720: will print the last thing dot was set to
                    721: (in the example \fIfopen+4\fP)
                    722: .ul
                    723: not
                    724: the current location (\fIsettab+4\fP)
                    725: at which the program is executing.
                    726: .PP
                    727: A breakpoint can be overwritten without first deleting the old breakpoint.
                    728: For example:
                    729: .P1
                    730:        settab+4:b  settab,5?ia; ptab/o  \fR*
                    731: .P2
                    732: could be entered after typing the above requests.
                    733: .PP
                    734: Now the display of breakpoints:
                    735: .P1
                    736:        $b
                    737: .P2
                    738: shows the above request for the
                    739: .ul
                    740: settab
                    741: breakpoint.
                    742: When the breakpoint at
                    743: .ul
                    744: settab
                    745: is encountered the ADB requests are executed.
                    746: Note that the location at
                    747: .ul
                    748: settab+4
                    749: has been changed to plant the breakpoint;
                    750: all the other locations match their original value.
                    751: .PP
                    752: Using the functions,
                    753: .ul
                    754: f, g
                    755: and 
                    756: .ul
                    757: h
                    758: shown in Figure 3,
                    759: we can follow the execution of each function by planting non-stopping
                    760: breakpoints.
                    761: We call ADB with the executable program of Figure 3 as follows:
                    762: .P1
                    763:        adb ex3 \-
                    764: .P2
                    765: Suppose we enter the following breakpoints:
                    766: .P1
                    767:        h+4:b   hcnt/d;  h.hi/;  h.hr/
                    768:        g+4:b   gcnt/d;  g.gi/;  g.gr/
                    769:        f+4:b   fcnt/d;  f.fi/;  f.fr/
                    770:        :r
                    771: .P2
                    772: Each request line indicates that the variables are printed in decimal
                    773: (by the specification \fBd\fR).
                    774: Since the format is not changed, the \fBd\fR can be left off all but
                    775: the first request.
                    776: .PP
                    777: The output in Figure 7 illustrates two points.
                    778: First, the ADB requests in the breakpoint line are not
                    779: examined until the program under
                    780: test is run.
                    781: That means any errors in those ADB requests is not detected until run time.
                    782: At the location of the error ADB stops running the program.
                    783: .PP
                    784: The second point is the way ADB handles register variables.
                    785: ADB uses the symbol table to address variables.
                    786: Register variables, like \fIf.fr\fR above, have pointers to uninitialized
                    787: places on the stack.
                    788: Therefore the message "symbol not found".
                    789: .PP
                    790: Another way of getting at the data in this example is to print
                    791: the variables used in the call as:
                    792: .P1
                    793:        f+4:b   fcnt/d;  f.a/;  f.b/;  f.fi/
                    794:        g+4:b   gcnt/d;  g.p/;  g.q/;  g.gi/
                    795:        :c
                    796: .P2
                    797: The operator / was used instead of ?
                    798: to read values from the \fIcore\fP file.
                    799: The output for each function, as shown in Figure 7, has the same format.
                    800: For the function \fIf\fP, for example, it shows the name and value of the
                    801: .ul
                    802: external
                    803: variable
                    804: .ul
                    805: fcnt.
                    806: It also shows the address on the stack and value of the
                    807: variables
                    808: .ul
                    809: a, b
                    810: and
                    811: .ul
                    812: fi.
                    813: .PP
                    814: Notice that the addresses on the stack will continue to decrease
                    815: until no address space is left for program execution
                    816: at which time (after many pages of output)
                    817: the program under test aborts.
                    818: A display with names would be produced by requests like the following:
                    819: .P1
                    820:        f+4:b   fcnt/d;  f.a/"a="d;  f.b/"b="d;  f.fi/"fi="d
                    821: .P2
                    822: In this format the quoted string is printed literally and the \fBd\fP
                    823: produces a decimal display of the variables.
                    824: The results are shown in Figure 7.
                    825: .NH 2
                    826: Other Breakpoint Facilities
                    827: .LP
                    828: .IP \(bu 4
                    829: Arguments and change of standard input and output are passed to a program as:
                    830: .P1
                    831:        :r  arg1  arg2 ... <infile  >outfile
                    832: .P2
                    833: This request
                    834: kills any existing program under test and
                    835: starts the
                    836: .ul
                    837: a.out
                    838: afresh.
                    839: .IP \(bu
                    840: The program being debugged can be single stepped
                    841: by:
                    842: .P1
                    843:        :s
                    844: .P2
                    845: If necessary, this request will start up the program being
                    846: debugged and stop after executing
                    847: the first instruction.
                    848: .IP \(bu
                    849: ADB allows a program to be entered at a specific address
                    850: by typing:
                    851: .P1
                    852:        address:r
                    853: .P2
                    854: .IP \(bu
                    855: The count field can be used to skip the first \fIn\fR breakpoints as:
                    856: .P1
                    857:        ,n:r
                    858: .P2
                    859: The request:
                    860: .P1
                    861:        ,n:c
                    862: .P2
                    863: may also be used for skipping the first \fIn\fR breakpoints
                    864: when continuing a program.
                    865: .sp
                    866: .IP \(bu
                    867: A program can be continued at an address different from the breakpoint by:
                    868: .P1
                    869:        address:c
                    870: .P2
                    871: .IP \(bu
                    872: The program being debugged runs as a separate process and can be killed by:
                    873: .P1
                    874:        :k
                    875: .P2
                    876: .LP
                    877: .NH
                    878: Maps
                    879: .PP
                    880: UNIX supports several executable file formats.  These are used to tell
                    881: the loader how to load  the program file.  File type 407
                    882: is the most common and is generated by a C compiler invocation such as
                    883: \fBcc pgm.c\fP.
                    884: A 410 file is produced by a C compiler command of the form \fBcc -n pgm.c\fP,
                    885: whereas a 411 file is produced by \fBcc -i pgm.c\fP.
                    886: ADB interprets these different file formats and
                    887: provides access to the different segments through a set of maps (see Figure 8).
                    888: To print the maps type:
                    889: .P1
                    890:        $m
                    891: .P2
                    892: .PP
                    893: In 407 files, both text (instructions) and data are intermixed.
                    894: This makes it impossible for ADB to differentiate data from
                    895: instructions and some of the printed symbolic addresses look incorrect;
                    896: for example, printing data addresses as offsets from routines.
                    897: .PP
                    898: In 410 files (shared text), the instructions are separated from data and
                    899: \fB?*\fR accesses the data part of the \fIa.out\fP file.
                    900: The \fB?* \fP request tells ADB to use the second part of the
                    901: map in the
                    902: .ul
                    903: a.out
                    904: file.
                    905: Accessing data in the \fIcore\fP file shows
                    906: the data after it was modified by the execution of the program.
                    907: Notice also that the data segment may have grown during
                    908: program execution.
                    909: .PP
                    910: In 411 files (separated I & D space), the
                    911: instructions and data are also separated.
                    912: However, in this
                    913: case, since data is mapped through a separate set of segmentation
                    914: registers, the base of the data segment is also relative to address zero.
                    915: In this case since the addresses overlap it is necessary to use
                    916: the \fB?*\fR operator to access the data space of the \fIa.out\fP file.
                    917: In both 410 and 411 files the corresponding
                    918: core file does not contain the program text.
                    919: .PP
                    920: Figure 9 shows the display of three maps
                    921: for the same program linked as a 407, 410, 411 respectively.
                    922: The b, e, and f fields are used by ADB to map
                    923: addresses into file addresses.
                    924: The "f1" field is the
                    925: length of the header at the beginning of the file (020 bytes
                    926: for an \fIa.out\fP file and 02000 bytes for a \fIcore\fP file).
                    927: The "f2" field is the displacement from the beginning of the file to the data.
                    928: For a 407 file with mixed text and data this is the
                    929: same as the length of the header; for 410 and 411 files this
                    930: is the length of the header plus the size of the text portion.
                    931: .PP
                    932: The "b" and "e" fields are the starting and ending locations
                    933: for a segment.
                    934: Given an address, A, the location in
                    935: the file (either \fIa.out\fP or \fIcore\fP) is calculated as:
                    936: .P1
                    937:        b1\(<=A\(<=e1 =\h'-.5m'> file address = (A\-b1)+f1
                    938:        b2\(<=A\(<=e2 =\h'-.5m'> file address = (A\-b2)+f2
                    939: .P2
                    940: A user can access locations by using the ADB defined variables.
                    941: The \fB$v\fR request prints the variables initialized by ADB:
                    942: .P1
                    943:        b       base address of data segment
                    944:        d       length of the data segment
                    945:        s       length of the stack
                    946:        t       length of the text
                    947:        m       execution type (407,410,411)
                    948: .P2
                    949: .PP
                    950: In Figure 9 those variables not present are zero.
                    951: Use can be made of these variables by expressions such as:
                    952: .P1
                    953:        <b
                    954: .P2
                    955: in the address field.
                    956: Similarly the value of the variable can be changed by an assignment request
                    957: such as:
                    958: .P1
                    959:        02000>b
                    960: .P2
                    961: that sets \fBb\fP to octal 2000.
                    962: These variables are useful to know if the file under examination
                    963: is an executable or \fIcore\fP image file.
                    964: .PP
                    965: ADB reads the header of the \fIcore\fP image file to find the
                    966: values for these variables.
                    967: If the second file specified does not
                    968: seem to be a \fIcore\fP file, or if it is missing then the header of
                    969: the executable file is used instead.
                    970: .NH
                    971: Advanced Usage
                    972: .PP
                    973: It is possible with ADB to combine formatting requests
                    974: to provide elaborate displays.
                    975: Below are several examples.
                    976: .NH 2
                    977: Formatted dump
                    978: .PP
                    979: The line:
                    980: .P1
                    981:        <b,\-1/4o4^8Cn
                    982: .P2
                    983: prints 4 octal words followed by their ASCII interpretation
                    984: from the data space of the core image file.
                    985: Broken down, the various request pieces mean:
                    986: .sp
                    987: .in 1.7i
                    988: .ta .7i
                    989: .ti -.7i
                    990: <b     The base address of the data segment.
                    991: .sp
                    992: .ti -.7i
                    993: <b,\-1 Print from the base address to the end of file.
                    994: A negative count is used here and elsewhere to loop indefinitely
                    995: or until some error condition (like end of file) is detected.
                    996: .sp
                    997: .ti -1.7i
                    998: The format \fB4o4^8Cn\fR is broken down as follows:
                    999: .sp
                   1000: .ti -.7i
                   1001: 4o     Print 4 octal locations.
                   1002: .sp
                   1003: .ti -.7i
                   1004: 4^     Backup the current address 4 locations (to the original start of the field).
                   1005: .sp
                   1006: .ti -.7i
                   1007: 8C     Print 8 consecutive characters using an escape convention;
                   1008: each character in the range 0 to 037 is printed as @ followed by the corresponding character in the range 0140 to 0177.
                   1009: An @ is printed as @@.
                   1010: .sp
                   1011: .ti -.7i
                   1012: n      Print a newline.
                   1013: .in -1.7i
                   1014: .fi
                   1015: .sp
                   1016: .PP
                   1017: The request:
                   1018: .P1
                   1019:        <b,<d/4o4^8Cn
                   1020: .P2
                   1021: could have been used instead to allow the printing to stop
                   1022: at the end of the data segment (<d provides the data segment size in bytes).
                   1023: .PP
                   1024: The formatting requests can be combined with ADB's ability
                   1025: to read in a script to produce a core image dump script.
                   1026: ADB is invoked as:
                   1027: .P1
                   1028:        adb a.out core < dump
                   1029: .P2
                   1030: to read in a script file,
                   1031: .ul
                   1032: dump,
                   1033: of requests.
                   1034: An example of such a script is:
                   1035: .P1
                   1036:        120$w
                   1037:        4095$s
                   1038:        $v
                   1039:        =3n
                   1040:        $m
                   1041:        =3n"C Stack Backtrace"
                   1042:        $C
                   1043:        =3n"C External Variables"
                   1044:        $e
                   1045:        =3n"Registers"
                   1046:        $r
                   1047:        0$s
                   1048:        =3n"Data Segment"
                   1049:        <b,\-1/8ona
                   1050: .P2
                   1051: .PP
                   1052: The request \fB120$w\fP sets the width of the output to
                   1053: 120 characters
                   1054: (normally, the width is 80 characters).
                   1055: ADB attempts to print addresses as:
                   1056: .P1
                   1057:        symbol + offset
                   1058: .P2
                   1059: The request \fB4095$s\fP increases the maximum permissible offset
                   1060: to the nearest symbolic address from 255 (default) to 4095.
                   1061: The request \fB=\fP can be used to print literal strings.
                   1062: Thus,
                   1063: headings are provided in this
                   1064: .ul
                   1065: dump
                   1066: program
                   1067: with requests of the form:
                   1068: .P1
                   1069:        =3n"C Stack Backtrace"
                   1070: .P2
                   1071: that spaces three lines and prints the literal
                   1072: string.
                   1073: The request \fB$v\fP prints all non-zero ADB variables (see Figure 8).
                   1074: The request
                   1075: \fB0$s\fP
                   1076: sets the maximum offset for symbol matches to zero thus
                   1077: suppressing the printing of symbolic labels in favor
                   1078: of octal values.
                   1079: Note that this is only done for the printing of the data segment.
                   1080: The request:
                   1081: .P1
                   1082:        <b,\-1/8ona
                   1083: .P2
                   1084: prints a dump from the base of the data segment to the end of file
                   1085: with an octal address field and eight octal numbers per line.
                   1086: .PP
                   1087: Figure 11 shows the results of some formatting requests
                   1088: on the C program of Figure 10.
                   1089: .NH 2
                   1090: Directory Dump
                   1091: .PP
                   1092: As another illustration (Figure 12) consider a set of requests to dump
                   1093: the contents of a directory (which is made up
                   1094: of an integer \fIinumber\fP followed by a 14 character name):
                   1095: .P1
                   1096:        adb dir \-
                   1097:        =n8t"Inum"8t"Name"
                   1098:        0,\-1? u8t14cn
                   1099: .P2
                   1100: In this example, the \fBu\fP prints the \fIinumber\fP as an unsigned decimal integer,
                   1101: the \fB8t\fP means that ADB will space to the next
                   1102: multiple of 8 on the output line, and the \fB14c\fP prints the 14 character file name.
                   1103: .NH 2
                   1104: Ilist Dump
                   1105: .PP
                   1106: Similarly the contents of the \fIilist\fP of a file system, (e.g. /dev/src,
                   1107: on UNIX systems distributed by the UNIX Support Group;
                   1108: see UNIX Programmer's
                   1109: Manual Section V) could be dumped with the following set of 
                   1110: requests:
                   1111: .P1
                   1112:        adb /dev/src \-
                   1113:        02000>b
                   1114:        ?m <b
                   1115:        <b,\-1?"flags"8ton"links,uid,gid"8t3bn",size"8tbrdn"addr"8t8un"times"8t2Y2na
                   1116: .P2
                   1117: In this example the value of the base for the map was changed 
                   1118: to 02000 (by saying \fB?m<b\fR) since that is the start of an \fIilist\fP within a file system.
                   1119: An artifice (\fBbrd\fP above) was used to print the 24 bit size field
                   1120: as a byte, a space, and a decimal integer.
                   1121: The last access time and last modify time are printed with the
                   1122: \fB2Y\fR
                   1123: operator.
                   1124: Figure 12 shows portions of these requests as applied to a directory
                   1125: and file system.
                   1126: .NH 2
                   1127: Converting values
                   1128: .PP
                   1129: ADB may be used to convert values from one representation to
                   1130: another.
                   1131: For example:
                   1132: .P1
                   1133:        072 = odx
                   1134: .P2
                   1135: will print
                   1136: .P1
                   1137:        072     58      #3a
                   1138: .P2
                   1139: which is the octal, decimal and hexadecimal representations
                   1140: of 072 (octal).
                   1141: The format is remembered so that typing
                   1142: subsequent numbers will print them in the given formats.
                   1143: Character values may be converted similarly, for example:
                   1144: .P1
                   1145:        'a' = co
                   1146: .P2
                   1147: prints
                   1148: .P1
                   1149:        a       0141
                   1150: .P2
                   1151: It may also be used to evaluate expressions but be
                   1152: warned that all binary operators have
                   1153: the same precedence which is lower than that for unary operators.
                   1154: .NH
                   1155: Patching
                   1156: .PP
                   1157: Patching files with ADB is accomplished with the 
                   1158: .ul
                   1159: write,
                   1160: \fBw\fP or \fBW\fP, request (which is not like the \fIed\fP editor write command).
                   1161: This is often used in conjunction with the 
                   1162: .ul
                   1163: locate,
                   1164: \fBl\fP or \fBL\fP
                   1165: request.
                   1166: In general, the request syntax for \fBl\fP and \fBw\fP are similar as follows:
                   1167: .P1
                   1168:        ?l value
                   1169: .P2
                   1170: The request \fBl\fP is used to match on two bytes, \fBL\fP is used for
                   1171: four bytes.
                   1172: The request \fBw\fP is used to write two bytes, whereas
                   1173: \fBW\fP writes four bytes.
                   1174: The \fBvalue\fP field in either 
                   1175: .ul
                   1176: locate
                   1177: or
                   1178: .ul
                   1179: write
                   1180: requests
                   1181: is an expression.
                   1182: Therefore, decimal and octal numbers, or character strings are supported.
                   1183: .PP
                   1184: In order to modify a file, ADB must be called as:
                   1185: .P1
                   1186:        adb \-w file1 file2
                   1187: .P2
                   1188: When called with this option, 
                   1189: .ul
                   1190: file1
                   1191: and 
                   1192: .ul
                   1193: file2
                   1194: are created if necessary and opened for both reading and writing.
                   1195: .PP
                   1196: For example, consider the C program shown in Figure 10.
                   1197: We can change the word "This" to "The " in the executable file
                   1198: for this program, \fIex7\fP, by using the following requests:
                   1199: .P1
                   1200:        adb \-w ex7 \-
                   1201:        ?l 'Th'
                   1202:        ?W 'The '
                   1203: .P2
                   1204: The request \fB?l\fP starts at dot and stops at the first match of "Th"
                   1205: having set dot to the address of the location found.
                   1206: Note the use of \fB?\fP to write to the 
                   1207: .ul
                   1208: a.out
                   1209: file.
                   1210: The form \fB?*\fP would have been used for a 411 file.
                   1211: .PP
                   1212: More frequently the 
                   1213: request will be typed as:
                   1214: .P1
                   1215:        ?l 'Th'; ?s
                   1216: .P2
                   1217: and locates the first occurrence of "Th" and print the entire string.
                   1218: Execution of this ADB request will set dot to the address of the 
                   1219: "Th" characters.
                   1220: .PP
                   1221: As another example of the utility of the patching facility,
                   1222: consider a C program that has an internal logic flag.
                   1223: The flag could be set by the user through ADB and the program run.
                   1224: For example:
                   1225: .P1
                   1226:        adb a.out \-
                   1227:        :s arg1 arg2
                   1228:        flag/w 1
                   1229:        :c
                   1230: .P2
                   1231: The \fB:s\fR request is normally used to single step through a process
                   1232: or start a process in single step mode.
                   1233: In this case it starts
                   1234: .ul
                   1235: a.out
                   1236: as a subprocess
                   1237: with arguments \fBarg1\fP and \fBarg2\fP.
                   1238: If there is a subprocess running ADB writes to it rather than to the file
                   1239: so the \fBw\fP request causes \fIflag\fP to be changed in the memory of the subprocess.
                   1240: .NH
                   1241: Anomalies
                   1242: .PP
                   1243: Below is a list of some strange things that users
                   1244: should be aware of.
                   1245: .IP 1.
                   1246: Function calls and arguments are put on the stack by the C
                   1247: save routine.
                   1248: Putting breakpoints at the entry point to routines
                   1249: means that the function appears not to have been called
                   1250: when the
                   1251: breakpoint occurs.
                   1252: .IP 2.
                   1253: When printing addresses, ADB uses
                   1254: either text or data symbols from the \fIa.out\fP file.
                   1255: This sometimes causes unexpected symbol names to be printed 
                   1256: with data (e.g. \fIsavr5+022\fP).
                   1257: This does not happen if
                   1258: \fB?\fR is used for text (instructions)
                   1259: and \fB/\fP for data.
                   1260: .IP 3.
                   1261: ADB cannot handle C register variables
                   1262: in the most recently activated function.
                   1263: .LP
                   1264: .NH
                   1265: Acknowledgements
                   1266: .PP
                   1267: The authors are grateful for the thoughtful comments
                   1268: on how to organize this document
                   1269: from R. B. Brandt, E. N. Pinson and B. A. Tague.
                   1270: D. M. Ritchie made the system changes necessary to accommodate
                   1271: tracing within ADB. He also participated in discussions 
                   1272: during the writing of ADB.
                   1273: His earlier work with DB and CDB led to many of the 
                   1274: features found in ADB.
                   1275: .SG MH-8234-JFM/1273-SRB-unix
                   1276: .NH
                   1277: References
                   1278: .LP
                   1279: .IP 1.
                   1280: D. M. Ritchie and K. Thompson,
                   1281: ``The UNIX Time-Sharing System,''
                   1282: CACM, July, 1974.
                   1283: .IP 2.
                   1284: B. W. Kernighan and D. M. Ritchie,
                   1285: .ul
                   1286: The C Programming Language,
                   1287: Prentice-Hall, 1978.
                   1288: .IP 3.
                   1289: K. Thompson and D. M. Ritchie,
                   1290: UNIX Programmer's Manual - 7th Edition,
                   1291: 1978.
                   1292: .IP 4.
                   1293: B. W. Kernighan and P. J. Plauger,
                   1294: .ul
                   1295: Software Tools,
                   1296: Addison-Wesley, 1976.
                   1297: .sp 100
                   1298: .nr PS 9
                   1299: .nr VS 11
                   1300: .      \" START OF Figures
                   1301: .de P1
                   1302: .nf
                   1303: .in +.5i
                   1304: .ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i
                   1305: .sp
                   1306: .ps 9
                   1307: .vs 11p
                   1308: ..
                   1309: .de P2
                   1310: .sp
                   1311: .fi
                   1312: .ps \\n(PS
                   1313: .vs \\n(VS
                   1314: .in -.5i
                   1315: ..
                   1316: .SH
                   1317: Figure 1:  C program with pointer bug
                   1318: .LP
                   1319: .P1
                   1320: struct buf {
                   1321:        int fildes;
                   1322:        int nleft;
                   1323:        char *nextp;
                   1324:        char buff[512];
                   1325:        }bb;
                   1326: struct buf *obuf;
                   1327: 
                   1328: char *charp "this is a sentence.";
                   1329: 
                   1330: main(argc,argv)
                   1331: int argc;
                   1332: char **argv;
                   1333: {
                   1334:        char    cc;
                   1335: 
                   1336:        if(argc < 2) {
                   1337:                printf("Input file missing\\n");
                   1338:                exit(8);
                   1339:        }
                   1340: 
                   1341:        if((fcreat(argv[1],obuf)) < 0){
                   1342:                printf("%s : not found\\n", argv[1]);
                   1343:                exit(8);
                   1344:        }
                   1345:        charp = \'T\';
                   1346: printf("debug 1 %s\\n",charp);
                   1347:        while(cc=  *charp++)
                   1348:                putc(cc,obuf);
                   1349:        fflush(obuf);
                   1350: }
                   1351: .P2
                   1352: .sp 100
                   1353: .SH
                   1354: Figure 2:  ADB output for C program of Figure 1
                   1355: .LP
                   1356: .P1
                   1357: .ft B
                   1358: adb a.out core
                   1359: $c
                   1360: .ft R
                   1361: ~main(02,0177762)
                   1362: .ft B
                   1363: $C
                   1364: .ft R
                   1365: ~main(02,0177762)
                   1366:        argc:       02
                   1367:        argv:       0177762
                   1368:        cc:         02124
                   1369: .ft B
                   1370: $r
                   1371: .ft R
                   1372: ps     0170010
                   1373: pc     0204    ~main+0152
                   1374: sp     0177740
                   1375: r5     0177752
                   1376: r4     01
                   1377: r3     0
                   1378: r2     0
                   1379: r1     0
                   1380: r0     0124
                   1381: ~main+0152:    mov     _obuf,(sp)
                   1382: .ft B
                   1383: $e
                   1384: .ft R
                   1385: savr5:     0
                   1386: _obuf:     0
                   1387: _charp:            0124
                   1388: _errno:            0
                   1389: _fout:     0
                   1390: .ft B
                   1391: $m
                   1392: .ft R
                   1393: text map    \`ex1\'
                   1394: b1 = 0              e1 = 02360           f1 = 020
                   1395: b2 = 0              e2 = 02360           f2 = 020
                   1396: data map    \`core1\'
                   1397: b1 = 0              e1 = 03500           f1 = 02000
                   1398: b2 = 0175400        e2 = 0200000                 f2 = 05500
                   1399: .ft B
                   1400: *charp/s
                   1401: .ft R
                   1402: 0124:          TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTLx  Nh@x&_
                   1403: ~
                   1404: .ft B
                   1405: charp/s
                   1406: .ft R
                   1407: _charp:                T
                   1408:  
                   1409: _charp+02:     this is a sentence.
                   1410:  
                   1411: _charp+026:    Input file missing
                   1412: .ft B
                   1413: main.argc/d
                   1414: .ft R
                   1415: 0177756:       2
                   1416: .ft B
                   1417: *main.argv/3o
                   1418: .ft R
                   1419: 0177762:       0177770 0177776 0177777
                   1420: .ft B
                   1421: 0177770/s
                   1422: .ft R
                   1423: 0177770:       a.out
                   1424: .ft B
                   1425: *main.argv/3o
                   1426: .ft R
                   1427: 0177762:       0177770 0177776 0177777
                   1428: .ft B
                   1429: *"/s
                   1430: .ft R
                   1431: 0177770:       a.out
                   1432: .ft B
                   1433:  .=o
                   1434: .ft R
                   1435:                0177770
                   1436: .ft B
                   1437:  .\(mi10/d
                   1438: .ft R
                   1439: 0177756:       2
                   1440: .ft B
                   1441: $q
                   1442: .P2
                   1443: .sp 100
                   1444: .SH
                   1445: Figure 3:  Multiple function C program for stack trace illustration
                   1446: .LP
                   1447: .P1
                   1448: int    fcnt,gcnt,hcnt;
                   1449: h(x,y)
                   1450: {
                   1451:        int hi; register int hr;
                   1452:        hi = x+1;
                   1453:        hr = x\(miy+1;
                   1454:        hcnt++ ;
                   1455:        hj:
                   1456:        f(hr,hi);
                   1457: }
                   1458: 
                   1459: g(p,q)
                   1460: {
                   1461:        int gi; register int gr;
                   1462:        gi = q\(mip;
                   1463:        gr = q\(mip+1;
                   1464:        gcnt++ ;
                   1465:        gj:
                   1466:        h(gr,gi);
                   1467: }
                   1468: 
                   1469: f(a,b)
                   1470: {
                   1471:        int fi; register int fr;
                   1472:        fi = a+2*b;
                   1473:        fr = a+b;
                   1474:        fcnt++ ;
                   1475:        fj:
                   1476:        g(fr,fi);
                   1477: }
                   1478: 
                   1479: main()
                   1480: {
                   1481:        f(1,1);
                   1482: }
                   1483: .P2
                   1484: .sp 100
                   1485: .SH
                   1486: Figure 4:  ADB output for C program of Figure 3
                   1487: .LP
                   1488: .P1
                   1489: .ft B
                   1490: adb
                   1491: $c
                   1492: .ft R
                   1493: ~h(04452,04451)
                   1494: ~g(04453,011124)
                   1495: ~f(02,04451)
                   1496: ~h(04450,04447)
                   1497: ~g(04451,011120)
                   1498: ~f(02,04447)
                   1499: ~h(04446,04445)
                   1500: ~g(04447,011114)
                   1501: ~f(02,04445)
                   1502: ~h(04444,04443)
                   1503: .ft B
                   1504: HIT DEL KEY
                   1505: .ft R
                   1506: adb
                   1507: .ft B
                   1508: ,5$C
                   1509: .ft R
                   1510: ~h(04452,04451)
                   1511:        x:          04452
                   1512:        y:          04451
                   1513:        hi:         ?
                   1514: ~g(04453,011124)
                   1515:        p:          04453
                   1516:        q:          011124
                   1517:        gi:         04451
                   1518:        gr:         ?
                   1519: ~f(02,04451)
                   1520:        a:          02
                   1521:        b:          04451
                   1522:        fi:         011124
                   1523:        fr:         04453
                   1524: ~h(04450,04447)
                   1525:        x:          04450
                   1526:        y:          04447
                   1527:        hi:         04451
                   1528:        hr:         02
                   1529: ~g(04451,011120)
                   1530:        p:          04451
                   1531:        q:          011120
                   1532:        gi:         04447
                   1533:        gr:         04450
                   1534: .ft B
                   1535: fcnt/d
                   1536: .ft R
                   1537: _fcnt:         1173
                   1538: .ft B
                   1539: gcnt/d
                   1540: .ft R
                   1541: _gcnt:         1173
                   1542: .ft B
                   1543: hcnt/d
                   1544: .ft R
                   1545: _hcnt:         1172
                   1546: .ft B
                   1547: h.x/d
                   1548: .ft R
                   1549: 022004:                2346
                   1550: .ft B
                   1551: $q
                   1552: .P2
                   1553: .sp 100
                   1554: .SH
                   1555: Figure 5:  C program to decode tabs
                   1556: .LP
                   1557: .P1
                   1558: #define MAXLINE        80
                   1559: #define YES            1
                   1560: #define NO             0
                   1561: #define TABSP          8
                   1562: .sp .5
                   1563: char   input[] "data";
                   1564: char   ibuf[518];
                   1565: int    tabs[MAXLINE];
                   1566: .sp .5
                   1567: main()
                   1568: {
                   1569:        int col, *ptab;
                   1570:        char c;
                   1571: .sp .5
                   1572:        ptab = tabs;
                   1573:        settab(ptab);   /*Set initial tab stops */
                   1574:        col = 1;
                   1575:        if(fopen(input,ibuf) < 0) {
                   1576:                printf("%s : not found\\n",input);
                   1577:                exit(8);
                   1578:        }
                   1579:        while((c = getc(ibuf)) != \(mi1) {
                   1580:                switch(c) {
                   1581:                        case \(fm\\t\(fm:       /* TAB */
                   1582:                                while(tabpos(col) != YES) {
                   1583:                                        putchar(\(fm \(fm);     /* put BLANK */
                   1584:                                        col++ ;
                   1585:                                }
                   1586:                                break;
                   1587:                        case \(fm\\n\(fm:       /*NEWLINE */
                   1588:                                putchar(\(fm\\n\(fm);
                   1589:                                col = 1;
                   1590:                                break;
                   1591:                        default:
                   1592:                                putchar(c);
                   1593:                                col++ ;
                   1594:                }
                   1595:        }
                   1596: }
                   1597: .sp .5
                   1598: /* Tabpos return YES if col is a tab stop */
                   1599: tabpos(col)
                   1600: int col;
                   1601: {
                   1602:        if(col > MAXLINE)
                   1603:                return(YES);
                   1604:        else
                   1605:                return(tabs[col]);
                   1606: }
                   1607: .sp .5
                   1608: /* Settab - Set initial tab stops */
                   1609: settab(tabp)
                   1610: int *tabp;
                   1611: {
                   1612:        int i;
                   1613: .sp .5
                   1614:        for(i = 0; i<= MAXLINE; i++) 
                   1615:                (i%TABSP) ? (tabs[i] = NO) : (tabs[i] = YES);
                   1616: }
                   1617: .P2
                   1618: .sp 100
                   1619: .SH
                   1620: Figure 6a:  ADB output for C program of Figure 5
                   1621: .LP
                   1622: .P1
                   1623: .ft B
                   1624: adb a.out \(mi
                   1625: settab+4:b
                   1626: fopen+4:b
                   1627: getc+4:b
                   1628: tabpos+4:b
                   1629: $b
                   1630: .ft R
                   1631: breakpoints
                   1632: count  bkpt            command
                   1633: 1      ~tabpos+04
                   1634: 1      _getc+04
                   1635: 1      _fopen+04
                   1636: 1      ~settab+04
                   1637: .ft B
                   1638: settab,5?ia
                   1639: .ft R
                   1640: ~settab:               jsr     r5,csv
                   1641: ~settab+04:    tst     \(mi(sp)
                   1642: ~settab+06:    clr     0177770(r5)
                   1643: ~settab+012:   cmp     $0120,0177770(r5)
                   1644: ~settab+020:   blt     ~settab+076
                   1645: ~settab+022:
                   1646: .ft B
                   1647: settab,5?i
                   1648: .ft R
                   1649: ~settab:               jsr     r5,csv
                   1650:                tst     \(mi(sp)
                   1651:                clr     0177770(r5)
                   1652:                cmp     $0120,0177770(r5)
                   1653:                blt     ~settab+076
                   1654: .ft B
                   1655: :r
                   1656: .ft R
                   1657: a.out: running
                   1658: breakpoint     ~settab+04:     tst     \(mi(sp)
                   1659: .ft B
                   1660: settab+4:d
                   1661: :c
                   1662: .ft R
                   1663: a.out: running
                   1664: breakpoint     _fopen+04:      mov     04(r5),nulstr+012
                   1665: .ft B
                   1666: $C
                   1667: .ft R
                   1668: _fopen(02302,02472)
                   1669: ~main(01,0177770)
                   1670:        col:        01
                   1671:        c:          0
                   1672:        ptab:       03500
                   1673: .ft B
                   1674: tabs,3/8o
                   1675: .ft R
                   1676: 03500:         01      0       0       0       0       0       0       0
                   1677:                01      0       0       0       0       0       0       0
                   1678:                01      0       0       0       0       0       0       0
                   1679: .P2
                   1680: .sp 100
                   1681: .SH
                   1682: Figure 6b:  ADB output for C program of Figure 5
                   1683: .LP
                   1684: .P1
                   1685: .ft B
                   1686: :c
                   1687: .ft R
                   1688: a.out: running
                   1689: breakpoint     _getc+04:       mov     04(r5),r1
                   1690: .ft B
                   1691: ibuf+6/20c
                   1692: .ft R
                   1693: __cleanu+0202:         This    is      a test  of
                   1694: .ft B
                   1695: :c
                   1696: .ft R
                   1697: a.out: running
                   1698: breakpoint     ~tabpos+04:     cmp     $0120,04(r5)
                   1699: .ft B
                   1700: tabpos+4:d
                   1701: settab+4:b  settab,5?ia
                   1702: settab+4:b  settab,5?ia;  0
                   1703: getc+4,3:b  main.c?C;  0
                   1704: settab+4:b  settab,5?ia;  ptab/o;  0
                   1705: $b
                   1706: .ft R
                   1707: breakpoints
                   1708: count  bkpt            command
                   1709: 1      ~tabpos+04
                   1710: 3      _getc+04        main.c?C;0
                   1711: 1      _fopen+04
                   1712: 1      ~settab+04      settab,5?ia;ptab?o;0
                   1713: ~settab:               jsr     r5,csv
                   1714: ~settab+04:    bpt
                   1715: ~settab+06:    clr     0177770(r5)
                   1716: ~settab+012:   cmp     $0120,0177770(r5)
                   1717: ~settab+020:   blt     ~settab+076
                   1718: ~settab+022:
                   1719: 0177766:       0177770
                   1720: 0177744:       @\`
                   1721: T0177744:      T
                   1722: h0177744:      h
                   1723: i0177744:      i
                   1724: s0177744:      s
                   1725: .P2
                   1726: .sp 100
                   1727: .SH
                   1728: Figure 7:  ADB output for C program with breakpoints
                   1729: .LP
                   1730: .in +.5i
                   1731: .nf
                   1732: .ps 8
                   1733: .vs 9
                   1734: .ft B
                   1735: adb ex3 \(mi
                   1736: h+4:b hcnt/d; h.hi/; h.hr/
                   1737: g+4:b gcnt/d; g.gi/; g.gr/
                   1738: f+4:b fcnt/d; f.fi/; f.fr/
                   1739: :r
                   1740: .ft R
                   1741: ex3: running
                   1742: _fcnt:         0
                   1743: 0177732:       214
                   1744: symbol not found
                   1745: .ft B
                   1746: f+4:b fcnt/d; f.a/; f.b/; f.fi/
                   1747: g+4:b gcnt/d; g.p/; g.q/; g.gi/
                   1748: h+4:b hcnt/d; h.x/; h.y/; h.hi/
                   1749: :c
                   1750: .ft R
                   1751: ex3: running
                   1752: _fcnt:         0
                   1753: 0177746:       1
                   1754: 0177750:       1
                   1755: 0177732:       214
                   1756: _gcnt:         0
                   1757: 0177726:       2
                   1758: 0177730:       3
                   1759: 0177712:       214
                   1760: _hcnt:         0
                   1761: 0177706:       2
                   1762: 0177710:       1
                   1763: 0177672:       214
                   1764: _fcnt:         1
                   1765: 0177666:       2
                   1766: 0177670:       3
                   1767: 0177652:       214
                   1768: _gcnt:         1
                   1769: 0177646:       5
                   1770: 0177650:       8
                   1771: 0177632:       214
                   1772: .ft B
                   1773: HIT DEL
                   1774: f+4:b fcnt/d; f.a/"a = "d; f.b/"b = "d; f.fi/"fi = "d
                   1775: g+4:b gcnt/d; g.p/"p = "d; g.q/"q = "d; g.gi/"gi = "d
                   1776: h+4:b hcnt/d; h.x/"x = "d; h.y/"h = "d; h.hi/"hi = "d
                   1777: :r
                   1778: .ft R
                   1779: ex3: running
                   1780: _fcnt:         0
                   1781: 0177746:       a = 1
                   1782: 0177750:       b = 1
                   1783: 0177732:       fi = 214
                   1784: _gcnt:         0
                   1785: 0177726:       p = 2
                   1786: 0177730:       q = 3
                   1787: 0177712:       gi = 214
                   1788: _hcnt:         0
                   1789: 0177706:       x = 2
                   1790: 0177710:       y = 1
                   1791: 0177672:       hi = 214
                   1792: _fcnt:         1
                   1793: 0177666:       a = 2
                   1794: 0177670:       b = 3
                   1795: 0177652:       fi = 214
                   1796: .ft B
                   1797: HIT DEL
                   1798: $q
                   1799: .in -.5i
                   1800: .sp 100
                   1801: .SH
                   1802: Figure 8:  ADB address maps
                   1803: .LP
                   1804: .de l1
                   1805: .tc
                   1806: .ta 1.20i +1.6i +2.5i
                   1807: ..
                   1808: .de l3
                   1809: .tc
                   1810: .ta 1.6i +2.80i +.2i +1.55i
                   1811: ..
                   1812: .de l2
                   1813: .tc
                   1814: .ti 1.0i
                   1815: .ta +0.5i +3.0i +1.75i
                   1816: .tc _
                   1817: ..
                   1818: .de l5
                   1819: .tc 
                   1820: .ti 1.0i
                   1821: .ta +0.75i +3.0i +1.5i
                   1822: .tc _
                   1823: ..
                   1824: .de l6
                   1825: .tc
                   1826: .ti 1.0i
                   1827: .ta +.8i +2.85i +0.4i +1.1i
                   1828: ..
                   1829: .de l8
                   1830: .tc
                   1831: .ti 1.0i
                   1832: .ta +0.5i +3.0i +1.75i
                   1833: .tc _
                   1834: ..
                   1835: .de la
                   1836: .tc
                   1837: .ta 1.20i +1.25i +1.7i
                   1838: ..
                   1839: .de lc
                   1840: .tc
                   1841: .ti 1.0i
                   1842: .ta +.85i +1.6i +.35i +1.1i
                   1843: ..
                   1844: .de lb
                   1845: .tc
                   1846: .ti 1.0i
                   1847: .ta +0.75i +1.75i +1.5i
                   1848: .tc _
                   1849: ..
                   1850: .ul
                   1851: 407 files
                   1852: .sp
                   1853: .l1
                   1854: a.out  hdr     text+data
                   1855: .l2
                   1856: |      |       |
                   1857: .l3
                   1858:        0       D
                   1859: .sp
                   1860: .l1
                   1861: core   hdr     text+data       stack
                   1862: .l5
                   1863: |      |       ......| |
                   1864: .l6
                   1865:        0       D       S       E
                   1866: .sp 2
                   1867: .ul
                   1868: 410 files (shared text)
                   1869: .sp
                   1870: .l1
                   1871: a.out  hdr      text   data
                   1872: .l2
                   1873: |      |       |       |
                   1874: .l3
                   1875:        0       T       B       D
                   1876: .sp
                   1877: .la
                   1878: core   hdr     data    stack
                   1879: .lb
                   1880: |      |       ......| |
                   1881: .lc
                   1882:        B       D       S       E
                   1883: .sp 2
                   1884: .ul
                   1885: 411 files (separated I and D space)
                   1886: .sp
                   1887: .l1
                   1888: a.out  hdr     text    data
                   1889: .l2
                   1890: |      |       |       |
                   1891: .l3
                   1892:        0       T       0       D
                   1893: .sp
                   1894: .la
                   1895: core   hdr     data    stack
                   1896: .lb
                   1897: |      |       ......| |
                   1898: .lc
                   1899:        0       D       S       E
                   1900: .sp 2
                   1901: The following 
                   1902: .ul 
                   1903: adb
                   1904: variables are set.
                   1905: .nf
                   1906: .ta .75i 1.5i 3.5i 4.5i 5.5i
                   1907: .sp
                   1908:                        407     410     411
                   1909: .sp
                   1910:        b       base of data    0       B       0
                   1911:        d       length of data  D       D\(miB  D
                   1912:        s       length of stack S       S       S
                   1913:        t       length of text  0       T       T
                   1914: .sp 100
                   1915: .SH
                   1916: Figure 9:  ADB output for maps
                   1917: .LP
                   1918: .nf
                   1919: .in +.5i
                   1920: .ft B
                   1921: adb map407 core407
                   1922: $m
                   1923: .ft R
                   1924: text map    \`map407\'
                   1925: b1 = 0              e1 = 0256            f1 = 020
                   1926: b2 = 0              e2 = 0256            f2 = 020
                   1927: data map    \`core407\'
                   1928: b1 = 0              e1 = 0300            f1 = 02000
                   1929: b2 = 0175400        e2 = 0200000         f2 = 02300
                   1930: .ft B
                   1931: $v
                   1932: .ft R
                   1933: variables
                   1934: d = 0300
                   1935: m = 0407
                   1936: s = 02400
                   1937: .ft B
                   1938: $q
                   1939: .sp 2
                   1940: adb map410 core410
                   1941: $m
                   1942: .ft R
                   1943: text map    \`map410\'
                   1944: b1 = 0              e1 = 0200            f1 = 020
                   1945: b2 = 020000         e2 = 020116          f2 = 0220
                   1946: data map    \`core410\'
                   1947: b1 = 020000         e1 = 020200          f1 = 02000
                   1948: b2 = 0175400        e2 = 0200000         f2 = 02200
                   1949: .ft B
                   1950: $v
                   1951: .ft R
                   1952: variables
                   1953: b = 020000
                   1954: d = 0200
                   1955: m = 0410
                   1956: s = 02400
                   1957: t = 0200
                   1958: .ft B
                   1959: $q
                   1960: .sp 2
                   1961: adb map411 core411
                   1962: $m
                   1963: .ft R
                   1964: text map    \`map411\'
                   1965: b1 = 0              e1 = 0200            f1 = 020
                   1966: b2 = 0              e2 = 0116            f2 = 0220
                   1967: data map    \`core411\'
                   1968: b1 = 0              e1 = 0200            f1 = 02000
                   1969: b2 = 0175400        e2 = 0200000         f2 = 02200
                   1970: .ft B
                   1971: $v
                   1972: .ft R
                   1973: variables
                   1974: d = 0200
                   1975: m = 0411
                   1976: s = 02400
                   1977: t = 0200
                   1978: .ft B
                   1979: $q
                   1980: .in -.5i
                   1981: .sp 100
                   1982: .SH
                   1983: Figure 10:  Simple C program for illustrating formatting and patching
                   1984: .LP
                   1985: .P1
                   1986: char   str1[]  "This is a character string";
                   1987: int    one     1;
                   1988: int    number  456;
                   1989: long   lnum    1234;
                   1990: float  fpt     1.25;
                   1991: char   str2[]  "This is the second character string";
                   1992: main()
                   1993: {
                   1994:        one = 2;
                   1995: }
                   1996: .P2
                   1997: .sp 100
                   1998: .SH
                   1999: Figure 11:  ADB output illustrating fancy formats
                   2000: .LP
                   2001: .nf
                   2002: .ps 9
                   2003: .vs 11p
                   2004: .ft B
                   2005: adb map410 core410
                   2006: <b,\(mi1/8ona
                   2007: .ft R
                   2008: 020000:                0       064124  071551  064440  020163  020141  064143  071141
                   2009: .sp .5
                   2010: _str1+016:     061541  062564  020162  072163  064562  063556  0       02
                   2011: .sp .5
                   2012: _number:
                   2013: _number:       0710    0       02322   040240  0       064124  071551  064440
                   2014: .sp .5
                   2015: _str2+06:      020163  064164  020145  062563  067543  062156  061440  060550
                   2016: .sp .5
                   2017: _str2+026:     060562  072143  071145  071440  071164  067151  0147    0
                   2018: .sp .5
                   2019: savr5+02:      0       0       0       0       0       0       0       0
                   2020: .sp .5
                   2021: .ft B
                   2022: <b,20/4o4^8Cn
                   2023: .ft R
                   2024: 020000:                0       064124  071551  064440  @\`@\`This i
                   2025:                020163  020141  064143  071141  s a char
                   2026:                061541  062564  020162  072163  acter st
                   2027:                064562  063556  0       02      ring@\`@\`@b@\`
                   2028: .sp .5
                   2029: _number:       0710    0       02322   040240  H@a@\`@\`R@d @@
                   2030:                0       064124  071551  064440  @\`@\`This i
                   2031:                020163  064164  020145  062563  s the se
                   2032:                067543  062156  061440  060550  cond cha
                   2033:                060562  072143  071145  071440  racter s
                   2034:                071164  067151  0147    0       tring@\`@\`@\`
                   2035:                0       0       0       0       @\`@\`@\`@\`@\`@\`@\`@\`
                   2036:                0       0       0       0       @\`@\`@\`@\`@\`@\`@\`@\`
                   2037: data address not found
                   2038: .ft B
                   2039: <b,20/4o4^8t8cna
                   2040: .ft R
                   2041: 020000:                0       064124  071551  064440          This i
                   2042: _str1+06:      020163  020141  064143  071141          s a char
                   2043: _str1+016:     061541  062564  020162  072163          acter st
                   2044: _str1+026:     064562  063556  0       02              ring
                   2045: _number:
                   2046: _number:       0710    0       02322   040240          HR
                   2047: _fpt+02:       0       064124  071551  064440          This i
                   2048: _str2+06:      020163  064164  020145  062563          s the se
                   2049: _str2+016:     067543  062156  061440  060550          cond cha
                   2050: _str2+026:     060562  072143  071145  071440          racter  s
                   2051: _str2+036:     071164  067151  0147    0               tring
                   2052: savr5+02:      0       0       0       0
                   2053: savr5+012:     0       0       0       0
                   2054: data address not found
                   2055: .ft B
                   2056: <b,10/2b8t^2cn
                   2057: .ft R
                   2058: 020000:                0       0
                   2059: .sp .5
                   2060: _str1:         0124    0150            Th
                   2061:                0151    0163            is
                   2062:                040     0151             i
                   2063:                0163    040             s
                   2064:                0141    040             a
                   2065:                0143    0150            ch
                   2066:                0141    0162            ar
                   2067:                0141    0143            ac
                   2068:                0164    0145            te
                   2069: .ft B
                   2070: $Q
                   2071: .sp 100
                   2072: .SH
                   2073: Figure 12:  Directory and inode dumps
                   2074: .LP
                   2075: .nf
                   2076: .ft B
                   2077: adb dir \(mi
                   2078: =nt"Inode"t"Name"
                   2079: 0,\(mi1?ut14cn
                   2080: .ft R
                   2081: 
                   2082:                Inode   Name
                   2083: 0:             652     .
                   2084:                82      ..
                   2085:                5971    cap.c
                   2086:                5323    cap
                   2087:                0       pp
                   2088: .sp 4
                   2089: .ft B
                   2090: adb /dev/src \(mi
                   2091: .ft B
                   2092: 02000>b
                   2093: ?m<b
                   2094: .ft R
                   2095: new map            \`/dev/src\'
                   2096: b1 = 02000          e1 = 0100000000      f1 = 0
                   2097: b2 = 0              e2 = 0               f2 = 0
                   2098: .ft B
                   2099: $v
                   2100: .ft R
                   2101: variables
                   2102: b = 02000
                   2103: .ft B
                   2104: <b,\(mi1?"flags"8ton"links,uid,gid"8t3bn"size"8tbrdn"addr"8t8un"times"8t2Y2na
                   2105: .ft R
                   2106: 02000:         flags   073145
                   2107:                links,uid,gid   0163    0164    0141
                   2108:                size    0162    10356
                   2109:                addr    28770   8236    25956   27766   25455   8236    25956   25206
                   2110:                times   1976 Feb 5 08:34:56     1975 Dec 28 10:55:15
                   2111: 
                   2112: 02040:         flags   024555
                   2113:                links,uid,gid   012     0163    0164
                   2114:                size    0162    25461
                   2115:                addr    8308    30050   8294    25130   15216   26890   29806   10784
                   2116:                times   1976 Aug 17 12:16:51    1976 Aug 17 12:16:51
                   2117: 
                   2118: 02100:         flags   05173
                   2119:                links,uid,gid   011     0162    0145
                   2120:                size    0147    29545
                   2121:                addr    25972   8306    28265   8308    25642   15216   2314    25970
                   2122:                times   1977 Apr 2 08:58:01     1977 Feb 5 10:21:44
                   2123: .\"
                   2124: .\"    Start of Summary
                   2125: .sp 100
                   2126: .TL
                   2127: ADB Summary
                   2128: .LP
                   2129: .LP
                   2130: .if t .2C
                   2131: .nr VS 9
                   2132: .nr VS 11
                   2133: .SH
                   2134: Command Summary
                   2135: .LP
                   2136: .ta .7i
                   2137: a)   formatted printing
                   2138: .sp .5
                   2139: .IP "\fB? \fIformat\fR" .7i
                   2140: print from \fIa.out\fR file according to \fIformat\fR
                   2141: .IP "\fB/ \fIformat\fR" .7i
                   2142: print from \fIcore\fR file according to \fIformat\fR
                   2143: .IP "\fB= \fIformat\fR" .7i
                   2144: print the value of \fIdot\fR
                   2145: .sp .5
                   2146: .IP "\fB?w\fR expr" .7i
                   2147: write expression into \fIa.out\fR file
                   2148: .IP "\fB/w\fR expr" .7i
                   2149: write expression into \fIcore\fR file
                   2150: .sp .5
                   2151: .IP "\fB?l\fR expr" .7i
                   2152: locate expression in \fIa.out\fR file
                   2153: .LP
                   2154: .ta .7i
                   2155: b)   breakpoint and program control
                   2156: .LP
                   2157: .ta .7i
                   2158: .nf
                   2159: .ta .7i
                   2160: \fB:b\fR       set breakpoint at \fIdot\fR
                   2161: \fB:c\fR       continue running program
                   2162: \fB:d\fR       delete breakpoint
                   2163: \fB:k\fR       kill the program being debugged
                   2164: \fB:r\fR       run \fIa.out\fR file under ADB control
                   2165: \fB:s\fR       single step
                   2166: .LP
                   2167: .ta .7i
                   2168: c)   miscellaneous printing
                   2169: .LP
                   2170: .ta .7i
                   2171: .nf
                   2172: \fB$b\fR       print current breakpoints
                   2173: \fB$c\fR       C stack trace
                   2174: \fB$e\fR       external variables
                   2175: \fB$f\fR       floating registers
                   2176: \fB$m\fR       print ADB segment maps
                   2177: \fB$q\fR       exit from ADB
                   2178: \fB$r\fR       general registers
                   2179: \fB$s\fR       set offset for symbol match
                   2180: \fB$v\fR       print ADB variables
                   2181: \fB$w\fR       set output line width
                   2182: .LP
                   2183: .ta .7i
                   2184: d)   calling the shell
                   2185: .LP
                   2186: .ta .7i
                   2187: .nf
                   2188: \fB!\fR        call \fIshell\fP to read rest of line
                   2189: .LP
                   2190: .ta .7i
                   2191: e)   assignment to variables
                   2192: .LP
                   2193: .ta .7i
                   2194: .nf
                   2195: \fB>\fIname\fR assign dot to variable or register \fIname\fR
                   2196: .sp 100
                   2197: .SH
                   2198: Format Summary
                   2199: .LP
                   2200: .ta .7i
                   2201: .nf
                   2202: \fBa   \fRthe value of dot
                   2203: \fBb   \fRone byte in octal
                   2204: \fBc   \fRone byte as a character
                   2205: \fBd   \fRone word in decimal
                   2206: \fBf   \fRtwo words in floating point
                   2207: \fBi   \fRPDP 11 instruction
                   2208: \fBo   \fRone word in octal
                   2209: \fBn   \fRprint a newline
                   2210: \fBr   \fRprint a blank space
                   2211: \fBs   \fRa null terminated character string
                   2212: \fIn\fBt       \fRmove to next \fIn\fR space tab
                   2213: \fBu   \fRone word as unsigned integer
                   2214: \fBx   \fRhexadecimal
                   2215: \fBY   \fRdate
                   2216: \fB^   \fRbackup dot
                   2217: \fB"..."\fR    print string
                   2218: .LP
                   2219: .ta .7i
                   2220: .SH
                   2221: Expression Summary
                   2222: .LP
                   2223: .ta .7i
                   2224: a) expression components
                   2225: .LP
                   2226: .ta .1.1i
                   2227: .nf
                   2228: \fBdecimal integer     \fRe.g. 256
                   2229: \fBoctal integer       \fRe.g. 0277
                   2230: \fBhexadecimal \fRe.g. #ff
                   2231: \fBsymbols     \fRe.g. flag  _main  main.argc
                   2232: \fBvariables   \fRe.g. <b
                   2233: \fBregisters   \fRe.g. <pc <r0
                   2234: \fB(expression)        \fRexpression grouping
                   2235: .LP
                   2236: .ta .7i
                   2237: b) dyadic operators
                   2238: .LP
                   2239: .ta .7i
                   2240: .nf
                   2241: \fB+\fP        add
                   2242: \fB\(mi\fP     subtract
                   2243: \fB*\fP        multiply
                   2244: \fB%\fP        integer division
                   2245: \fB&\fP        bitwise and
                   2246: \fB|\fP        bitwise or
                   2247: \fB#\fP        round up to the next multiple
                   2248: .LP
                   2249: .ta .7i
                   2250: c) monadic operators
                   2251: .LP
                   2252: .ta .7i
                   2253: .nf
                   2254: \v'.25m'\s+2\fB~\fP\s0\v'-.25m'        not
                   2255: \fB*\fR        contents of location
                   2256: \fB\(mi\fR     integer negate
                   2257: .fi

unix.superglobalmegacorp.com

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