Gauche has some basic built-in APIs to help developers to analyze the program.
• Debugging aid: | ||
• Profiler API: |
This macro prints expr in a source form, then evaluates it, then prints out the result(s), and returns them.
The output goes to the current trace port (see Common port operations).
The special reader syntax #?=expr
is expanded into
(debug-print expr)
. See Debugging, for the
details.
This parameter specifies the maximum width of information to be
printed by debug-print
. If the information takes more
columns than the value of this parameter, it is truncated.
To show all the information, set #f
to this parameter.
This macro prints the value of args right before calling proc and the result(s) of the call afterwards.
The output goes to the current trace port (see Common port operations).
The special reader syntax #?,expr
is expanded into
(debug-funcall expr)
. See Debugging, for the
details.
Works like debug-print
and debug-funcall
, but
prints out the debug info ony when test evaluates to true.
These are functionally equivalent to the following code:
(if test (debug-print expr) expr) (if test (debug-funcall (proc arg ...)) (proc arg ...))
The special reader syntax #??=test expr
and
#??,test expr
are expanded into
(debug-print-conditionally test expr)
and
(debug-funcall-conditionally test expr)
, respectively.
See Debugging, for the details.
Retrieves source information attached to obj.
The source information is returned as a list of source file name
and an integer line number. If no source information is available
in obj, #f
is returned.
Returns the source code of closure, if available.
Otherwise, #f
is returned.
Currently, only the code that’s directly read from Scheme source is available; if the Scheme code is precompiled, the source code isn’t saved. It may be changed in future.
Returns the location (a list of filename and line number) where procedure
is defined, if available. Otherwise, #f
is returned.
gosh> (use rfc.http) gosh> (source-location http-get) ("/usr/share/gauche-0.9/0.9.5/lib/rfc/http.scm" 443)
If procedure is a subr or a precompiled closure, the filename may not be a complete pathname.
gosh> (source-location cons) ("liblist.scm" 46)
Disassemble the compiled body of closure and print it. It may not be very useful unless you’re tracking a compiler bug, or trying to tune the program to its limit.
If you’re reading the disassembler output, keep in mind that the compiled code vector may have some dead code; they are produced by the jump optimization, but the compiler doesn’t bother to eliminate them.
This returns a string that is quasi-unique to an object obj.
“Quasi-unique” means the label is unique to the obj—
the same (eq?
) objs returns the same string, and
if two objs return different string they aren’t eq?
to each other—
until next GC occurs.
This is mostly for printing out anonymous objects that doesn’t have any other good way to distinguish each other. Note that uniqueness isn’t guaranteed across GCs, you shouldn’t use the returned value as the key to identify the objects.
These are the functions to control Gauche’s built-in profiler. See Using profiler for the explanation of the profiler.
Note that the profiler isn’t guaranteed to work correctly yet in
multi-threaded program, since the interaction between setitimer
and threads are platform-dependent.
Starts the sampling profiler. If the profiler is already started, nothing is done.
Stop the sampling profiler, and save the sampled data into the internal structure. If there are already saved sampled data, the newly obtained data is added to it. If the profiler isn’t running, nothing is done.
Stop the profiler if it is running. Then discard the saved sampled data.
Show the saved sampled data.
The keyword argument sort-by may be one of the symbols
time
, count
, or time-per-call
, to specify
how the result should be sorted. The default is time
.
The keyword argument max-rows specifies the max number of
rows to be shown. If it is #f
, all the data is shown.
A convenience procedure. Call thunk with the sampling profiler running, and show the result to the current output port afterwards. Returns value(s) thunk yields. The profiler is reset after the result is shown.
You can’t nest this construct; the innermost with-profiler
will reset the profiler, invalidates any outer with-profiler
.