@c Copyright (C) 2008--2021 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 or @c any later version published by the Free Software Foundation; with the @c Invariant Sections being ``Free Software'' and ``Free Software Needs @c Free Documentation'', with the Front-Cover Texts being ``A GNU Manual,'' @c and with the Back-Cover Texts as in (a) below. @c @c (a) The FSF's Back-Cover Text is: ``You are free to copy and modify @c this GNU Manual. Buying copies from GNU Press supports the FSF in @c developing GNU and promoting software freedom.'' @node Guile @section Extending @value{GDBN} using Guile @cindex guile scripting @cindex scripting with guile You can extend @value{GDBN} using the @uref{http://www.gnu.org/software/guile/, Guile implementation of the Scheme programming language}. This feature is available only if @value{GDBN} was configured using @option{--with-guile}. @menu * Guile Introduction:: Introduction to Guile scripting in @value{GDBN} * Guile Commands:: Accessing Guile from @value{GDBN} * Guile API:: Accessing @value{GDBN} from Guile * Guile Auto-loading:: Automatically loading Guile code * Guile Modules:: Guile modules provided by @value{GDBN} @end menu @node Guile Introduction @subsection Guile Introduction Guile is an implementation of the Scheme programming language and is the GNU project's official extension language. Guile support in @value{GDBN} follows the Python support in @value{GDBN} reasonably closely, so concepts there should carry over. However, some things are done differently where it makes sense. @value{GDBN} requires Guile version 3.0, 2.2, or 2.0. @cindex guile scripts directory Guile scripts used by @value{GDBN} should be installed in @file{@var{data-directory}/guile}, where @var{data-directory} is the data directory as determined at @value{GDBN} startup (@pxref{Data Files}). This directory, known as the @dfn{guile directory}, is automatically added to the Guile Search Path in order to allow the Guile interpreter to locate all scripts installed at this location. @node Guile Commands @subsection Guile Commands @cindex guile commands @cindex commands to access guile @value{GDBN} provides two commands for accessing the Guile interpreter: @table @code @kindex guile-repl @kindex gr @item guile-repl @itemx gr The @code{guile-repl} command can be used to start an interactive Guile prompt or @dfn{repl}. To return to @value{GDBN}, type @kbd{,q} or the @code{EOF} character (e.g., @kbd{Ctrl-D} on an empty prompt). These commands do not take any arguments. @kindex guile @kindex gu @item guile @r{[}@var{scheme-expression}@r{]} @itemx gu @r{[}@var{scheme-expression}@r{]} The @code{guile} command can be used to evaluate a Scheme expression. If given an argument, @value{GDBN} will pass the argument to the Guile interpreter for evaluation. @smallexample (@value{GDBP}) guile (display (+ 20 3)) (newline) 23 @end smallexample The result of the Scheme expression is displayed using normal Guile rules. @smallexample (@value{GDBP}) guile (+ 20 3) 23 @end smallexample If you do not provide an argument to @code{guile}, it will act as a multi-line command, like @code{define}. In this case, the Guile script is made up of subsequent command lines, given after the @code{guile} command. This command list is terminated using a line containing @code{end}. For example: @smallexample (@value{GDBP}) guile >(display 23) >(newline) >end 23 @end smallexample @end table It is also possible to execute a Guile script from the @value{GDBN} interpreter: @table @code @item source @file{script-name} The script name must end with @samp{.scm} and @value{GDBN} must be configured to recognize the script language based on filename extension using the @code{script-extension} setting. @xref{Extending GDB, ,Extending GDB}. @item guile (load "script-name") This method uses the @code{load} Guile function. It takes a string argument that is the name of the script to load. See the Guile documentation for a description of this function. (@pxref{Loading,,, guile, GNU Guile Reference Manual}). @end table @node Guile API @subsection Guile API @cindex guile api @cindex programming in guile You can get quick online help for @value{GDBN}'s Guile API by issuing the command @w{@kbd{help guile}}, or by issuing the command @kbd{,help} from an interactive Guile session. Furthermore, most Guile procedures provided by @value{GDBN} have doc strings which can be obtained with @kbd{,describe @var{procedure-name}} or @kbd{,d @var{procedure-name}} from the Guile interactive prompt. @menu * Basic Guile:: Basic Guile Functions * Guile Configuration:: Guile configuration variables * GDB Scheme Data Types:: Scheme representations of GDB objects * Guile Exception Handling:: How Guile exceptions are translated * Values From Inferior In Guile:: Guile representation of values * Arithmetic In Guile:: Arithmetic in Guile * Types In Guile:: Guile representation of types * Guile Pretty Printing API:: Pretty-printing values with Guile * Selecting Guile Pretty-Printers:: How GDB chooses a pretty-printer * Writing a Guile Pretty-Printer:: Writing a pretty-printer * Commands In Guile:: Implementing new commands in Guile * Parameters In Guile:: Adding new @value{GDBN} parameters * Progspaces In Guile:: Program spaces * Objfiles In Guile:: Object files in Guile * Frames In Guile:: Accessing inferior stack frames from Guile * Blocks In Guile:: Accessing blocks from Guile * Symbols In Guile:: Guile representation of symbols * Symbol Tables In Guile:: Guile representation of symbol tables * Breakpoints In Guile:: Manipulating breakpoints using Guile * Lazy Strings In Guile:: Guile representation of lazy strings * Architectures In Guile:: Guile representation of architectures * Disassembly In Guile:: Disassembling instructions from Guile * I/O Ports in Guile:: GDB I/O ports * Memory Ports in Guile:: Accessing memory through ports and bytevectors * Iterators In Guile:: Basic iterator support @end menu @node Basic Guile @subsubsection Basic Guile @cindex guile stdout @cindex guile pagination At startup, @value{GDBN} overrides Guile's @code{current-output-port} and @code{current-error-port} to print using @value{GDBN}'s output-paging streams. A Guile program which outputs to one of these streams may have its output interrupted by the user (@pxref{Screen Size}). In this situation, a Guile @code{signal} exception is thrown with value @code{SIGINT}. Guile's history mechanism uses the same naming as @value{GDBN}'s, namely the user of dollar-variables (e.g., $1, $2, etc.). The results of evaluations in Guile and in GDB are counted separately, @code{$1} in Guile is not the same value as @code{$1} in @value{GDBN}. @value{GDBN} is not thread-safe. If your Guile program uses multiple threads, you must be careful to only call @value{GDBN}-specific functions in the @value{GDBN} thread. Some care must be taken when writing Guile code to run in @value{GDBN}. Two things are worth noting in particular: @itemize @bullet @item @value{GDBN} installs handlers for @code{SIGCHLD} and @code{SIGINT}. Guile code must not override these, or even change the options using @code{sigaction}. If your program changes the handling of these signals, @value{GDBN} will most likely stop working correctly. Note that it is unfortunately common for GUI toolkits to install a @code{SIGCHLD} handler. @item @value{GDBN} takes care to mark its internal file descriptors as close-on-exec. However, this cannot be done in a thread-safe way on all platforms. Your Guile programs should be aware of this and should both create new file descriptors with the close-on-exec flag set and arrange to close unneeded file descriptors before starting a child process. @end itemize @cindex guile gdb module @value{GDBN} introduces a new Guile module, named @code{gdb}. All methods and classes added by @value{GDBN} are placed in this module. @value{GDBN} does not automatically @code{import} the @code{gdb} module, scripts must do this themselves. There are various options for how to import a module, so @value{GDBN} leaves the choice of how the @code{gdb} module is imported to the user. To simplify interactive use, it is recommended to add one of the following to your ~/.gdbinit. @smallexample guile (use-modules (gdb)) @end smallexample @smallexample guile (use-modules ((gdb) #:renamer (symbol-prefix-proc 'gdb:))) @end smallexample Which one to choose depends on your preference. The second one adds @code{gdb:} as a prefix to all module functions and variables. The rest of this manual assumes the @code{gdb} module has been imported without any prefix. See the Guile documentation for @code{use-modules} for more information (@pxref{Using Guile Modules,,, guile, GNU Guile Reference Manual}). Example: @smallexample (gdb) guile (value-type (make-value 1)) ERROR: Unbound variable: value-type Error while executing Scheme code. (gdb) guile (use-modules (gdb)) (gdb) guile (value-type (make-value 1)) int (gdb) @end smallexample The @code{(gdb)} module provides these basic Guile functions. @c TODO: line length @deffn {Scheme Procedure} execute command @r{[}#:from-tty boolean@r{]} @r{[}#:to-string boolean@r{]} Evaluate @var{command}, a string, as a @value{GDBN} CLI command. If a @value{GDBN} exception happens while @var{command} runs, it is translated as described in @ref{Guile Exception Handling,,Guile Exception Handling}. @var{from-tty} specifies whether @value{GDBN} ought to consider this command as having originated from the user invoking it interactively. It must be a boolean value. If omitted, it defaults to @code{#f}. By default, any output produced by @var{command} is sent to @value{GDBN}'s standard output (and to the log output if logging is turned on). If the @var{to-string} parameter is @code{#t}, then output will be collected by @code{execute} and returned as a string. The default is @code{#f}, in which case the return value is unspecified. If @var{to-string} is @code{#t}, the @value{GDBN} virtual terminal will be temporarily set to unlimited width and height, and its pagination will be disabled; @pxref{Screen Size}. @end deffn @deffn {Scheme Procedure} history-ref number Return a value from @value{GDBN}'s value history (@pxref{Value History}). The @var{number} argument indicates which history element to return. If @var{number} is negative, then @value{GDBN} will take its absolute value and count backward from the last element (i.e., the most recent element) to find the value to return. If @var{number} is zero, then @value{GDBN} will return the most recent element. If the element specified by @var{number} doesn't exist in the value history, a @code{gdb:error} exception will be raised. If no exception is raised, the return value is always an instance of @code{} (@pxref{Values From Inferior In Guile}). @emph{Note:} @value{GDBN}'s value history is independent of Guile's. @code{$1} in @value{GDBN}'s value history contains the result of evaluating an expression from @value{GDBN}'s command line and @code{$1} from Guile's history contains the result of evaluating an expression from Guile's command line. @end deffn @deffn {Scheme Procedure} history-append! value Append @var{value}, an instance of @code{}, to @value{GDBN}'s value history. Return its index in the history. Putting into history values returned by Guile extensions will allow the user convenient access to those values via CLI history facilities. @end deffn @deffn {Scheme Procedure} parse-and-eval expression Parse @var{expression} as an expression in the current language, evaluate it, and return the result as a @code{}. The @var{expression} must be a string. This function can be useful when implementing a new command (@pxref{Commands In Guile}), as it provides a way to parse the command's arguments as an expression. It is also is useful when computing values. For example, it is the only way to get the value of a convenience variable (@pxref{Convenience Vars}) as a @code{}. @end deffn @node Guile Configuration @subsubsection Guile Configuration @cindex guile configuration @value{GDBN} provides these Scheme functions to access various configuration parameters. @deffn {Scheme Procedure} data-directory Return a string containing @value{GDBN}'s data directory. This directory contains @value{GDBN}'s ancillary files. @end deffn @deffn {Scheme Procedure} guile-data-directory Return a string containing @value{GDBN}'s Guile data directory. This directory contains the Guile modules provided by @value{GDBN}. @end deffn @deffn {Scheme Procedure} gdb-version Return a string containing the @value{GDBN} version. @end deffn @deffn {Scheme Procedure} host-config Return a string containing the host configuration. This is the string passed to @code{--host} when @value{GDBN} was configured. @end deffn @deffn {Scheme Procedure} target-config Return a string containing the target configuration. This is the string passed to @code{--target} when @value{GDBN} was configured. @end deffn @node GDB Scheme Data Types @subsubsection GDB Scheme Data Types @cindex gdb objects The values exposed by @value{GDBN} to Guile are known as @dfn{@value{GDBN} objects}. There are several kinds of @value{GDBN} object, and each is disjoint from all other types known to Guile. @deffn {Scheme Procedure} gdb-object-kind object Return the kind of the @value{GDBN} object, e.g., @code{}, as a symbol. @end deffn @value{GDBN} defines the following object types: @table @code @item @xref{Architectures In Guile}. @item @xref{Blocks In Guile}. @item @xref{Blocks In Guile}. @item @xref{Breakpoints In Guile}. @item @xref{Commands In Guile}. @item @xref{Guile Exception Handling}. @item @xref{Frames In Guile}. @item @xref{Iterators In Guile}. @item @xref{Lazy Strings In Guile}. @item @xref{Objfiles In Guile}. @item @xref{Parameters In Guile}. @item @xref{Guile Pretty Printing API}. @item @xref{Guile Pretty Printing API}. @item @xref{Progspaces In Guile}. @item @xref{Symbols In Guile}. @item @xref{Symbol Tables In Guile}. @item @xref{Symbol Tables In Guile}. @item @xref{Types In Guile}. @item @xref{Types In Guile}. @item @xref{Values From Inferior In Guile}. @end table The following @value{GDBN} objects are managed internally so that the Scheme function @code{eq?} may be applied to them. @table @code @item @item @item @item @item @item @item @item @item @end table @node Guile Exception Handling @subsubsection Guile Exception Handling @cindex guile exceptions @cindex exceptions, guile @kindex set guile print-stack When executing the @code{guile} command, Guile exceptions uncaught within the Guile code are translated to calls to the @value{GDBN} error-reporting mechanism. If the command that called @code{guile} does not handle the error, @value{GDBN} will terminate it and report the error according to the setting of the @code{guile print-stack} parameter. The @code{guile print-stack} parameter has three settings: @table @code @item none Nothing is printed. @item message An error message is printed containing the Guile exception name, the associated value, and the Guile call stack backtrace at the point where the exception was raised. Example: @smallexample (@value{GDBP}) guile (display foo) ERROR: In procedure memoize-variable-access!: ERROR: Unbound variable: foo Error while executing Scheme code. @end smallexample @item full In addition to an error message a full backtrace is printed. @smallexample (@value{GDBP}) set guile print-stack full (@value{GDBP}) guile (display foo) Guile Backtrace: In ice-9/boot-9.scm: 157: 10 [catch #t # ...] In unknown file: ?: 9 [apply-smob/1 #] In ice-9/boot-9.scm: 157: 8 [catch #t # ...] In unknown file: ?: 7 [apply-smob/1 #] ?: 6 [call-with-input-string "(display foo)" ...] In ice-9/boot-9.scm: 2320: 5 [save-module-excursion #] In ice-9/eval-string.scm: 44: 4 [read-and-eval # #:lang ...] 37: 3 [lp (display foo)] In ice-9/eval.scm: 387: 2 [eval # ()] 393: 1 [eval # ()] In unknown file: ?: 0 [memoize-variable-access! # ...] ERROR: In procedure memoize-variable-access!: ERROR: Unbound variable: foo Error while executing Scheme code. @end smallexample @end table @value{GDBN} errors that happen in @value{GDBN} commands invoked by Guile code are converted to Guile exceptions. The type of the Guile exception depends on the error. Guile procedures provided by @value{GDBN} can throw the standard Guile exceptions like @code{wrong-type-arg} and @code{out-of-range}. User interrupt (via @kbd{C-c} or by typing @kbd{q} at a pagination prompt) is translated to a Guile @code{signal} exception with value @code{SIGINT}. @value{GDBN} Guile procedures can also throw these exceptions: @vtable @code @item gdb:error This exception is a catch-all for errors generated from within @value{GDBN}. @item gdb:invalid-object This exception is thrown when accessing Guile objects that wrap underlying @value{GDBN} objects have become invalid. For example, a @code{} object becomes invalid if the user deletes it from the command line. The object still exists in Guile, but the object it represents is gone. Further operations on this breakpoint will throw this exception. @item gdb:memory-error This exception is thrown when an operation tried to access invalid memory in the inferior. @item gdb:pp-type-error This exception is thrown when a Guile pretty-printer passes a bad object to @value{GDBN}. @end vtable The following exception-related procedures are provided by the @code{(gdb)} module. @deffn {Scheme Procedure} make-exception key args Return a @code{} object given by its @var{key} and @var{args}, which are the standard Guile parameters of an exception. See the Guile documentation for more information (@pxref{Exceptions,,, guile, GNU Guile Reference Manual}). @end deffn @deffn {Scheme Procedure} exception? object Return @code{#t} if @var{object} is a @code{} object. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} exception-key exception Return the @var{args} field of a @code{} object. @end deffn @deffn {Scheme Procedure} exception-args exception Return the @var{args} field of a @code{} object. @end deffn @node Values From Inferior In Guile @subsubsection Values From Inferior In Guile @cindex values from inferior, in guile @cindex guile, working with values from inferior @tindex @code{} @value{GDBN} provides values it obtains from the inferior program in an object of type @code{}. @value{GDBN} uses this object for its internal bookkeeping of the inferior's values, and for fetching values when necessary. @value{GDBN} does not memoize @code{} objects. @code{make-value} always returns a fresh object. @smallexample (gdb) guile (eq? (make-value 1) (make-value 1)) $1 = #f (gdb) guile (equal? (make-value 1) (make-value 1)) $1 = #t @end smallexample A @code{} that represents a function can be executed via inferior function call with @code{value-call}. Any arguments provided to the call must match the function's prototype, and must be provided in the order specified by that prototype. For example, @code{some-val} is a @code{} instance representing a function that takes two integers as arguments. To execute this function, call it like so: @smallexample (define result (value-call some-val 10 20)) @end smallexample Any values returned from a function call are @code{} objects. Note: Unlike Python scripting in @value{GDBN}, inferior values that are simple scalars cannot be used directly in Scheme expressions that are valid for the value's data type. For example, @code{(+ (parse-and-eval "int_variable") 2)} does not work. And inferior values that are structures or instances of some class cannot be accessed using any special syntax, instead @code{value-field} must be used. The following value-related procedures are provided by the @code{(gdb)} module. @deffn {Scheme Procedure} value? object Return @code{#t} if @var{object} is a @code{} object. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} make-value value @r{[}#:type type@r{]} Many Scheme values can be converted directly to a @code{} with this procedure. If @var{type} is specified, the result is a value of this type, and if @var{value} can't be represented with this type an exception is thrown. Otherwise the type of the result is determined from @var{value} as described below. @xref{Architectures In Guile}, for a list of the builtin types for an architecture. Here's how Scheme values are converted when @var{type} argument to @code{make-value} is not specified: @table @asis @item Scheme boolean A Scheme boolean is converted the boolean type for the current language. @item Scheme integer A Scheme integer is converted to the first of a C @code{int}, @code{unsigned int}, @code{long}, @code{unsigned long}, @code{long long} or @code{unsigned long long} type for the current architecture that can represent the value. If the Scheme integer cannot be represented as a target integer an @code{out-of-range} exception is thrown. @item Scheme real A Scheme real is converted to the C @code{double} type for the current architecture. @item Scheme string A Scheme string is converted to a string in the current target language using the current target encoding. Characters that cannot be represented in the current target encoding are replaced with the corresponding escape sequence. This is Guile's @code{SCM_FAILED_CONVERSION_ESCAPE_SEQUENCE} conversion strategy (@pxref{Strings,,, guile, GNU Guile Reference Manual}). Passing @var{type} is not supported in this case, if it is provided a @code{wrong-type-arg} exception is thrown. @item @code{} If @var{value} is a @code{} object (@pxref{Lazy Strings In Guile}), then the @code{lazy-string->value} procedure is called, and its result is used. Passing @var{type} is not supported in this case, if it is provided a @code{wrong-type-arg} exception is thrown. @item Scheme bytevector If @var{value} is a Scheme bytevector and @var{type} is provided, @var{value} must be the same size, in bytes, of values of type @var{type}, and the result is essentially created by using @code{memcpy}. If @var{value} is a Scheme bytevector and @var{type} is not provided, the result is an array of type @code{uint8} of the same length. @end table @end deffn @cindex optimized out value in guile @deffn {Scheme Procedure} value-optimized-out? value Return @code{#t} if the compiler optimized out @var{value}, thus it is not available for fetching from the inferior. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} value-address value If @var{value} is addressable, returns a @code{} object representing the address. Otherwise, @code{#f} is returned. @end deffn @deffn {Scheme Procedure} value-type value Return the type of @var{value} as a @code{} object (@pxref{Types In Guile}). @end deffn @deffn {Scheme Procedure} value-dynamic-type value Return the dynamic type of @var{value}. This uses C@t{++} run-time type information (@acronym{RTTI}) to determine the dynamic type of the value. If the value is of class type, it will return the class in which the value is embedded, if any. If the value is of pointer or reference to a class type, it will compute the dynamic type of the referenced object, and return a pointer or reference to that type, respectively. In all other cases, it will return the value's static type. Note that this feature will only work when debugging a C@t{++} program that includes @acronym{RTTI} for the object in question. Otherwise, it will just return the static type of the value as in @kbd{ptype foo}. @xref{Symbols, ptype}. @end deffn @deffn {Scheme Procedure} value-cast value type Return a new instance of @code{} that is the result of casting @var{value} to the type described by @var{type}, which must be a @code{} object. If the cast cannot be performed for some reason, this method throws an exception. @end deffn @deffn {Scheme Procedure} value-dynamic-cast value type Like @code{value-cast}, but works as if the C@t{++} @code{dynamic_cast} operator were used. Consult a C@t{++} reference for details. @end deffn @deffn {Scheme Procedure} value-reinterpret-cast value type Like @code{value-cast}, but works as if the C@t{++} @code{reinterpret_cast} operator were used. Consult a C@t{++} reference for details. @end deffn @deffn {Scheme Procedure} value-dereference value For pointer data types, this method returns a new @code{} object whose contents is the object pointed to by @var{value}. For example, if @code{foo} is a C pointer to an @code{int}, declared in your C program as @smallexample int *foo; @end smallexample @noindent then you can use the corresponding @code{} to access what @code{foo} points to like this: @smallexample (define bar (value-dereference foo)) @end smallexample The result @code{bar} will be a @code{} object holding the value pointed to by @code{foo}. A similar function @code{value-referenced-value} exists which also returns @code{} objects corresponding to the values pointed to by pointer values (and additionally, values referenced by reference values). However, the behavior of @code{value-dereference} differs from @code{value-referenced-value} by the fact that the behavior of @code{value-dereference} is identical to applying the C unary operator @code{*} on a given value. For example, consider a reference to a pointer @code{ptrref}, declared in your C@t{++} program as @smallexample typedef int *intptr; ... int val = 10; intptr ptr = &val; intptr &ptrref = ptr; @end smallexample Though @code{ptrref} is a reference value, one can apply the method @code{value-dereference} to the @code{} object corresponding to it and obtain a @code{} which is identical to that corresponding to @code{val}. However, if you apply the method @code{value-referenced-value}, the result would be a @code{} object identical to that corresponding to @code{ptr}. @smallexample (define scm-ptrref (parse-and-eval "ptrref")) (define scm-val (value-dereference scm-ptrref)) (define scm-ptr (value-referenced-value scm-ptrref)) @end smallexample The @code{} object @code{scm-val} is identical to that corresponding to @code{val}, and @code{scm-ptr} is identical to that corresponding to @code{ptr}. In general, @code{value-dereference} can be applied whenever the C unary operator @code{*} can be applied to the corresponding C value. For those cases where applying both @code{value-dereference} and @code{value-referenced-value} is allowed, the results obtained need not be identical (as we have seen in the above example). The results are however identical when applied on @code{} objects corresponding to pointers (@code{} objects with type code @code{TYPE_CODE_PTR}) in a C/C@t{++} program. @end deffn @deffn {Scheme Procedure} value-referenced-value value For pointer or reference data types, this method returns a new @code{} object corresponding to the value referenced by the pointer/reference value. For pointer data types, @code{value-dereference} and @code{value-referenced-value} produce identical results. The difference between these methods is that @code{value-dereference} cannot get the values referenced by reference values. For example, consider a reference to an @code{int}, declared in your C@t{++} program as @smallexample int val = 10; int &ref = val; @end smallexample @noindent then applying @code{value-dereference} to the @code{} object corresponding to @code{ref} will result in an error, while applying @code{value-referenced-value} will result in a @code{} object identical to that corresponding to @code{val}. @smallexample (define scm-ref (parse-and-eval "ref")) (define err-ref (value-dereference scm-ref)) ;; error (define scm-val (value-referenced-value scm-ref)) ;; ok @end smallexample The @code{} object @code{scm-val} is identical to that corresponding to @code{val}. @end deffn @deffn {Scheme Procedure} value-reference-value value Return a new @code{} object which is a reference to the value encapsulated by @code{} object @var{value}. @end deffn @deffn {Scheme Procedure} value-rvalue-reference-value value Return a new @code{} object which is an rvalue reference to the value encapsulated by @code{} object @var{value}. @end deffn @deffn {Scheme Procedure} value-const-value value Return a new @code{} object which is a @samp{const} version of @code{} object @var{value}. @end deffn @deffn {Scheme Procedure} value-field value field-name Return field @var{field-name} from @code{} object @var{value}. @end deffn @deffn {Scheme Procedure} value-subscript value index Return the value of array @var{value} at index @var{index}. The @var{value} argument must be a subscriptable @code{} object. @end deffn @deffn {Scheme Procedure} value-call value arg-list Perform an inferior function call, taking @var{value} as a pointer to the function to call. Each element of list @var{arg-list} must be a object or an object that can be converted to a value. The result is the value returned by the function. @end deffn @deffn {Scheme Procedure} value->bool value Return the Scheme boolean representing @code{} @var{value}. The value must be ``integer like''. Pointers are ok. @end deffn @deffn {Scheme Procedure} value->integer Return the Scheme integer representing @code{} @var{value}. The value must be ``integer like''. Pointers are ok. @end deffn @deffn {Scheme Procedure} value->real Return the Scheme real number representing @code{} @var{value}. The value must be a number. @end deffn @deffn {Scheme Procedure} value->bytevector Return a Scheme bytevector with the raw contents of @code{} @var{value}. No transformation, endian or otherwise, is performed. @end deffn @c TODO: line length @deffn {Scheme Procedure} value->string value @r{[}#:encoding encoding@r{]} @r{[}#:errors errors@r{]} @r{[}#:length length@r{]} If @var{value>} represents a string, then this method converts the contents to a Guile string. Otherwise, this method will throw an exception. Values are interpreted as strings according to the rules of the current language. If the optional length argument is given, the string will be converted to that length, and will include any embedded zeroes that the string may contain. Otherwise, for languages where the string is zero-terminated, the entire string will be converted. For example, in C-like languages, a value is a string if it is a pointer to or an array of characters or ints of type @code{wchar_t}, @code{char16_t}, or @code{char32_t}. If the optional @var{encoding} argument is given, it must be a string naming the encoding of the string in the @code{}, such as @code{"ascii"}, @code{"iso-8859-6"} or @code{"utf-8"}. It accepts the same encodings as the corresponding argument to Guile's @code{scm_from_stringn} function, and the Guile codec machinery will be used to convert the string. If @var{encoding} is not given, or if @var{encoding} is the empty string, then either the @code{target-charset} (@pxref{Character Sets}) will be used, or a language-specific encoding will be used, if the current language is able to supply one. The optional @var{errors} argument is one of @code{#f}, @code{error} or @code{substitute}. @code{error} and @code{substitute} must be symbols. If @var{errors} is not specified, or if its value is @code{#f}, then the default conversion strategy is used, which is set with the Scheme function @code{set-port-conversion-strategy!}. If the value is @code{'error} then an exception is thrown if there is any conversion error. If the value is @code{'substitute} then any conversion error is replaced with question marks. @xref{Strings,,, guile, GNU Guile Reference Manual}. If the optional @var{length} argument is given, the string will be fetched and converted to the given length. The length must be a Scheme integer and not a @code{} integer. @end deffn @c TODO: line length @deffn {Scheme Procedure} value->lazy-string value @r{[}#:encoding encoding@r{]} @r{[}#:length length@r{]} If this @code{} represents a string, then this method converts @var{value} to a @code{} integer. @end deffn @deffn {Scheme Procedure} value-lazy? value Return @code{#t} if @var{value} has not yet been fetched from the inferior. Otherwise return @code{#f}. @value{GDBN} does not fetch values until necessary, for efficiency. For example: @smallexample (define myval (parse-and-eval "somevar")) @end smallexample The value of @code{somevar} is not fetched at this time. It will be fetched when the value is needed, or when the @code{fetch-lazy} procedure is invoked. @end deffn @deffn {Scheme Procedure} make-lazy-value type address Return a @code{} that will be lazily fetched from the target. The object of type @code{} whose value to fetch is specified by its @var{type} and its target memory @var{address}, which is a Scheme integer. @end deffn @deffn {Scheme Procedure} value-fetch-lazy! value If @var{value} is a lazy value (@code{(value-lazy? value)} is @code{#t}), then the value is fetched from the inferior. Any errors that occur in the process will produce a Guile exception. If @var{value} is not a lazy value, this method has no effect. The result of this function is unspecified. @end deffn @deffn {Scheme Procedure} value-print value Return the string representation (print form) of @code{} @var{value}. @end deffn @node Arithmetic In Guile @subsubsection Arithmetic In Guile The @code{(gdb)} module provides several functions for performing arithmetic on @code{} objects. The arithmetic is performed as if it were done by the target, and therefore has target semantics which are not necessarily those of Scheme. For example operations work with a fixed precision, not the arbitrary precision of Scheme. Wherever a function takes an integer or pointer as an operand, @value{GDBN} will convert appropriate Scheme values to perform the operation. @deffn {Scheme Procedure} value-add a b @end deffn @deffn {Scheme Procedure} value-sub a b @end deffn @deffn {Scheme Procedure} value-mul a b @end deffn @deffn {Scheme Procedure} value-div a b @end deffn @deffn {Scheme Procedure} value-rem a b @end deffn @deffn {Scheme Procedure} value-mod a b @end deffn @deffn {Scheme Procedure} value-pow a b @end deffn @deffn {Scheme Procedure} value-not a @end deffn @deffn {Scheme Procedure} value-neg a @end deffn @deffn {Scheme Procedure} value-pos a @end deffn @deffn {Scheme Procedure} value-abs a @end deffn @deffn {Scheme Procedure} value-lsh a b @end deffn @deffn {Scheme Procedure} value-rsh a b @end deffn @deffn {Scheme Procedure} value-min a b @end deffn @deffn {Scheme Procedure} value-max a b @end deffn @deffn {Scheme Procedure} value-lognot a @end deffn @deffn {Scheme Procedure} value-logand a b @end deffn @deffn {Scheme Procedure} value-logior a b @end deffn @deffn {Scheme Procedure} value-logxor a b @end deffn @deffn {Scheme Procedure} value=? a b @end deffn @deffn {Scheme Procedure} value? a b @end deffn @deffn {Scheme Procedure} value>=? a b @end deffn Scheme does not provide a @code{not-equal} function, and thus Guile support in @value{GDBN} does not either. @node Types In Guile @subsubsection Types In Guile @cindex types in guile @cindex guile, working with types @tindex @value{GDBN} represents types from the inferior in objects of type @code{}. The following type-related procedures are provided by the @code{(gdb)} module. @deffn {Scheme Procedure} type? object Return @code{#t} if @var{object} is an object of type @code{}. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} lookup-type name @r{[}#:block block@r{]} This function looks up a type by its @var{name}, which must be a string. If @var{block} is given, it is an object of type @code{}, and @var{name} is looked up in that scope. Otherwise, it is searched for globally. Ordinarily, this function will return an instance of @code{}. If the named type cannot be found, it will throw an exception. @end deffn @deffn {Scheme Procedure} type-code type Return the type code of @var{type}. The type code will be one of the @code{TYPE_CODE_} constants defined below. @end deffn @deffn {Scheme Procedure} type-tag type Return the tag name of @var{type}. The tag name is the name after @code{struct}, @code{union}, or @code{enum} in C and C@t{++}; not all languages have this concept. If this type has no tag name, then @code{#f} is returned. @end deffn @deffn {Scheme Procedure} type-name type Return the name of @var{type}. If this type has no name, then @code{#f} is returned. @end deffn @deffn {Scheme Procedure} type-print-name type Return the print name of @var{type}. This returns something even for anonymous types. For example, for an anonymous C struct @code{"struct @{...@}"} is returned. @end deffn @deffn {Scheme Procedure} type-sizeof type Return the size of this type, in target @code{char} units. Usually, a target's @code{char} type will be an 8-bit byte. However, on some unusual platforms, this type may have a different size. @end deffn @deffn {Scheme Procedure} type-strip-typedefs type Return a new @code{} that represents the real type of @var{type}, after removing all layers of typedefs. @end deffn @deffn {Scheme Procedure} type-array type n1 @r{[}n2@r{]} Return a new @code{} object which represents an array of this type. If one argument is given, it is the inclusive upper bound of the array; in this case the lower bound is zero. If two arguments are given, the first argument is the lower bound of the array, and the second argument is the upper bound of the array. An array's length must not be negative, but the bounds can be. @end deffn @deffn {Scheme Procedure} type-vector type n1 @r{[}n2@r{]} Return a new @code{} object which represents a vector of this type. If one argument is given, it is the inclusive upper bound of the vector; in this case the lower bound is zero. If two arguments are given, the first argument is the lower bound of the vector, and the second argument is the upper bound of the vector. A vector's length must not be negative, but the bounds can be. The difference between an @code{array} and a @code{vector} is that arrays behave like in C: when used in expressions they decay to a pointer to the first element whereas vectors are treated as first class values. @end deffn @deffn {Scheme Procedure} type-pointer type Return a new @code{} object which represents a pointer to @var{type}. @end deffn @deffn {Scheme Procedure} type-range type Return a list of two elements: the low bound and high bound of @var{type}. If @var{type} does not have a range, an exception is thrown. @end deffn @deffn {Scheme Procedure} type-reference type Return a new @code{} object which represents a reference to @var{type}. @end deffn @deffn {Scheme Procedure} type-target type Return a new @code{} object which represents the target type of @var{type}. For a pointer type, the target type is the type of the pointed-to object. For an array type (meaning C-like arrays), the target type is the type of the elements of the array. For a function or method type, the target type is the type of the return value. For a complex type, the target type is the type of the elements. For a typedef, the target type is the aliased type. If the type does not have a target, this method will throw an exception. @end deffn @deffn {Scheme Procedure} type-const type Return a new @code{} object which represents a @code{const}-qualified variant of @var{type}. @end deffn @deffn {Scheme Procedure} type-volatile type Return a new @code{} object which represents a @code{volatile}-qualified variant of @var{type}. @end deffn @deffn {Scheme Procedure} type-unqualified type Return a new @code{} object which represents an unqualified variant of @var{type}. That is, the result is neither @code{const} nor @code{volatile}. @end deffn @deffn {Scheme Procedure} type-num-fields Return the number of fields of @code{} @var{type}. @end deffn @deffn {Scheme Procedure} type-fields type Return the fields of @var{type} as a list. For structure and union types, @code{fields} has the usual meaning. Range types have two fields, the minimum and maximum values. Enum types have one field per enum constant. Function and method types have one field per parameter. The base types of C@t{++} classes are also represented as fields. If the type has no fields, or does not fit into one of these categories, an empty list will be returned. @xref{Fields of a type in Guile}. @end deffn @deffn {Scheme Procedure} make-field-iterator type Return the fields of @var{type} as a object. @xref{Iterators In Guile}. @end deffn @deffn {Scheme Procedure} type-field type field-name Return field named @var{field-name} in @var{type}. The result is an object of type @code{}. @xref{Fields of a type in Guile}. If the type does not have fields, or @var{field-name} is not a field of @var{type}, an exception is thrown. For example, if @code{some-type} is a @code{} instance holding a structure type, you can access its @code{foo} field with: @smallexample (define bar (type-field some-type "foo")) @end smallexample @code{bar} will be a @code{} object. @end deffn @deffn {Scheme Procedure} type-has-field? type name Return @code{#t} if @code{} @var{type} has field named @var{name}. Otherwise return @code{#f}. @end deffn Each type has a code, which indicates what category this type falls into. The available type categories are represented by constants defined in the @code{(gdb)} module: @vtable @code @item TYPE_CODE_PTR The type is a pointer. @item TYPE_CODE_ARRAY The type is an array. @item TYPE_CODE_STRUCT The type is a structure. @item TYPE_CODE_UNION The type is a union. @item TYPE_CODE_ENUM The type is an enum. @item TYPE_CODE_FLAGS A bit flags type, used for things such as status registers. @item TYPE_CODE_FUNC The type is a function. @item TYPE_CODE_INT The type is an integer type. @item TYPE_CODE_FLT A floating point type. @item TYPE_CODE_VOID The special type @code{void}. @item TYPE_CODE_SET A Pascal set type. @item TYPE_CODE_RANGE A range type, that is, an integer type with bounds. @item TYPE_CODE_STRING A string type. Note that this is only used for certain languages with language-defined string types; C strings are not represented this way. @item TYPE_CODE_BITSTRING A string of bits. It is deprecated. @item TYPE_CODE_ERROR An unknown or erroneous type. @item TYPE_CODE_METHOD A method type, as found in C@t{++}. @item TYPE_CODE_METHODPTR A pointer-to-member-function. @item TYPE_CODE_MEMBERPTR A pointer-to-member. @item TYPE_CODE_REF A reference type. @item TYPE_CODE_RVALUE_REF A C@t{++}11 rvalue reference type. @item TYPE_CODE_CHAR A character type. @item TYPE_CODE_BOOL A boolean type. @item TYPE_CODE_COMPLEX A complex float type. @item TYPE_CODE_TYPEDEF A typedef to some other type. @item TYPE_CODE_NAMESPACE A C@t{++} namespace. @item TYPE_CODE_DECFLOAT A decimal floating point type. @item TYPE_CODE_INTERNAL_FUNCTION A function internal to @value{GDBN}. This is the type used to represent convenience functions (@pxref{Convenience Funs}). @end vtable Further support for types is provided in the @code{(gdb types)} Guile module (@pxref{Guile Types Module}). @anchor{Fields of a type in Guile} Each field is represented as an object of type @code{}. The following field-related procedures are provided by the @code{(gdb)} module: @deffn {Scheme Procedure} field? object Return @code{#t} if @var{object} is an object of type @code{}. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} field-name field Return the name of the field, or @code{#f} for anonymous fields. @end deffn @deffn {Scheme Procedure} field-type field Return the type of the field. This is usually an instance of @code{}, but it can be @code{#f} in some situations. @end deffn @deffn {Scheme Procedure} field-enumval field Return the enum value represented by @code{} @var{field}. @end deffn @deffn {Scheme Procedure} field-bitpos field Return the bit position of @code{} @var{field}. This attribute is not available for @code{static} fields (as in C@t{++}). @end deffn @deffn {Scheme Procedure} field-bitsize field If the field is packed, or is a bitfield, return the size of @code{} @var{field} in bits. Otherwise, zero is returned; in which case the field's size is given by its type. @end deffn @deffn {Scheme Procedure} field-artificial? field Return @code{#t} if the field is artificial, usually meaning that it was provided by the compiler and not the user. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} field-base-class? field Return @code{#t} if the field represents a base class of a C@t{++} structure. Otherwise return @code{#f}. @end deffn @node Guile Pretty Printing API @subsubsection Guile Pretty Printing API @cindex guile pretty printing api An example output is provided (@pxref{Pretty Printing}). A pretty-printer is represented by an object of type . Pretty-printer objects are created with @code{make-pretty-printer}. The following pretty-printer-related procedures are provided by the @code{(gdb)} module: @deffn {Scheme Procedure} make-pretty-printer name lookup-function Return a @code{} object named @var{name}. @var{lookup-function} is a function of one parameter: the value to be printed. If the value is handled by this pretty-printer, then @var{lookup-function} returns an object of type to perform the actual pretty-printing. Otherwise @var{lookup-function} returns @code{#f}. @end deffn @deffn {Scheme Procedure} pretty-printer? object Return @code{#t} if @var{object} is a @code{} object. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} pretty-printer-enabled? pretty-printer Return @code{#t} if @var{pretty-printer} is enabled. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} set-pretty-printer-enabled! pretty-printer flag Set the enabled flag of @var{pretty-printer} to @var{flag}. The value returned is unspecified. @end deffn @deffn {Scheme Procedure} pretty-printers Return the list of global pretty-printers. @end deffn @deffn {Scheme Procedure} set-pretty-printers! pretty-printers Set the list of global pretty-printers to @var{pretty-printers}. The value returned is unspecified. @end deffn @deffn {Scheme Procedure} make-pretty-printer-worker display-hint to-string children Return an object of type @code{}. This function takes three parameters: @table @samp @item display-hint @var{display-hint} provides a hint to @value{GDBN} or @value{GDBN} front end via MI to change the formatting of the value being printed. The value must be a string or @code{#f} (meaning there is no hint). Several values for @var{display-hint} are predefined by @value{GDBN}: @table @samp @item array Indicate that the object being printed is ``array-like''. The CLI uses this to respect parameters such as @code{set print elements} and @code{set print array}. @item map Indicate that the object being printed is ``map-like'', and that the children of this value can be assumed to alternate between keys and values. @item string Indicate that the object being printed is ``string-like''. If the printer's @code{to-string} function returns a Guile string of some kind, then @value{GDBN} will call its internal language-specific string-printing function to format the string. For the CLI this means adding quotation marks, possibly escaping some characters, respecting @code{set print elements}, and the like. @end table @item to-string @var{to-string} is either a function of one parameter, the @code{} object, or @code{#f}. When printing from the CLI, if the @code{to-string} method exists, then @value{GDBN} will prepend its result to the values returned by @code{children}. Exactly how this formatting is done is dependent on the display hint, and may change as more hints are added. Also, depending on the print settings (@pxref{Print Settings}), the CLI may print just the result of @code{to-string} in a stack trace, omitting the result of @code{children}. If this method returns a string, it is printed verbatim. Otherwise, if this method returns an instance of @code{}, then @value{GDBN} prints this value. This may result in a call to another pretty-printer. If instead the method returns a Guile value which is convertible to a @code{}, then @value{GDBN} performs the conversion and prints the resulting value. Again, this may result in a call to another pretty-printer. Guile scalars (integers, floats, and booleans) and strings are convertible to @code{}; other types are not. Finally, if this method returns @code{#f} then no further operations are peformed in this method and nothing is printed. If the result is not one of these types, an exception is raised. @var{to-string} may also be @code{#f} in which case it is left to @var{children} to print the value. @item children @var{children} is either a function of one parameter, the @code{} object, or @code{#f}. @value{GDBN} will call this function on a pretty-printer to compute the children of the pretty-printer's value. This function must return a object. Each item returned by the iterator must be a tuple holding two elements. The first element is the ``name'' of the child; the second element is the child's value. The value can be any Guile object which is convertible to a @value{GDBN} value. If @var{children} is @code{#f}, @value{GDBN} will act as though the value has no children. Children may be hidden from display based on the value of @samp{set print max-depth} (@pxref{Print Settings}). @end table @end deffn @value{GDBN} provides a function which can be used to look up the default pretty-printer for a @code{}: @deffn {Scheme Procedure} default-visualizer value This function takes a @code{} object as an argument. If a pretty-printer for this value exists, then it is returned. If no such printer exists, then this returns @code{#f}. @end deffn @node Selecting Guile Pretty-Printers @subsubsection Selecting Guile Pretty-Printers @cindex selecting guile pretty-printers There are three sets of pretty-printers that @value{GDBN} searches: @itemize @bullet @item Per-objfile list of pretty-printers (@pxref{Objfiles In Guile}). @item Per-progspace list of pretty-printers (@pxref{Progspaces In Guile}). @item The global list of pretty-printers (@pxref{Guile Pretty Printing API}). These printers are available when debugging any inferior. @end itemize Pretty-printer lookup is done by passing the value to be printed to the lookup function of each enabled object in turn. Lookup stops when a lookup function returns a non-@code{#f} value or when the list is exhausted. Lookup functions must return either a @code{} object or @code{#f}. Otherwise an exception is thrown. @value{GDBN} first checks the result of @code{objfile-pretty-printers} of each @code{} in the current program space and iteratively calls each enabled lookup function in the list for that @code{} until a non-@code{#f} object is returned. If no pretty-printer is found in the objfile lists, @value{GDBN} then searches the result of @code{progspace-pretty-printers} of the current program space, calling each enabled function until a non-@code{#f} object is returned. After these lists have been exhausted, it tries the global pretty-printers list, obtained with @code{pretty-printers}, again calling each enabled function until a non-@code{#f} object is returned. The order in which the objfiles are searched is not specified. For a given list, functions are always invoked from the head of the list, and iterated over sequentially until the end of the list, or a @code{} object is returned. For various reasons a pretty-printer may not work. For example, the underlying data structure may have changed and the pretty-printer is out of date. The consequences of a broken pretty-printer are severe enough that @value{GDBN} provides support for enabling and disabling individual printers. For example, if @code{print frame-arguments} is on, a backtrace can become highly illegible if any argument is printed with a broken printer. Pretty-printers are enabled and disabled from Scheme by calling @code{set-pretty-printer-enabled!}. @xref{Guile Pretty Printing API}. @node Writing a Guile Pretty-Printer @subsubsection Writing a Guile Pretty-Printer @cindex writing a Guile pretty-printer A pretty-printer consists of two basic parts: a lookup function to determine if the type is supported, and the printer itself. Here is an example showing how a @code{std::string} printer might be written. @xref{Guile Pretty Printing API}, for details. @smallexample (define (make-my-string-printer value) "Print a my::string string" (make-pretty-printer-worker "string" (lambda (printer) (value-field value "_data")) #f)) @end smallexample And here is an example showing how a lookup function for the printer example above might be written. @smallexample (define (str-lookup-function pretty-printer value) (let ((tag (type-tag (value-type value)))) (and tag (string-prefix? "std::string<" tag) (make-my-string-printer value)))) @end smallexample Then to register this printer in the global printer list: @smallexample (append-pretty-printer! (make-pretty-printer "my-string" str-lookup-function)) @end smallexample The example lookup function extracts the value's type, and attempts to match it to a type that it can pretty-print. If it is a type the printer can pretty-print, it will return a object. If not, it returns @code{#f}. We recommend that you put your core pretty-printers into a Guile package. If your pretty-printers are for use with a library, we further recommend embedding a version number into the package name. This practice will enable @value{GDBN} to load multiple versions of your pretty-printers at the same time, because they will have different names. You should write auto-loaded code (@pxref{Guile Auto-loading}) such that it can be evaluated multiple times without changing its meaning. An ideal auto-load file will consist solely of @code{import}s of your printer modules, followed by a call to a register pretty-printers with the current objfile. Taken as a whole, this approach will scale nicely to multiple inferiors, each potentially using a different library version. Embedding a version number in the Guile package name will ensure that @value{GDBN} is able to load both sets of printers simultaneously. Then, because the search for pretty-printers is done by objfile, and because your auto-loaded code took care to register your library's printers with a specific objfile, @value{GDBN} will find the correct printers for the specific version of the library used by each inferior. To continue the @code{my::string} example, this code might appear in @code{(my-project my-library v1)}: @smallexample (use-modules (gdb)) (define (register-printers objfile) (append-objfile-pretty-printer! (make-pretty-printer "my-string" str-lookup-function))) @end smallexample @noindent And then the corresponding contents of the auto-load file would be: @smallexample (use-modules (gdb) (my-project my-library v1)) (register-printers (current-objfile)) @end smallexample The previous example illustrates a basic pretty-printer. There are a few things that can be improved on. The printer only handles one type, whereas a library typically has several types. One could install a lookup function for each desired type in the library, but one could also have a single lookup function recognize several types. The latter is the conventional way this is handled. If a pretty-printer can handle multiple data types, then its @dfn{subprinters} are the printers for the individual data types. The @code{(gdb printing)} module provides a formal way of solving this problem (@pxref{Guile Printing Module}). Here is another example that handles multiple types. These are the types we are going to pretty-print: @smallexample struct foo @{ int a, b; @}; struct bar @{ struct foo x, y; @}; @end smallexample Here are the printers: @smallexample (define (make-foo-printer value) "Print a foo object" (make-pretty-printer-worker "foo" (lambda (printer) (format #f "a=<~a> b=<~a>" (value-field value "a") (value-field value "a"))) #f)) (define (make-bar-printer value) "Print a bar object" (make-pretty-printer-worker "foo" (lambda (printer) (format #f "x=<~a> y=<~a>" (value-field value "x") (value-field value "y"))) #f)) @end smallexample This example doesn't need a lookup function, that is handled by the @code{(gdb printing)} module. Instead a function is provided to build up the object that handles the lookup. @smallexample (use-modules (gdb printing)) (define (build-pretty-printer) (let ((pp (make-pretty-printer-collection "my-library"))) (pp-collection-add-tag-printer "foo" make-foo-printer) (pp-collection-add-tag-printer "bar" make-bar-printer) pp)) @end smallexample And here is the autoload support: @smallexample (use-modules (gdb) (my-library)) (append-objfile-pretty-printer! (current-objfile) (build-pretty-printer)) @end smallexample Finally, when this printer is loaded into @value{GDBN}, here is the corresponding output of @samp{info pretty-printer}: @smallexample (gdb) info pretty-printer my_library.so: my-library foo bar @end smallexample @node Commands In Guile @subsubsection Commands In Guile @cindex commands in guile @cindex guile commands You can implement new @value{GDBN} CLI commands in Guile. A CLI command object is created with the @code{make-command} Guile function, and added to @value{GDBN} with the @code{register-command!} Guile function. This two-step approach is taken to separate out the side-effect of adding the command to @value{GDBN} from @code{make-command}. There is no support for multi-line commands, that is commands that consist of multiple lines and are terminated with @code{end}. @c TODO: line length @deffn {Scheme Procedure} (make-command name @r{[}#:invoke invoke{]} @r{[}#:command-class command-class@r{]} @r{[}#:completer-class completer{]} @r{[}#:prefix? prefix@r{]} @r{[}#:doc doc-string{]}) The argument @var{name} is the name of the command. If @var{name} consists of multiple words, then the initial words are looked for as prefix commands. In this case, if one of the prefix commands does not exist, an exception is raised. The result is the @code{} object representing the command. The command is not usable until it has been registered with @value{GDBN} with @code{register-command!}. The rest of the arguments are optional. The argument @var{invoke} is a procedure of three arguments: @var{self}, @var{args} and @var{from-tty}. The argument @var{self} is the @code{} object representing the command. The argument @var{args} is a string representing the arguments passed to the command, after leading and trailing whitespace has been stripped. The argument @var{from-tty} is a boolean flag and specifies whether the command should consider itself to have been originated from the user invoking it interactively. If this function throws an exception, it is turned into a @value{GDBN} @code{error} call. Otherwise, the return value is ignored. The argument @var{command-class} is one of the @samp{COMMAND_} constants defined below. This argument tells @value{GDBN} how to categorize the new command in the help system. The default is @code{COMMAND_NONE}. The argument @var{completer} is either @code{#f}, one of the @samp{COMPLETE_} constants defined below, or a procedure, also defined below. This argument tells @value{GDBN} how to perform completion for this command. If not provided or if the value is @code{#f}, then no completion is performed on the command. The argument @var{prefix} is a boolean flag indicating whether the new command is a prefix command; sub-commands of this command may be registered. The argument @var{doc-string} is help text for the new command. If no documentation string is provided, the default value ``This command is not documented.'' is used. @end deffn @deffn {Scheme Procedure} register-command! command Add @var{command}, a @code{} object, to @value{GDBN}'s list of commands. It is an error to register a command more than once. The result is unspecified. @end deffn @deffn {Scheme Procedure} command? object Return @code{#t} if @var{object} is a @code{} object. Otherwise return @code{#f}. @end deffn @cindex don't repeat Guile command @deffn {Scheme Procedure} dont-repeat By default, a @value{GDBN} command is repeated when the user enters a blank line at the command prompt. A command can suppress this behavior by invoking the @code{dont-repeat} function. This is similar to the user command @code{dont-repeat}, see @ref{Define, dont-repeat}. @end deffn @deffn {Scheme Procedure} string->argv string Convert a string to a list of strings split up according to @value{GDBN}'s argv parsing rules. It is recommended to use this for consistency. Arguments are separated by spaces and may be quoted. Example: @smallexample scheme@@(guile-user)> (string->argv "1 2\\ \\\"3 '4 \"5' \"6 '7\"") $1 = ("1" "2 \"3" "4 \"5" "6 '7") @end smallexample @end deffn @deffn {Scheme Procedure} throw-user-error message . args Throw a @code{gdb:user-error} exception. The argument @var{message} is the error message as a format string, like the @var{fmt} argument to the @code{format} Scheme function. @xref{Formatted Output,,, guile, GNU Guile Reference Manual}. The argument @var{args} is a list of the optional arguments of @var{message}. This is used when the command detects a user error of some kind, say a bad command argument. @smallexample (gdb) guile (use-modules (gdb)) (gdb) guile (register-command! (make-command "test-user-error" #:command-class COMMAND_OBSCURE #:invoke (lambda (self arg from-tty) (throw-user-error "Bad argument ~a" arg)))) end (gdb) test-user-error ugh ERROR: Bad argument ugh @end smallexample @end deffn @cindex completion of Guile commands @deffn completer self text word If the @var{completer} option to @code{make-command} is a procedure, it takes three arguments: @var{self} which is the @code{} object, and @var{text} and @var{word} which are both strings. The argument @var{text} holds the complete command line up to the cursor's location. The argument @var{word} holds the last word of the command line; this is computed using a word-breaking heuristic. All forms of completion are handled by this function, that is, the @key{TAB} and @key{M-?} key bindings (@pxref{Completion}), and the @code{complete} command (@pxref{Help, complete}). This procedure can return several kinds of values: @itemize @bullet @item If the return value is a list, the contents of the list are used as the completions. It is up to @var{completer} to ensure that the contents actually do complete the word. An empty list is allowed, it means that there were no completions available. Only string elements of the list are used; other elements in the list are ignored. @item If the return value is a @code{} object, it is iterated over to obtain the completions. It is up to @code{completer-procedure} to ensure that the results actually do complete the word. Only string elements of the result are used; other elements in the sequence are ignored. @item All other results are treated as though there were no available completions. @end itemize @end deffn When a new command is registered, it will have been declared as a member of some general class of commands. This is used to classify top-level commands in the on-line help system; note that prefix commands are not listed under their own category but rather that of their top-level command. The available classifications are represented by constants defined in the @code{gdb} module: @vtable @code @item COMMAND_NONE The command does not belong to any particular class. A command in this category will not be displayed in any of the help categories. This is the default. @item COMMAND_RUNNING The command is related to running the inferior. For example, @code{start}, @code{step}, and @code{continue} are in this category. Type @kbd{help running} at the @value{GDBN} prompt to see a list of commands in this category. @item COMMAND_DATA The command is related to data or variables. For example, @code{call}, @code{find}, and @code{print} are in this category. Type @kbd{help data} at the @value{GDBN} prompt to see a list of commands in this category. @item COMMAND_STACK The command has to do with manipulation of the stack. For example, @code{backtrace}, @code{frame}, and @code{return} are in this category. Type @kbd{help stack} at the @value{GDBN} prompt to see a list of commands in this category. @item COMMAND_FILES This class is used for file-related commands. For example, @code{file}, @code{list} and @code{section} are in this category. Type @kbd{help files} at the @value{GDBN} prompt to see a list of commands in this category. @item COMMAND_SUPPORT This should be used for ``support facilities'', generally meaning things that are useful to the user when interacting with @value{GDBN}, but not related to the state of the inferior. For example, @code{help}, @code{make}, and @code{shell} are in this category. Type @kbd{help support} at the @value{GDBN} prompt to see a list of commands in this category. @item COMMAND_STATUS The command is an @samp{info}-related command, that is, related to the state of @value{GDBN} itself. For example, @code{info}, @code{macro}, and @code{show} are in this category. Type @kbd{help status} at the @value{GDBN} prompt to see a list of commands in this category. @item COMMAND_BREAKPOINTS The command has to do with breakpoints. For example, @code{break}, @code{clear}, and @code{delete} are in this category. Type @kbd{help breakpoints} at the @value{GDBN} prompt to see a list of commands in this category. @item COMMAND_TRACEPOINTS The command has to do with tracepoints. For example, @code{trace}, @code{actions}, and @code{tfind} are in this category. Type @kbd{help tracepoints} at the @value{GDBN} prompt to see a list of commands in this category. @item COMMAND_USER The command is a general purpose command for the user, and typically does not fit in one of the other categories. Type @kbd{help user-defined} at the @value{GDBN} prompt to see a list of commands in this category, as well as the list of gdb macros (@pxref{Sequences}). @item COMMAND_OBSCURE The command is only used in unusual circumstances, or is not of general interest to users. For example, @code{checkpoint}, @code{fork}, and @code{stop} are in this category. Type @kbd{help obscure} at the @value{GDBN} prompt to see a list of commands in this category. @item COMMAND_MAINTENANCE The command is only useful to @value{GDBN} maintainers. The @code{maintenance} and @code{flushregs} commands are in this category. Type @kbd{help internals} at the @value{GDBN} prompt to see a list of commands in this category. @end vtable A new command can use a predefined completion function, either by specifying it via an argument at initialization, or by returning it from the @code{completer} procedure. These predefined completion constants are all defined in the @code{gdb} module: @vtable @code @item COMPLETE_NONE This constant means that no completion should be done. @item COMPLETE_FILENAME This constant means that filename completion should be performed. @item COMPLETE_LOCATION This constant means that location completion should be done. @xref{Specify Location}. @item COMPLETE_COMMAND This constant means that completion should examine @value{GDBN} command names. @item COMPLETE_SYMBOL This constant means that completion should be done using symbol names as the source. @item COMPLETE_EXPRESSION This constant means that completion should be done on expressions. Often this means completing on symbol names, but some language parsers also have support for completing on field names. @end vtable The following code snippet shows how a trivial CLI command can be implemented in Guile: @smallexample (gdb) guile (register-command! (make-command "hello-world" #:command-class COMMAND_USER #:doc "Greet the whole world." #:invoke (lambda (self args from-tty) (display "Hello, World!\n")))) end (gdb) hello-world Hello, World! @end smallexample @node Parameters In Guile @subsubsection Parameters In Guile @cindex parameters in guile @cindex guile parameters @tindex Parameter You can implement new @value{GDBN} @dfn{parameters} using Guile @footnote{Note that @value{GDBN} parameters must not be confused with Guile’s parameter objects (@pxref{Parameters,,, guile, GNU Guile Reference Manual}).}. There are many parameters that already exist and can be set in @value{GDBN}. Two examples are: @code{set follow-fork} and @code{set charset}. Setting these parameters influences certain behavior in @value{GDBN}. Similarly, you can define parameters that can be used to influence behavior in custom Guile scripts and commands. A new parameter is defined with the @code{make-parameter} Guile function, and added to @value{GDBN} with the @code{register-parameter!} Guile function. This two-step approach is taken to separate out the side-effect of adding the parameter to @value{GDBN} from @code{make-parameter}. Parameters are exposed to the user via the @code{set} and @code{show} commands. @xref{Help}. @c TODO line length @deffn {Scheme Procedure} (make-parameter name @r{[}#:command-class command-class@r{]} @r{[}#:parameter-type parameter-type{]} @r{[}#:enum-list enum-list@r{]} @r{[}#:set-func set-func{]} @r{[}#:show-func show-func{]} @r{[}#:doc doc{]} @r{[}#:set-doc set-doc{]} @r{[}#:show-doc show-doc{]} @r{[}#:initial-value initial-value{]}) The argument @var{name} is the name of the new parameter. If @var{name} consists of multiple words, then the initial words are looked for as prefix parameters. An example of this can be illustrated with the @code{set print} set of parameters. If @var{name} is @code{print foo}, then @code{print} will be searched as the prefix parameter. In this case the parameter can subsequently be accessed in @value{GDBN} as @code{set print foo}. If @var{name} consists of multiple words, and no prefix parameter group can be found, an exception is raised. The result is the @code{} object representing the parameter. The parameter is not usable until it has been registered with @value{GDBN} with @code{register-parameter!}. The rest of the arguments are optional. The argument @var{command-class} should be one of the @samp{COMMAND_} constants (@pxref{Commands In Guile}). This argument tells @value{GDBN} how to categorize the new parameter in the help system. The default is @code{COMMAND_NONE}. The argument @var{parameter-type} should be one of the @samp{PARAM_} constants defined below. This argument tells @value{GDBN} the type of the new parameter; this information is used for input validation and completion. The default is @code{PARAM_BOOLEAN}. If @var{parameter-type} is @code{PARAM_ENUM}, then @var{enum-list} must be a list of strings. These strings represent the possible values for the parameter. If @var{parameter-type} is not @code{PARAM_ENUM}, then the presence of @var{enum-list} will cause an exception to be thrown. The argument @var{set-func} is a function of one argument: @var{self} which is the @code{} object representing the parameter. @value{GDBN} will call this function when a @var{parameter}'s value has been changed via the @code{set} API (for example, @kbd{set foo off}). The value of the parameter has already been set to the new value. This function must return a string to be displayed to the user. @value{GDBN} will add a trailing newline if the string is non-empty. @value{GDBN} generally doesn't print anything when a parameter is set, thus typically this function should return @samp{""}. A non-empty string result should typically be used for displaying warnings and errors. The argument @var{show-func} is a function of two arguments: @var{self} which is the @code{} object representing the parameter, and @var{svalue} which is the string representation of the current value. @value{GDBN} will call this function when a @var{parameter}'s @code{show} API has been invoked (for example, @kbd{show foo}). This function must return a string, and will be displayed to the user. @value{GDBN} will add a trailing newline. The argument @var{doc} is the help text for the new parameter. If there is no documentation string, a default value is used. The argument @var{set-doc} is the help text for this parameter's @code{set} command. The argument @var{show-doc} is the help text for this parameter's @code{show} command. The argument @var{initial-value} specifies the initial value of the parameter. If it is a function, it takes one parameter, the @code{} object and its result is used as the initial value of the parameter. The initial value must be valid for the parameter type, otherwise an exception is thrown. @end deffn @deffn {Scheme Procedure} register-parameter! parameter Add @var{parameter}, a @code{} object, to @value{GDBN}'s list of parameters. It is an error to register a parameter more than once. The result is unspecified. @end deffn @deffn {Scheme Procedure} parameter? object Return @code{#t} if @var{object} is a @code{} object. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} parameter-value parameter Return the value of @var{parameter} which may either be a @code{} object or a string naming the parameter. @end deffn @deffn {Scheme Procedure} set-parameter-value! parameter new-value Assign @var{parameter} the value of @var{new-value}. The argument @var{parameter} must be an object of type @code{}. @value{GDBN} does validation when assignments are made. @end deffn When a new parameter is defined, its type must be specified. The available types are represented by constants defined in the @code{gdb} module: @vtable @code @item PARAM_BOOLEAN The value is a plain boolean. The Guile boolean values, @code{#t} and @code{#f} are the only valid values. @item PARAM_AUTO_BOOLEAN The value has three possible states: true, false, and @samp{auto}. In Guile, true and false are represented using boolean constants, and @samp{auto} is represented using @code{#:auto}. @item PARAM_UINTEGER The value is an unsigned integer. The value of 0 should be interpreted to mean ``unlimited''. @item PARAM_ZINTEGER The value is an integer. @item PARAM_ZUINTEGER The value is an unsigned integer. @item PARAM_ZUINTEGER_UNLIMITED The value is an integer in the range @samp{[0, INT_MAX]}. A value of @samp{-1} means ``unlimited'', and other negative numbers are not allowed. @item PARAM_STRING The value is a string. When the user modifies the string, any escape sequences, such as @samp{\t}, @samp{\f}, and octal escapes, are translated into corresponding characters and encoded into the current host charset. @item PARAM_STRING_NOESCAPE The value is a string. When the user modifies the string, escapes are passed through untranslated. @item PARAM_OPTIONAL_FILENAME The value is a either a filename (a string), or @code{#f}. @item PARAM_FILENAME The value is a filename. This is just like @code{PARAM_STRING_NOESCAPE}, but uses file names for completion. @item PARAM_ENUM The value is a string, which must be one of a collection of string constants provided when the parameter is created. @end vtable @node Progspaces In Guile @subsubsection Program Spaces In Guile @cindex progspaces in guile @tindex A program space, or @dfn{progspace}, represents a symbolic view of an address space. It consists of all of the objfiles of the program. @xref{Objfiles In Guile}. @xref{Inferiors Connections and Programs, program spaces}, for more details about program spaces. Each progspace is represented by an instance of the @code{} smob. @xref{GDB Scheme Data Types}. The following progspace-related functions are available in the @code{(gdb)} module: @deffn {Scheme Procedure} progspace? object Return @code{#t} if @var{object} is a @code{} object. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} progspace-valid? progspace Return @code{#t} if @var{progspace} is valid, @code{#f} if not. A @code{} object can become invalid if the program it refers to is not loaded in @value{GDBN} any longer. @end deffn @deffn {Scheme Procedure} current-progspace This function returns the program space of the currently selected inferior. There is always a current progspace, this never returns @code{#f}. @xref{Inferiors Connections and Programs}. @end deffn @deffn {Scheme Procedure} progspaces Return a list of all the progspaces currently known to @value{GDBN}. @end deffn @deffn {Scheme Procedure} progspace-filename progspace Return the absolute file name of @var{progspace} as a string. This is the name of the file passed as the argument to the @code{file} or @code{symbol-file} commands. If the program space does not have an associated file name, then @code{#f} is returned. This occurs, for example, when @value{GDBN} is started without a program to debug. A @code{gdb:invalid-object-error} exception is thrown if @var{progspace} is invalid. @end deffn @deffn {Scheme Procedure} progspace-objfiles progspace Return the list of objfiles of @var{progspace}. The order of objfiles in the result is arbitrary. Each element is an object of type @code{}. @xref{Objfiles In Guile}. A @code{gdb:invalid-object-error} exception is thrown if @var{progspace} is invalid. @end deffn @deffn {Scheme Procedure} progspace-pretty-printers progspace Return the list of pretty-printers of @var{progspace}. Each element is an object of type @code{}. @xref{Guile Pretty Printing API}, for more information. @end deffn @deffn {Scheme Procedure} set-progspace-pretty-printers! progspace printer-list Set the list of registered @code{} objects for @var{progspace} to @var{printer-list}. @xref{Guile Pretty Printing API}, for more information. @end deffn @node Objfiles In Guile @subsubsection Objfiles In Guile @cindex objfiles in guile @tindex @value{GDBN} loads symbols for an inferior from various symbol-containing files (@pxref{Files}). These include the primary executable file, any shared libraries used by the inferior, and any separate debug info files (@pxref{Separate Debug Files}). @value{GDBN} calls these symbol-containing files @dfn{objfiles}. Each objfile is represented as an object of type @code{}. The following objfile-related procedures are provided by the @code{(gdb)} module: @deffn {Scheme Procedure} objfile? object Return @code{#t} if @var{object} is a @code{} object. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} objfile-valid? objfile Return @code{#t} if @var{objfile} is valid, @code{#f} if not. A @code{} object can become invalid if the object file it refers to is not loaded in @value{GDBN} any longer. All other @code{} procedures will throw an exception if it is invalid at the time the procedure is called. @end deffn @deffn {Scheme Procedure} objfile-filename objfile Return the file name of @var{objfile} as a string, with symbolic links resolved. @end deffn @deffn {Scheme Procedure} objfile-progspace objfile Return the @code{} that this object file lives in. @xref{Progspaces In Guile}, for more on progspaces. @end deffn @deffn {Scheme Procedure} objfile-pretty-printers objfile Return the list of registered @code{} objects for @var{objfile}. @xref{Guile Pretty Printing API}, for more information. @end deffn @deffn {Scheme Procedure} set-objfile-pretty-printers! objfile printer-list Set the list of registered @code{} objects for @var{objfile} to @var{printer-list}. The @var{printer-list} must be a list of @code{} objects. @xref{Guile Pretty Printing API}, for more information. @end deffn @deffn {Scheme Procedure} current-objfile When auto-loading a Guile script (@pxref{Guile Auto-loading}), @value{GDBN} sets the ``current objfile'' to the corresponding objfile. This function returns the current objfile. If there is no current objfile, this function returns @code{#f}. @end deffn @deffn {Scheme Procedure} objfiles Return a list of all the objfiles in the current program space. @end deffn @node Frames In Guile @subsubsection Accessing inferior stack frames from Guile. @cindex frames in guile When the debugged program stops, @value{GDBN} is able to analyze its call stack (@pxref{Frames,,Stack frames}). The @code{} class represents a frame in the stack. A @code{} object is only valid while its corresponding frame exists in the inferior's stack. If you try to use an invalid frame object, @value{GDBN} will throw a @code{gdb:invalid-object} exception (@pxref{Guile Exception Handling}). Two @code{} objects can be compared for equality with the @code{equal?} function, like: @smallexample (@value{GDBP}) guile (equal? (newest-frame) (selected-frame)) #t @end smallexample The following frame-related procedures are provided by the @code{(gdb)} module: @deffn {Scheme Procedure} frame? object Return @code{#t} if @var{object} is a @code{} object. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} frame-valid? frame Returns @code{#t} if @var{frame} is valid, @code{#f} if not. A frame object can become invalid if the frame it refers to doesn't exist anymore in the inferior. All @code{} procedures will throw an exception if the frame is invalid at the time the procedure is called. @end deffn @deffn {Scheme Procedure} frame-name frame Return the function name of @var{frame}, or @code{#f} if it can't be obtained. @end deffn @deffn {Scheme Procedure} frame-arch frame Return the @code{} object corresponding to @var{frame}'s architecture. @xref{Architectures In Guile}. @end deffn @deffn {Scheme Procedure} frame-type frame Return the type of @var{frame}. The value can be one of: @table @code @item NORMAL_FRAME An ordinary stack frame. @item DUMMY_FRAME A fake stack frame that was created by @value{GDBN} when performing an inferior function call. @item INLINE_FRAME A frame representing an inlined function. The function was inlined into a @code{NORMAL_FRAME} that is older than this one. @item TAILCALL_FRAME A frame representing a tail call. @xref{Tail Call Frames}. @item SIGTRAMP_FRAME A signal trampoline frame. This is the frame created by the OS when it calls into a signal handler. @item ARCH_FRAME A fake stack frame representing a cross-architecture call. @item SENTINEL_FRAME This is like @code{NORMAL_FRAME}, but it is only used for the newest frame. @end table @end deffn @deffn {Scheme Procedure} frame-unwind-stop-reason frame Return an integer representing the reason why it's not possible to find more frames toward the outermost frame. Use @code{unwind-stop-reason-string} to convert the value returned by this function to a string. The value can be one of: @table @code @item FRAME_UNWIND_NO_REASON No particular reason (older frames should be available). @item FRAME_UNWIND_NULL_ID The previous frame's analyzer returns an invalid result. @item FRAME_UNWIND_OUTERMOST This frame is the outermost. @item FRAME_UNWIND_UNAVAILABLE Cannot unwind further, because that would require knowing the values of registers or memory that have not been collected. @item FRAME_UNWIND_INNER_ID This frame ID looks like it ought to belong to a NEXT frame, but we got it for a PREV frame. Normally, this is a sign of unwinder failure. It could also indicate stack corruption. @item FRAME_UNWIND_SAME_ID This frame has the same ID as the previous one. That means that unwinding further would almost certainly give us another frame with exactly the same ID, so break the chain. Normally, this is a sign of unwinder failure. It could also indicate stack corruption. @item FRAME_UNWIND_NO_SAVED_PC The frame unwinder did not find any saved PC, but we needed one to unwind further. @item FRAME_UNWIND_MEMORY_ERROR The frame unwinder caused an error while trying to access memory. @item FRAME_UNWIND_FIRST_ERROR Any stop reason greater or equal to this value indicates some kind of error. This special value facilitates writing code that tests for errors in unwinding in a way that will work correctly even if the list of the other values is modified in future @value{GDBN} versions. Using it, you could write: @smallexample (define reason (frame-unwind-stop-readon (selected-frame))) (define reason-str (unwind-stop-reason-string reason)) (if (>= reason FRAME_UNWIND_FIRST_ERROR) (format #t "An error occured: ~s\n" reason-str)) @end smallexample @end table @end deffn @deffn {Scheme Procedure} frame-pc frame Return the frame's resume address. @end deffn @deffn {Scheme Procedure} frame-block frame Return the frame's code block as a @code{} object. @xref{Blocks In Guile}. @end deffn @deffn {Scheme Procedure} frame-function frame Return the symbol for the function corresponding to this frame as a @code{} object, or @code{#f} if there isn't one. @xref{Symbols In Guile}. @end deffn @deffn {Scheme Procedure} frame-older frame Return the frame that called @var{frame}. @end deffn @deffn {Scheme Procedure} frame-newer frame Return the frame called by @var{frame}. @end deffn @deffn {Scheme Procedure} frame-sal frame Return the frame's @code{} (symtab and line) object. @xref{Symbol Tables In Guile}. @end deffn @deffn {Scheme Procedure} frame-read-register frame register Return the value of @var{register} in @var{frame}. @var{register} should be a string, like @samp{pc}. @end deffn @deffn {Scheme Procedure} frame-read-var frame variable @r{[}#:block block@r{]} Return the value of @var{variable} in @var{frame}. If the optional argument @var{block} is provided, search for the variable from that block; otherwise start at the frame's current block (which is determined by the frame's current program counter). The @var{variable} must be given as a string or a @code{} object, and @var{block} must be a @code{} object. @end deffn @deffn {Scheme Procedure} frame-select frame Set @var{frame} to be the selected frame. @xref{Stack, ,Examining the Stack}. @end deffn @deffn {Scheme Procedure} selected-frame Return the selected frame object. @xref{Selection,,Selecting a Frame}. @end deffn @deffn {Scheme Procedure} newest-frame Return the newest frame object for the selected thread. @end deffn @deffn {Scheme Procedure} unwind-stop-reason-string reason Return a string explaining the reason why @value{GDBN} stopped unwinding frames, as expressed by the given @var{reason} code (an integer, see the @code{frame-unwind-stop-reason} procedure above in this section). @end deffn @node Blocks In Guile @subsubsection Accessing blocks from Guile. @cindex blocks in guile @tindex In @value{GDBN}, symbols are stored in blocks. A block corresponds roughly to a scope in the source code. Blocks are organized hierarchically, and are represented individually in Guile as an object of type @code{}. Blocks rely on debugging information being available. A frame has a block. Please see @ref{Frames In Guile}, for a more in-depth discussion of frames. The outermost block is known as the @dfn{global block}. The global block typically holds public global variables and functions. The block nested just inside the global block is the @dfn{static block}. The static block typically holds file-scoped variables and functions. @value{GDBN} provides a method to get a block's superblock, but there is currently no way to examine the sub-blocks of a block, or to iterate over all the blocks in a symbol table (@pxref{Symbol Tables In Guile}). Here is a short example that should help explain blocks: @smallexample /* This is in the global block. */ int global; /* This is in the static block. */ static int file_scope; /* 'function' is in the global block, and 'argument' is in a block nested inside of 'function'. */ int function (int argument) @{ /* 'local' is in a block inside 'function'. It may or may not be in the same block as 'argument'. */ int local; @{ /* 'inner' is in a block whose superblock is the one holding 'local'. */ int inner; /* If this call is expanded by the compiler, you may see a nested block here whose function is 'inline_function' and whose superblock is the one holding 'inner'. */ inline_function (); @} @} @end smallexample The following block-related procedures are provided by the @code{(gdb)} module: @deffn {Scheme Procedure} block? object Return @code{#t} if @var{object} is a @code{} object. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} block-valid? block Returns @code{#t} if @code{} @var{block} is valid, @code{#f} if not. A block object can become invalid if the block it refers to doesn't exist anymore in the inferior. All other @code{} methods will throw an exception if it is invalid at the time the procedure is called. The block's validity is also checked during iteration over symbols of the block. @end deffn @deffn {Scheme Procedure} block-start block Return the start address of @code{} @var{block}. @end deffn @deffn {Scheme Procedure} block-end block Return the end address of @code{} @var{block}. @end deffn @deffn {Scheme Procedure} block-function block Return the name of @code{} @var{block} represented as a @code{} object. If the block is not named, then @code{#f} is returned. For ordinary function blocks, the superblock is the static block. However, you should note that it is possible for a function block to have a superblock that is not the static block -- for instance this happens for an inlined function. @end deffn @deffn {Scheme Procedure} block-superblock block Return the block containing @code{} @var{block}. If the parent block does not exist, then @code{#f} is returned. @end deffn @deffn {Scheme Procedure} block-global-block block Return the global block associated with @code{} @var{block}. @end deffn @deffn {Scheme Procedure} block-static-block block Return the static block associated with @code{} @var{block}. @end deffn @deffn {Scheme Procedure} block-global? block Return @code{#t} if @code{} @var{block} is a global block. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} block-static? block Return @code{#t} if @code{} @var{block} is a static block. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} block-symbols Return a list of all symbols (as objects) in @code{} @var{block}. @end deffn @deffn {Scheme Procedure} make-block-symbols-iterator block Return an object of type @code{} that will iterate over all symbols of the block. Guile programs should not assume that a specific block object will always contain a given symbol, since changes in @value{GDBN} features and infrastructure may cause symbols move across blocks in a symbol table. @xref{Iterators In Guile}. @end deffn @deffn {Scheme Procedure} block-symbols-progress? Return #t if the object is a object. This object would be obtained from the @code{progress} element of the @code{} object returned by @code{make-block-symbols-iterator}. @end deffn @deffn {Scheme Procedure} lookup-block pc Return the innermost @code{} containing the given @var{pc} value. If the block cannot be found for the @var{pc} value specified, the function will return @code{#f}. @end deffn @node Symbols In Guile @subsubsection Guile representation of Symbols. @cindex symbols in guile @tindex @value{GDBN} represents every variable, function and type as an entry in a symbol table. @xref{Symbols, ,Examining the Symbol Table}. Guile represents these symbols in @value{GDBN} with the @code{} object. The following symbol-related procedures are provided by the @code{(gdb)} module: @deffn {Scheme Procedure} symbol? object Return @code{#t} if @var{object} is an object of type @code{}. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} symbol-valid? symbol Return @code{#t} if the @code{} object is valid, @code{#f} if not. A @code{} object can become invalid if the symbol it refers to does not exist in @value{GDBN} any longer. All other @code{} procedures will throw an exception if it is invalid at the time the procedure is called. @end deffn @deffn {Scheme Procedure} symbol-type symbol Return the type of @var{symbol} or @code{#f} if no type is recorded. The result is an object of type @code{}. @xref{Types In Guile}. @end deffn @deffn {Scheme Procedure} symbol-symtab symbol Return the symbol table in which @var{symbol} appears. The result is an object of type @code{}. @xref{Symbol Tables In Guile}. @end deffn @deffn {Scheme Procedure} symbol-line symbol Return the line number in the source code at which @var{symbol} was defined. This is an integer. @end deffn @deffn {Scheme Procedure} symbol-name symbol Return the name of @var{symbol} as a string. @end deffn @deffn {Scheme Procedure} symbol-linkage-name symbol Return the name of @var{symbol}, as used by the linker (i.e., may be mangled). @end deffn @deffn {Scheme Procedure} symbol-print-name symbol Return the name of @var{symbol} in a form suitable for output. This is either @code{name} or @code{linkage_name}, depending on whether the user asked @value{GDBN} to display demangled or mangled names. @end deffn @deffn {Scheme Procedure} symbol-addr-class symbol Return the address class of the symbol. This classifies how to find the value of a symbol. Each address class is a constant defined in the @code{(gdb)} module and described later in this chapter. @end deffn @deffn {Scheme Procedure} symbol-needs-frame? symbol Return @code{#t} if evaluating @var{symbol}'s value requires a frame (@pxref{Frames In Guile}) and @code{#f} otherwise. Typically, local variables will require a frame, but other symbols will not. @end deffn @deffn {Scheme Procedure} symbol-argument? symbol Return @code{#t} if @var{symbol} is an argument of a function. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} symbol-constant? symbol Return @code{#t} if @var{symbol} is a constant. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} symbol-function? symbol Return @code{#t} if @var{symbol} is a function or a method. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} symbol-variable? symbol Return @code{#t} if @var{symbol} is a variable. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} symbol-value symbol @r{[}#:frame frame@r{]} Compute the value of @var{symbol}, as a @code{}. For functions, this computes the address of the function, cast to the appropriate type. If the symbol requires a frame in order to compute its value, then @var{frame} must be given. If @var{frame} is not given, or if @var{frame} is invalid, then an exception is thrown. @end deffn @c TODO: line length @deffn {Scheme Procedure} lookup-symbol name @r{[}#:block block@r{]} @r{[}#:domain domain@r{]} This function searches for a symbol by name. The search scope can be restricted to the parameters defined in the optional domain and block arguments. @var{name} is the name of the symbol. It must be a string. The optional @var{block} argument restricts the search to symbols visible in that @var{block}. The @var{block} argument must be a @code{} object. If omitted, the block for the current frame is used. The optional @var{domain} argument restricts the search to the domain type. The @var{domain} argument must be a domain constant defined in the @code{(gdb)} module and described later in this chapter. The result is a list of two elements. The first element is a @code{} object or @code{#f} if the symbol is not found. If the symbol is found, the second element is @code{#t} if the symbol is a field of a method's object (e.g., @code{this} in C@t{++}), otherwise it is @code{#f}. If the symbol is not found, the second element is @code{#f}. @end deffn @deffn {Scheme Procedure} lookup-global-symbol name @r{[}#:domain domain@r{]} This function searches for a global symbol by name. The search scope can be restricted by the domain argument. @var{name} is the name of the symbol. It must be a string. The optional @var{domain} argument restricts the search to the domain type. The @var{domain} argument must be a domain constant defined in the @code{(gdb)} module and described later in this chapter. The result is a @code{} object or @code{#f} if the symbol is not found. @end deffn The available domain categories in @code{} are represented as constants in the @code{(gdb)} module: @vtable @code @item SYMBOL_UNDEF_DOMAIN This is used when a domain has not been discovered or none of the following domains apply. This usually indicates an error either in the symbol information or in @value{GDBN}'s handling of symbols. @item SYMBOL_VAR_DOMAIN This domain contains variables, function names, typedef names and enum type values. @item SYMBOL_STRUCT_DOMAIN This domain holds struct, union and enum type names. @item SYMBOL_LABEL_DOMAIN This domain contains names of labels (for gotos). @item SYMBOL_VARIABLES_DOMAIN This domain holds a subset of the @code{SYMBOLS_VAR_DOMAIN}; it contains everything minus functions and types. @item SYMBOL_FUNCTIONS_DOMAIN This domain contains all functions. @item SYMBOL_TYPES_DOMAIN This domain contains all types. @end vtable The available address class categories in @code{} are represented as constants in the @code{gdb} module: @vtable @code @item SYMBOL_LOC_UNDEF If this is returned by address class, it indicates an error either in the symbol information or in @value{GDBN}'s handling of symbols. @item SYMBOL_LOC_CONST Value is constant int. @item SYMBOL_LOC_STATIC Value is at a fixed address. @item SYMBOL_LOC_REGISTER Value is in a register. @item SYMBOL_LOC_ARG Value is an argument. This value is at the offset stored within the symbol inside the frame's argument list. @item SYMBOL_LOC_REF_ARG Value address is stored in the frame's argument list. Just like @code{LOC_ARG} except that the value's address is stored at the offset, not the value itself. @item SYMBOL_LOC_REGPARM_ADDR Value is a specified register. Just like @code{LOC_REGISTER} except the register holds the address of the argument instead of the argument itself. @item SYMBOL_LOC_LOCAL Value is a local variable. @item SYMBOL_LOC_TYPEDEF Value not used. Symbols in the domain @code{SYMBOL_STRUCT_DOMAIN} all have this class. @item SYMBOL_LOC_BLOCK Value is a block. @item SYMBOL_LOC_CONST_BYTES Value is a byte-sequence. @item SYMBOL_LOC_UNRESOLVED Value is at a fixed address, but the address of the variable has to be determined from the minimal symbol table whenever the variable is referenced. @item SYMBOL_LOC_OPTIMIZED_OUT The value does not actually exist in the program. @item SYMBOL_LOC_COMPUTED The value's address is a computed location. @end vtable @node Symbol Tables In Guile @subsubsection Symbol table representation in Guile. @cindex symbol tables in guile @tindex @tindex Access to symbol table data maintained by @value{GDBN} on the inferior is exposed to Guile via two objects: @code{} (symtab-and-line) and @code{}. Symbol table and line data for a frame is returned from the @code{frame-find-sal} @code{} procedure. @xref{Frames In Guile}. For more information on @value{GDBN}'s symbol table management, see @ref{Symbols, ,Examining the Symbol Table}. The following symtab-related procedures are provided by the @code{(gdb)} module: @deffn {Scheme Procedure} symtab? object Return @code{#t} if @var{object} is an object of type @code{}. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} symtab-valid? symtab Return @code{#t} if the @code{} object is valid, @code{#f} if not. A @code{} object becomes invalid when the symbol table it refers to no longer exists in @value{GDBN}. All other @code{} procedures will throw an exception if it is invalid at the time the procedure is called. @end deffn @deffn {Scheme Procedure} symtab-filename symtab Return the symbol table's source filename. @end deffn @deffn {Scheme Procedure} symtab-fullname symtab Return the symbol table's source absolute file name. @end deffn @deffn {Scheme Procedure} symtab-objfile symtab Return the symbol table's backing object file. @xref{Objfiles In Guile}. @end deffn @deffn {Scheme Procedure} symtab-global-block symtab Return the global block of the underlying symbol table. @xref{Blocks In Guile}. @end deffn @deffn {Scheme Procedure} symtab-static-block symtab Return the static block of the underlying symbol table. @xref{Blocks In Guile}. @end deffn The following symtab-and-line-related procedures are provided by the @code{(gdb)} module: @deffn {Scheme Procedure} sal? object Return @code{#t} if @var{object} is an object of type @code{}. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} sal-valid? sal Return @code{#t} if @var{sal} is valid, @code{#f} if not. A @code{} object becomes invalid when the Symbol table object it refers to no longer exists in @value{GDBN}. All other @code{} procedures will throw an exception if it is invalid at the time the procedure is called. @end deffn @deffn {Scheme Procedure} sal-symtab sal Return the symbol table object (@code{}) for @var{sal}. @end deffn @deffn {Scheme Procedure} sal-line sal Return the line number for @var{sal}. @end deffn @deffn {Scheme Procedure} sal-pc sal Return the start of the address range occupied by code for @var{sal}. @end deffn @deffn {Scheme Procedure} sal-last sal Return the end of the address range occupied by code for @var{sal}. @end deffn @deffn {Scheme Procedure} find-pc-line pc Return the @code{} object corresponding to the @var{pc} value. If an invalid value of @var{pc} is passed as an argument, then the @code{symtab} and @code{line} attributes of the returned @code{} object will be @code{#f} and 0 respectively. @end deffn @node Breakpoints In Guile @subsubsection Manipulating breakpoints using Guile @cindex breakpoints in guile @tindex Breakpoints in Guile are represented by objects of type @code{}. New breakpoints can be created with the @code{make-breakpoint} Guile function, and then added to @value{GDBN} with the @code{register-breakpoint!} Guile function. This two-step approach is taken to separate out the side-effect of adding the breakpoint to @value{GDBN} from @code{make-breakpoint}. Support is also provided to view and manipulate breakpoints created outside of Guile. The following breakpoint-related procedures are provided by the @code{(gdb)} module: @c TODO: line length @deffn {Scheme Procedure} make-breakpoint location @r{[}#:type type@r{]} @r{[}#:wp-class wp-class@r{]} @r{[}#:internal internal@r{]} Create a new breakpoint at @var{location}, a string naming the location of the breakpoint, or an expression that defines a watchpoint. The contents can be any location recognized by the @code{break} command, or in the case of a watchpoint, by the @code{watch} command. The breakpoint is initially marked as @samp{invalid}. The breakpoint is not usable until it has been registered with @value{GDBN} with @code{register-breakpoint!}, at which point it becomes @samp{valid}. The result is the @code{} object representing the breakpoint. The optional @var{type} denotes the breakpoint to create. This argument can be either @code{BP_BREAKPOINT} or @code{BP_WATCHPOINT}, and defaults to @code{BP_BREAKPOINT}. The optional @var{wp-class} argument defines the class of watchpoint to create, if @var{type} is @code{BP_WATCHPOINT}. If a watchpoint class is not provided, it is assumed to be a @code{WP_WRITE} class. The optional @var{internal} argument allows the breakpoint to become invisible to the user. The breakpoint will neither be reported when registered, nor will it be listed in the output from @code{info breakpoints} (but will be listed with the @code{maint info breakpoints} command). If an internal flag is not provided, the breakpoint is visible (non-internal). When a watchpoint is created, @value{GDBN} will try to create a hardware assisted watchpoint. If successful, the type of the watchpoint is changed from @code{BP_WATCHPOINT} to @code{BP_HARDWARE_WATCHPOINT} for @code{WP_WRITE}, @code{BP_READ_WATCHPOINT} for @code{WP_READ}, and @code{BP_ACCESS_WATCHPOINT} for @code{WP_ACCESS}. If not successful, the type of the watchpoint is left as @code{WP_WATCHPOINT}. The available types are represented by constants defined in the @code{gdb} module: @vtable @code @item BP_BREAKPOINT Normal code breakpoint. @item BP_WATCHPOINT Watchpoint breakpoint. @item BP_HARDWARE_WATCHPOINT Hardware assisted watchpoint. This value cannot be specified when creating the breakpoint. @item BP_READ_WATCHPOINT Hardware assisted read watchpoint. This value cannot be specified when creating the breakpoint. @item BP_ACCESS_WATCHPOINT Hardware assisted access watchpoint. This value cannot be specified when creating the breakpoint. @item BP_CATCHPOINT Catchpoint. This value cannot be specified when creating the breakpoint. @end vtable The available watchpoint types are represented by constants defined in the @code{(gdb)} module: @vtable @code @item WP_READ Read only watchpoint. @item WP_WRITE Write only watchpoint. @item WP_ACCESS Read/Write watchpoint. @end vtable @end deffn @deffn {Scheme Procedure} register-breakpoint! breakpoint Add @var{breakpoint}, a @code{} object, to @value{GDBN}'s list of breakpoints. The breakpoint must have been created with @code{make-breakpoint}. One cannot register breakpoints that have been created outside of Guile. Once a breakpoint is registered it becomes @samp{valid}. It is an error to register an already registered breakpoint. The result is unspecified. @end deffn @deffn {Scheme Procedure} delete-breakpoint! breakpoint Remove @var{breakpoint} from @value{GDBN}'s list of breakpoints. This also invalidates the Guile @var{breakpoint} object. Any further attempt to access the object will throw an exception. If @var{breakpoint} was created from Guile with @code{make-breakpoint} it may be re-registered with @value{GDBN}, in which case the breakpoint becomes valid again. @end deffn @deffn {Scheme Procedure} breakpoints Return a list of all breakpoints. Each element of the list is a @code{} object. @end deffn @deffn {Scheme Procedure} breakpoint? object Return @code{#t} if @var{object} is a @code{} object, and @code{#f} otherwise. @end deffn @deffn {Scheme Procedure} breakpoint-valid? breakpoint Return @code{#t} if @var{breakpoint} is valid, @code{#f} otherwise. Breakpoints created with @code{make-breakpoint} are marked as invalid until they are registered with @value{GDBN} with @code{register-breakpoint!}. A @code{} object can become invalid if the user deletes the breakpoint. In this case, the object still exists, but the underlying breakpoint does not. In the cases of watchpoint scope, the watchpoint remains valid even if execution of the inferior leaves the scope of that watchpoint. @end deffn @deffn {Scheme Procedure} breakpoint-number breakpoint Return the breakpoint's number --- the identifier used by the user to manipulate the breakpoint. @end deffn @deffn {Scheme Procedure} breakpoint-type breakpoint Return the breakpoint's type --- the identifier used to determine the actual breakpoint type or use-case. @end deffn @deffn {Scheme Procedure} breakpoint-visible? breakpoint Return @code{#t} if the breakpoint is visible to the user when hit, or when the @samp{info breakpoints} command is run. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} breakpoint-location breakpoint Return the location of the breakpoint, as specified by the user. It is a string. If the breakpoint does not have a location (that is, it is a watchpoint) return @code{#f}. @end deffn @deffn {Scheme Procedure} breakpoint-expression breakpoint Return the breakpoint expression, as specified by the user. It is a string. If the breakpoint does not have an expression (the breakpoint is not a watchpoint) return @code{#f}. @end deffn @deffn {Scheme Procedure} breakpoint-enabled? breakpoint Return @code{#t} if the breakpoint is enabled, and @code{#f} otherwise. @end deffn @deffn {Scheme Procedure} set-breakpoint-enabled! breakpoint flag Set the enabled state of @var{breakpoint} to @var{flag}. If flag is @code{#f} it is disabled, otherwise it is enabled. @end deffn @deffn {Scheme Procedure} breakpoint-silent? breakpoint Return @code{#t} if the breakpoint is silent, and @code{#f} otherwise. Note that a breakpoint can also be silent if it has commands and the first command is @code{silent}. This is not reported by the @code{silent} attribute. @end deffn @deffn {Scheme Procedure} set-breakpoint-silent! breakpoint flag Set the silent state of @var{breakpoint} to @var{flag}. If flag is @code{#f} the breakpoint is made silent, otherwise it is made non-silent (or noisy). @end deffn @deffn {Scheme Procedure} breakpoint-ignore-count breakpoint Return the ignore count for @var{breakpoint}. @end deffn @deffn {Scheme Procedure} set-breakpoint-ignore-count! breakpoint count Set the ignore count for @var{breakpoint} to @var{count}. @end deffn @deffn {Scheme Procedure} breakpoint-hit-count breakpoint Return hit count of @var{breakpoint}. @end deffn @deffn {Scheme Procedure} set-breakpoint-hit-count! breakpoint count Set the hit count of @var{breakpoint} to @var{count}. At present, @var{count} must be zero. @end deffn @deffn {Scheme Procedure} breakpoint-thread breakpoint Return the global-thread-id for thread-specific breakpoint @var{breakpoint}. Return #f if @var{breakpoint} is not thread-specific. @end deffn @deffn {Scheme Procedure} set-breakpoint-thread! breakpoint global-thread-id|#f Set the thread-id for @var{breakpoint} to @var{global-thread-id} If set to @code{#f}, the breakpoint is no longer thread-specific. @end deffn @deffn {Scheme Procedure} breakpoint-task breakpoint If the breakpoint is Ada task-specific, return the Ada task id. If the breakpoint is not task-specific (or the underlying language is not Ada), return @code{#f}. @end deffn @deffn {Scheme Procedure} set-breakpoint-task! breakpoint task Set the Ada task of @var{breakpoint} to @var{task}. If set to @code{#f}, the breakpoint is no longer task-specific. @end deffn @deffn {Scheme Procedure} breakpoint-condition breakpoint Return the condition of @var{breakpoint}, as specified by the user. It is a string. If there is no condition, return @code{#f}. @end deffn @deffn {Scheme Procedure} set-breakpoint-condition! breakpoint condition Set the condition of @var{breakpoint} to @var{condition}, which must be a string. If set to @code{#f} then the breakpoint becomes unconditional. @end deffn @deffn {Scheme Procedure} breakpoint-stop breakpoint Return the stop predicate of @var{breakpoint}. See @code{set-breakpoint-stop!} below in this section. @end deffn @deffn {Scheme Procedure} set-breakpoint-stop! breakpoint procedure|#f Set the stop predicate of @var{breakpoint}. The predicate @var{procedure} takes one argument: the object. If this predicate is set to a procedure then it is invoked whenever the inferior reaches this breakpoint. If it returns @code{#t}, or any non-@code{#f} value, then the inferior is stopped, otherwise the inferior will continue. If there are multiple breakpoints at the same location with a @code{stop} predicate, each one will be called regardless of the return status of the previous. This ensures that all @code{stop} predicates have a chance to execute at that location. In this scenario if one of the methods returns @code{#t} but the others return @code{#f}, the inferior will still be stopped. You should not alter the execution state of the inferior (i.e.@:, step, next, etc.), alter the current frame context (i.e.@:, change the current active frame), or alter, add or delete any breakpoint. As a general rule, you should not alter any data within @value{GDBN} or the inferior at this time. Example @code{stop} implementation: @smallexample (define (my-stop? bkpt) (let ((int-val (parse-and-eval "foo"))) (value=? int-val 3))) (define bkpt (make-breakpoint "main.c:42")) (register-breakpoint! bkpt) (set-breakpoint-stop! bkpt my-stop?) @end smallexample @end deffn @deffn {Scheme Procedure} breakpoint-commands breakpoint Return the commands attached to @var{breakpoint} as a string, or @code{#f} if there are none. @end deffn @node Lazy Strings In Guile @subsubsection Guile representation of lazy strings. @cindex lazy strings in guile @tindex A @dfn{lazy string} is a string whose contents is not retrieved or encoded until it is needed. A @code{} is represented in @value{GDBN} as an @code{address} that points to a region of memory, an @code{encoding} that will be used to encode that region of memory, and a @code{length} to delimit the region of memory that represents the string. The difference between a @code{} and a string wrapped within a @code{} is that a @code{} will be treated differently by @value{GDBN} when printing. A @code{} is retrieved and encoded during printing, while a @code{} wrapping a string is immediately retrieved and encoded on creation. The following lazy-string-related procedures are provided by the @code{(gdb)} module: @deffn {Scheme Procedure} lazy-string? object Return @code{#t} if @var{object} is an object of type @code{}. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} lazy-string-address lazy-sring Return the address of @var{lazy-string}. @end deffn @deffn {Scheme Procedure} lazy-string-length lazy-string Return the length of @var{lazy-string} in characters. If the length is -1, then the string will be fetched and encoded up to the first null of appropriate width. @end deffn @deffn {Scheme Procedure} lazy-string-encoding lazy-string Return the encoding that will be applied to @var{lazy-string} when the string is printed by @value{GDBN}. If the encoding is not set, or contains an empty string, then @value{GDBN} will select the most appropriate encoding when the string is printed. @end deffn @deffn {Scheme Procedure} lazy-string-type lazy-string Return the type that is represented by @var{lazy-string}'s type. For a lazy string this is a pointer or array type. To resolve this to the lazy string's character type, use @code{type-target-type}. @xref{Types In Guile}. @end deffn @deffn {Scheme Procedure} lazy-string->value lazy-string Convert the @code{} to a @code{}. This value will point to the string in memory, but will lose all the delayed retrieval, encoding and handling that @value{GDBN} applies to a @code{}. @end deffn @node Architectures In Guile @subsubsection Guile representation of architectures @cindex guile architectures @tindex @value{GDBN} uses architecture specific parameters and artifacts in a number of its various computations. An architecture is represented by an instance of the @code{} class. The following architecture-related procedures are provided by the @code{(gdb)} module: @deffn {Scheme Procedure} arch? object Return @code{#t} if @var{object} is an object of type @code{}. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} current-arch Return the current architecture as a @code{} object. @end deffn @deffn {Scheme Procedure} arch-name arch Return the name (string value) of @code{} @var{arch}. @end deffn @deffn {Scheme Procedure} arch-charset arch Return name of target character set of @code{} @var{arch}. @end deffn @deffn {Scheme Procedure} arch-wide-charset Return name of target wide character set of @code{} @var{arch}. @end deffn Each architecture provides a set of predefined types, obtained by the following functions. @deffn {Scheme Procedure} arch-void-type arch Return the @code{} object for a @code{void} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-char-type arch Return the @code{} object for a @code{char} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-short-type arch Return the @code{} object for a @code{short} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-int-type arch Return the @code{} object for an @code{int} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-long-type arch Return the @code{} object for a @code{long} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-schar-type arch Return the @code{} object for a @code{signed char} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-uchar-type arch Return the @code{} object for an @code{unsigned char} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-ushort-type arch Return the @code{} object for an @code{unsigned short} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-uint-type arch Return the @code{} object for an @code{unsigned int} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-ulong-type arch Return the @code{} object for an @code{unsigned long} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-float-type arch Return the @code{} object for a @code{float} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-double-type arch Return the @code{} object for a @code{double} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-longdouble-type arch Return the @code{} object for a @code{long double} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-bool-type arch Return the @code{} object for a @code{bool} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-longlong-type arch Return the @code{} object for a @code{long long} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-ulonglong-type arch Return the @code{} object for an @code{unsigned long long} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-int8-type arch Return the @code{} object for an @code{int8} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-uint8-type arch Return the @code{} object for a @code{uint8} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-int16-type arch Return the @code{} object for an @code{int16} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-uint16-type arch Return the @code{} object for a @code{uint16} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-int32-type arch Return the @code{} object for an @code{int32} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-uint32-type arch Return the @code{} object for a @code{uint32} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-int64-type arch Return the @code{} object for an @code{int64} type of architecture @var{arch}. @end deffn @deffn {Scheme Procedure} arch-uint64-type arch Return the @code{} object for a @code{uint64} type of architecture @var{arch}. @end deffn Example: @smallexample (gdb) guile (type-name (arch-uchar-type (current-arch))) "unsigned char" @end smallexample @node Disassembly In Guile @subsubsection Disassembly In Guile The disassembler can be invoked from Scheme code. Furthermore, the disassembler can take a Guile port as input, allowing one to disassemble from any source, and not just target memory. @c TODO: line length @deffn {Scheme Procedure} arch-disassemble arch start-pc @r{[}#:port port@r{]} @r{[}#:offset offset@r{]} @r{[}#:size size@r{]} @r{[}#:count count@r{]} Return a list of disassembled instructions starting from the memory address @var{start-pc}. The optional argument @var{port} specifies the input port to read bytes from. If @var{port} is @code{#f} then bytes are read from target memory. The optional argument @var{offset} specifies the address offset of the first byte in @var{port}. This is useful, for example, when @var{port} specifies a @samp{bytevector} and you want the bytevector to be disassembled as if it came from that address. The @var{start-pc} passed to the reader for @var{port} is offset by the same amount. Example: @smallexample (gdb) guile (use-modules (rnrs io ports)) (gdb) guile (define pc (value->integer (parse-and-eval "$pc"))) (gdb) guile (define mem (open-memory #:start pc)) (gdb) guile (define bv (get-bytevector-n mem 10)) (gdb) guile (define bv-port (open-bytevector-input-port bv)) (gdb) guile (define arch (current-arch)) (gdb) guile (arch-disassemble arch pc #:port bv-port #:offset pc) (((address . 4195516) (asm . "mov $0x4005c8,%edi") (length . 5))) @end smallexample The optional arguments @var{size} and @var{count} determine the number of instructions in the returned list. If either @var{size} or @var{count} is specified as zero, then no instructions are disassembled and an empty list is returned. If both the optional arguments @var{size} and @var{count} are specified, then a list of at most @var{count} disassembled instructions whose start address falls in the closed memory address interval from @var{start-pc} to (@var{start-pc} + @var{size} - 1) are returned. If @var{size} is not specified, but @var{count} is specified, then @var{count} number of instructions starting from the address @var{start-pc} are returned. If @var{count} is not specified but @var{size} is specified, then all instructions whose start address falls in the closed memory address interval from @var{start-pc} to (@var{start-pc} + @var{size} - 1) are returned. If neither @var{size} nor @var{count} are specified, then a single instruction at @var{start-pc} is returned. Each element of the returned list is an alist (associative list) with the following keys: @table @code @item address The value corresponding to this key is a Guile integer of the memory address of the instruction. @item asm The value corresponding to this key is a string value which represents the instruction with assembly language mnemonics. The assembly language flavor used is the same as that specified by the current CLI variable @code{disassembly-flavor}. @xref{Machine Code}. @item length The value corresponding to this key is the length of the instruction in bytes. @end table @end deffn @node I/O Ports in Guile @subsubsection I/O Ports in Guile @deffn {Scheme Procedure} input-port Return @value{GDBN}'s input port as a Guile port object. @end deffn @deffn {Scheme Procedure} output-port Return @value{GDBN}'s output port as a Guile port object. @end deffn @deffn {Scheme Procedure} error-port Return @value{GDBN}'s error port as a Guile port object. @end deffn @deffn {Scheme Procedure} stdio-port? object Return @code{#t} if @var{object} is a @value{GDBN} stdio port. Otherwise return @code{#f}. @end deffn @node Memory Ports in Guile @subsubsection Memory Ports in Guile @value{GDBN} provides a @code{port} interface to target memory. This allows Guile code to read/write target memory using Guile's port and bytevector functionality. The main routine is @code{open-memory} which returns a port object. One can then read/write memory using that object. @deffn {Scheme Procedure} open-memory @r{[}#:mode mode{]} @r{[}#:start address{]} @r{[}#:size size{]} Return a port object that can be used for reading and writing memory. The port will be open according to @var{mode}, which is the standard mode argument to Guile port open routines, except that the @samp{"a"} and @samp{"l"} modes are not supported. @xref{File Ports,,, guile, GNU Guile Reference Manual}. The @samp{"b"} (binary) character may be present, but is ignored: memory ports are binary only. If @samp{"0"} is appended then the port is marked as unbuffered. The default is @samp{"r"}, read-only and buffered. The chunk of memory that can be accessed can be bounded. If both @var{start} and @var{size} are unspecified, all of memory can be accessed. If only @var{start} is specified, all of memory from that point on can be accessed. If only @var{size} if specified, all memory in the range [0,@var{size}) can be accessed. If both are specified, all memory in the rane [@var{start},@var{start}+@var{size}) can be accessed. @end deffn @deffn {Scheme Procedure} memory-port? Return @code{#t} if @var{object} is an object of type @code{}. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} memory-port-range memory-port Return the range of @code{} @var{memory-port} as a list of two elements: @code{(start end)}. The range is @var{start} to @var{end} inclusive. @end deffn @deffn {Scheme Procedure} memory-port-read-buffer-size memory-port Return the size of the read buffer of @code{} @var{memory-port}. This procedure is deprecated and will be removed in @value{GDBN} 11. It returns 0 when using Guile 2.2 or later. @end deffn @deffn {Scheme Procedure} set-memory-port-read-buffer-size! memory-port size Set the size of the read buffer of @code{} @var{memory-port} to @var{size}. The result is unspecified. This procedure is deprecated and will be removed in @value{GDBN} 11. When @value{GDBN} is built with Guile 2.2 or later, you can call @code{setvbuf} instead (@pxref{Buffering, @code{setvbuf},, guile, GNU Guile Reference Manual}). @end deffn @deffn {Scheme Procedure} memory-port-write-buffer-size memory-port Return the size of the write buffer of @code{} @var{memory-port}. This procedure is deprecated and will be removed in @value{GDBN} 11. It returns 0 when @value{GDBN} is built with Guile 2.2 or later. @end deffn @deffn {Scheme Procedure} set-memory-port-write-buffer-size! memory-port size Set the size of the write buffer of @code{} @var{memory-port} to @var{size}. The result is unspecified. This procedure is deprecated and will be removed in @value{GDBN} 11. When @value{GDBN} is built with Guile 2.2 or later, you can call @code{setvbuf} instead. @end deffn A memory port is closed like any other port, with @code{close-port}. Combined with Guile's @code{bytevectors}, memory ports provide a lot of utility. For example, to fill a buffer of 10 integers in memory, one can do something like the following. @smallexample ;; In the program: int buffer[10]; (use-modules (rnrs bytevectors)) (use-modules (rnrs io ports)) (define addr (parse-and-eval "buffer")) (define n 10) (define byte-size (* n 4)) (define mem-port (open-memory #:mode "r+" #:start (value->integer addr) #:size byte-size)) (define byte-vec (make-bytevector byte-size)) (do ((i 0 (+ i 1))) ((>= i n)) (bytevector-s32-native-set! byte-vec (* i 4) (* i 42))) (put-bytevector mem-port byte-vec) (close-port mem-port) @end smallexample @node Iterators In Guile @subsubsection Iterators In Guile @cindex guile iterators @tindex A simple iterator facility is provided to allow, for example, iterating over the set of program symbols without having to first construct a list of all of them. A useful contribution would be to add support for SRFI 41 and SRFI 45. @deffn {Scheme Procedure} make-iterator object progress next! A @code{} object is constructed with the @code{make-iterator} procedure. It takes three arguments: the object to be iterated over, an object to record the progress of the iteration, and a procedure to return the next element in the iteration, or an implementation chosen value to denote the end of iteration. By convention, end of iteration is marked with @code{(end-of-iteration)}, and may be tested with the @code{end-of-iteration?} predicate. The result of @code{(end-of-iteration)} is chosen so that it is not otherwise used by the @code{(gdb)} module. If you are using @code{} in your own code it is your responsibility to maintain this invariant. A trivial example for illustration's sake: @smallexample (use-modules (gdb iterator)) (define my-list (list 1 2 3)) (define iter (make-iterator my-list my-list (lambda (iter) (let ((l (iterator-progress iter))) (if (eq? l '()) (end-of-iteration) (begin (set-iterator-progress! iter (cdr l)) (car l))))))) @end smallexample Here is a slightly more realistic example, which computes a list of all the functions in @code{my-global-block}. @smallexample (use-modules (gdb iterator)) (define this-sal (find-pc-line (frame-pc (selected-frame)))) (define this-symtab (sal-symtab this-sal)) (define this-global-block (symtab-global-block this-symtab)) (define syms-iter (make-block-symbols-iterator this-global-block)) (define functions (iterator-filter symbol-function? syms-iter)) @end smallexample @end deffn @deffn {Scheme Procedure} iterator? object Return @code{#t} if @var{object} is a @code{} object. Otherwise return @code{#f}. @end deffn @deffn {Scheme Procedure} iterator-object iterator Return the first argument that was passed to @code{make-iterator}. This is the object being iterated over. @end deffn @deffn {Scheme Procedure} iterator-progress iterator Return the object tracking iteration progress. @end deffn @deffn {Scheme Procedure} set-iterator-progress! iterator new-value Set the object tracking iteration progress. @end deffn @deffn {Scheme Procedure} iterator-next! iterator Invoke the procedure that was the third argument to @code{make-iterator}, passing it one argument, the @code{} object. The result is either the next element in the iteration, or an end marker as implemented by the @code{next!} procedure. By convention the end marker is the result of @code{(end-of-iteration)}. @end deffn @deffn {Scheme Procedure} end-of-iteration Return the Scheme object that denotes end of iteration. @end deffn @deffn {Scheme Procedure} end-of-iteration? object Return @code{#t} if @var{object} is the end of iteration marker. Otherwise return @code{#f}. @end deffn These functions are provided by the @code{(gdb iterator)} module to assist in using iterators. @deffn {Scheme Procedure} make-list-iterator list Return a @code{} object that will iterate over @var{list}. @end deffn @deffn {Scheme Procedure} iterator->list iterator Return the elements pointed to by @var{iterator} as a list. @end deffn @deffn {Scheme Procedure} iterator-map proc iterator Return the list of objects obtained by applying @var{proc} to the object pointed to by @var{iterator} and to each subsequent object. @end deffn @deffn {Scheme Procedure} iterator-for-each proc iterator Apply @var{proc} to each element pointed to by @var{iterator}. The result is unspecified. @end deffn @deffn {Scheme Procedure} iterator-filter pred iterator Return the list of elements pointed to by @var{iterator} that satisfy @var{pred}. @end deffn @deffn {Scheme Procedure} iterator-until pred iterator Run @var{iterator} until the result of @code{(pred element)} is true and return that as the result. Otherwise return @code{#f}. @end deffn @node Guile Auto-loading @subsection Guile Auto-loading @cindex guile auto-loading When a new object file is read (for example, due to the @code{file} command, or because the inferior has loaded a shared library), @value{GDBN} will look for Guile support scripts in two ways: @file{@var{objfile}-gdb.scm} and the @code{.debug_gdb_scripts} section. @xref{Auto-loading extensions}. The auto-loading feature is useful for supplying application-specific debugging commands and scripts. Auto-loading can be enabled or disabled, and the list of auto-loaded scripts can be printed. @table @code @anchor{set auto-load guile-scripts} @kindex set auto-load guile-scripts @item set auto-load guile-scripts [on|off] Enable or disable the auto-loading of Guile scripts. @anchor{show auto-load guile-scripts} @kindex show auto-load guile-scripts @item show auto-load guile-scripts Show whether auto-loading of Guile scripts is enabled or disabled. @anchor{info auto-load guile-scripts} @kindex info auto-load guile-scripts @cindex print list of auto-loaded Guile scripts @item info auto-load guile-scripts [@var{regexp}] Print the list of all Guile scripts that @value{GDBN} auto-loaded. Also printed is the list of Guile scripts that were mentioned in the @code{.debug_gdb_scripts} section and were not found. This is useful because their names are not printed when @value{GDBN} tries to load them and fails. There may be many of them, and printing an error message for each one is problematic. If @var{regexp} is supplied only Guile scripts with matching names are printed. Example: @smallexample (gdb) info auto-load guile-scripts Loaded Script Yes scm-section-script.scm full name: /tmp/scm-section-script.scm No my-foo-pretty-printers.scm @end smallexample @end table When reading an auto-loaded file, @value{GDBN} sets the @dfn{current objfile}. This is available via the @code{current-objfile} procedure (@pxref{Objfiles In Guile}). This can be useful for registering objfile-specific pretty-printers. @node Guile Modules @subsection Guile Modules @cindex guile modules @value{GDBN} comes with several modules to assist writing Guile code. @menu * Guile Printing Module:: Building and registering pretty-printers * Guile Types Module:: Utilities for working with types @end menu @node Guile Printing Module @subsubsection Guile Printing Module This module provides a collection of utilities for working with pretty-printers. Usage: @smallexample (use-modules (gdb printing)) @end smallexample @deffn {Scheme Procedure} prepend-pretty-printer! object printer Add @var{printer} to the front of the list of pretty-printers for @var{object}. The @var{object} must either be a @code{} object, or @code{#f} in which case @var{printer} is added to the global list of printers. @end deffn @deffn {Scheme Procecure} append-pretty-printer! object printer Add @var{printer} to the end of the list of pretty-printers for @var{object}. The @var{object} must either be a @code{} object, or @code{#f} in which case @var{printer} is added to the global list of printers. @end deffn @node Guile Types Module @subsubsection Guile Types Module This module provides a collection of utilities for working with @code{} objects. Usage: @smallexample (use-modules (gdb types)) @end smallexample @deffn {Scheme Procedure} get-basic-type type Return @var{type} with const and volatile qualifiers stripped, and with typedefs and C@t{++} references converted to the underlying type. C@t{++} example: @smallexample typedef const int const_int; const_int foo (3); const_int& foo_ref (foo); int main () @{ return 0; @} @end smallexample Then in gdb: @smallexample (gdb) start (gdb) guile (use-modules (gdb) (gdb types)) (gdb) guile (define foo-ref (parse-and-eval "foo_ref")) (gdb) guile (get-basic-type (value-type foo-ref)) int @end smallexample @end deffn @deffn {Scheme Procedure} type-has-field-deep? type field Return @code{#t} if @var{type}, assumed to be a type with fields (e.g., a structure or union), has field @var{field}. Otherwise return @code{#f}. This searches baseclasses, whereas @code{type-has-field?} does not. @end deffn @deffn {Scheme Procedure} make-enum-hashtable enum-type Return a Guile hash table produced from @var{enum-type}. Elements in the hash table are referenced with @code{hashq-ref}. @end deffn