Annotation of 43BSDReno/share/doc/ps2/09.lisp/ch11.n, revision 1.1.1.1

1.1       root        1: .\" Copyright (c) 1980 Regents of the University of California.
                      2: .\" All rights reserved.  The Berkeley software License Agreement
                      3: .\" specifies the terms and conditions for redistribution.
                      4: .\"
                      5: .\"    @(#)ch11.n      6.1 (Berkeley) 4/29/86
                      6: .\"
                      7: ." $Header: ch11.n 1.1 83/01/31 07:08:25 jkf Exp $
                      8: .Lc The\ Joseph\ Lister\ Trace\ Package 11
                      9: .de Tf
                     10: .sp 2v
                     11: .ti -.5i
                     12: \fB\\$1\fP - 
                     13: ..
                     14: .pp
                     15: The Joseph Lister\*[\(dg\*] Trace package is an 
                     16: important tool for the interactive debugging of a Lisp
                     17: program.
                     18: .(f
                     19: \*[\(dg\*]\fILister, Joseph\fP\ \ \ \ 
                     20: 1st Baron Lister of Lyme Regis,
                     21: 1827-1912; English surgeon: introduced antiseptic surgery.
                     22: .)f
                     23: It allows you to examine selected  calls to a function or functions, and
                     24: optionally to stop execution of the Lisp program to examine the values
                     25: of variables.
                     26: .pp
                     27: The trace package is a set of Lisp programs located in the Lisp program 
                     28: library (usually in the file /usr/lib/lisp/trace.l).
                     29: Although not normally loaded in the Lisp system, the package will
                     30: be loaded in when the first call to \fItrace\fP is made.
                     31: .Lf trace "[ls_arg1 ...]"
                     32: .Wh
                     33: the form of the ls_arg\fIi\fP is described below.
                     34: .Re
                     35: a list of the function sucessfully modified for tracing.
                     36: If no arguments are given to 
                     37: .i trace ,
                     38: a list of all functions currently being traced is returned.
                     39: .Se
                     40: The function definitions of the functions to trace are modified.
                     41: .sp 2v
                     42: .in 0
                     43: The ls_arg\fIi\fP can have one of the following forms:
                     44: .in .75i
                     45: .Tf "foo"
                     46: when foo is entered and exited, the trace information will be printed.
                     47: .Tf "(foo break)"
                     48: when foo is entered and exited the trace information will be printed.
                     49: Also, just after the trace information for foo is printed upon entry,
                     50: you will be put in  a special break loop.
                     51: The prompt is `T>' and you may type any Lisp expression, and see its
                     52: value printed.
                     53: The 
                     54: .i i th 
                     55: argument to the function just called can be accessed as (arg \fIi\fP).
                     56: To leave the trace loop, just type ^D or (tracereturn)
                     57: and execution will continue.
                     58: Note that ^D will work only on UNIX systems.
                     59: .Tf "(foo if expression)"
                     60: when foo is entered and the expression evaluates to non-nil, then the
                     61: trace information will be printed for both exit and entry.
                     62: If expression evaluates to nil, then no trace information will be
                     63: printed.
                     64: .Tf "(foo ifnot expression)"
                     65: when foo is entered and the expression evaluates to nil, then the
                     66: trace information will be printed for both entry and exit.
                     67: If both \fBif\fP and 
                     68: .b ifnot 
                     69: are specified, then the 
                     70: .b if 
                     71: expression must evaluate
                     72: to non nil AND the 
                     73: .b ifnot 
                     74: expression must evaluate to nil for the trace
                     75: information to be printed out.
                     76: .Tf "(foo evalin expression)"
                     77: when foo is entered and after the entry trace information is printed,
                     78: expression will be evaluated. 
                     79: Exit trace information will be printed when foo exits.
                     80: .Tf "(foo evalout expression)"
                     81: when foo is entered, entry trace information will be printed.
                     82: When foo exits, and before the exit trace information is printed,
                     83: expression will be evaluated.
                     84: .Tf "(foo evalinout expression)"
                     85: this has the same effect as (trace (foo evalin expression evalout expression)).
                     86: .Tf "(foo lprint)"
                     87: this tells 
                     88: .i trace 
                     89: to use the level printer when printing the arguments to
                     90: and the result of  a call to foo.
                     91: The level printer prints only the top levels of list structure. 
                     92: Any structure
                     93: below three levels is printed as a &.
                     94: This allows you to trace functions with massive arguments or results.
                     95: .sp 2v
                     96: .pp
                     97: The following trace options permit one to have greater control over each
                     98: action which takes place when a function is traced.
                     99: These options are only meant to be used by people who need special hooks
                    100: into the trace package.
                    101: Most people should skip reading this section.
                    102: .in .75i
                    103: .Tf "(foo traceenter tefunc)"
                    104: this tells 
                    105: .i trace 
                    106: that the function to be called when foo is entered is 
                    107: tefunc.
                    108: tefunc should be a lambda of two arguments, the first argument will be 
                    109: bound to the name of the function being traced, foo in this case.
                    110: The second argument will be bound to the list of arguments to which 
                    111: foo should be applied.
                    112: The function tefunc should print some sort of "entering foo" message.
                    113: It should not apply foo to the arguments, however. 
                    114: That is done later on.
                    115: .Tf "(foo traceexit txfunc)"
                    116: this tells 
                    117: .i trace 
                    118: that the function to be called when foo is exited is
                    119: txfunc.
                    120: txfunc should be a lambda of two arguments, the first argument will be
                    121: bound to the name of the function being traced, foo in this case.
                    122: The second argument will be bound to the result of the call to foo.
                    123: The function txfunc should print some sort of "exiting foo" message.
                    124: .Tf "(foo evfcn evfunc)"
                    125: this tells 
                    126: .i trace 
                    127: that the form evfunc should be evaluated to get the value
                    128: of foo applied to its arguments.  
                    129: This option is a bit different from the other special options since evfunc
                    130: will usually be an expression, not just the name of a function, and that
                    131: expression will be specific to the evaluation of function foo.
                    132: The argument list to be applied will be available as T-arglist.
                    133: .Tf "(foo printargs prfunc)"
                    134: this tells 
                    135: .i trace 
                    136: to used prfunc to print the arguments  to be
                    137: applied to the function foo.
                    138: prfunc should be a lambda of one argument.
                    139: You might want to use this option if you wanted a print function which could
                    140: handle circular lists.
                    141: This option will work only if you do not specify your own 
                    142: .b traceenter 
                    143: function.
                    144: Specifying the option 
                    145: .b lprint 
                    146: is just a simple way of changing the printargs
                    147: function to the level printer.
                    148: .Tf "(foo printres prfunc)"
                    149: this tells 
                    150: .i trace 
                    151: to use prfunc to print the result of evaluating foo.
                    152: prfunc should be a lambda of one argument.
                    153: This option will work only if you do not specify your own 
                    154: .b traceexit 
                    155: function.
                    156: Specifying the option 
                    157: .b lprint 
                    158: changes printres to the level printer.
                    159: .sp 2v
                    160: .pp
                    161: You may specify more than one option for each function traced.  
                    162: For example:
                    163: .sp 1v
                    164: .ti .5i
                    165: \fI(trace (foo if\ (eq 3 (arg 1)) break lprint) (bar evalin (print xyzzy)))\fP
                    166: .sp 1v
                    167: This tells 
                    168: .i trace 
                    169: to trace two more functions, foo and bar.
                    170: Should foo be called with the first argument 
                    171: .i eq
                    172: to 3, then the entering foo message will be printed with the level printer.
                    173: Next it will enter a trace break loop, allowing you to evaluate any 
                    174: lisp expressions.
                    175: When you exit the trace break loop, foo will be applied to its arguments
                    176: and the resulting value will be printed, again using the level printer.
                    177: Bar is also traced, and each time bar is entered, an entering bar message
                    178: will be printed and then the value of xyzzy will be printed.
                    179: Next bar will be applied to its arguments and the result will be printed.
                    180: If you tell 
                    181: .i trace 
                    182: to trace a function which is already traced, it will first
                    183: .i untrace 
                    184: it.  Thus if you want to specify more than one trace option for
                    185: a function, you must do it all at once.
                    186: The following is 
                    187: .i not 
                    188: equivalent to the preceding call to 
                    189: .i trace 
                    190: for foo:
                    191: .sp 1v
                    192: \fI(trace (foo if (eq 3 (arg 1))) (foo break) (foo lprint))\fP
                    193: .sp 1v.
                    194: In this example, only the last option, lprint, will be in effect.
                    195: .pp
                    196: If the symbol $tracemute is given a non nil value, printing of the 
                    197: function name and arguments on entry and exit will be surpressed.
                    198: This is particularly useful if the function you are tracing fails
                    199: after many calls to it.  In this case you would tell 
                    200: .i trace 
                    201: to
                    202: trace the function, set $tracemute to t, and begin the computation.
                    203: When an error occurs you can use
                    204: .i tracedump
                    205: to print out the current trace frames.
                    206: .pp
                    207: Generally the trace package has its own internal names for the the lisp
                    208: functions it uses, so that you can feel free to trace system functions like
                    209: .i cond 
                    210: and not worry about adverse interaction with the actions of the trace
                    211: package.
                    212: You can trace any type of function: lambda, nlambda, lexpr or macro whether
                    213: compiled or interpreted and you can even trace array references (however
                    214: you should not attempt to store in an array which has been traced).
                    215: .pp
                    216: When tracing compiled code keep in mind that many function calls are translated 
                    217: directly to machine language  or other equivalent  function calls.
                    218: A full list of open coded functions is listed at the beginning of the 
                    219: liszt compiler source.
                    220: .i Trace 
                    221: will do a \fI(sstatus\ translink\ nil)\fP to insure that the 
                    222: new traced definitions it defines are called instead of the old untraced ones.
                    223: You may notice that compiled code will run slower after this is done.
                    224: .Lf traceargs "s_func [x_level]"
                    225: .Wh
                    226: if x_level is missing it is assumed to be 1.
                    227: .Re
                    228: the arguments to the x_level\fIth\fP call to traced
                    229: function s_func are returned.
                    230: .Lf tracedump ""
                    231: .Se
                    232: the currently active trace frames are printed on the terminal.
                    233: returns a list of functions untraced.
                    234: .Lf untrace "[s_arg1 ...]"
                    235: .Re
                    236: a list of the functions which were untraced.
                    237: .No
                    238: if no arguments are given, all functions are untraced.
                    239: .Se
                    240: the old function definitions of all 
                    241: traced functions are restored
                    242: except in the case where it appears that 
                    243: the current definition of a function was not created by trace.

unix.superglobalmegacorp.com

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