Debugging with GDB: Convenience Vars |
---|
Next: Convenience Funs, Previous: Value History, Up: Data [Contents][Index]
GDB provides convenience variables that you can use within GDB to hold on to a value and refer to it later. These variables exist entirely within GDB; they are not part of your program, and setting a convenience variable has no direct effect on further execution of your program. That is why you can use them freely.
Convenience variables are prefixed with ‘$’. Any name preceded by ‘$’ can be used for a convenience variable, unless it is one of the predefined machine-specific register names (see Registers). (Value history references, in contrast, are numbers preceded by ‘$’. See Value History.)
You can save a value in a convenience variable with an assignment expression, just as you would set a variable in your program. For example:
set $foo = *object_ptr
would save in $foo
the value contained in the object pointed to by
object_ptr
.
Using a convenience variable for the first time creates it, but its
value is void
until you assign a new value. You can alter the
value with another assignment at any time.
Convenience variables have no fixed types. You can assign a convenience variable any type of value, including structures and arrays, even if that variable already has a value of a different type. The convenience variable, when used as an expression, has the type of its current value.
show convenience
Print a list of convenience variables used so far, and their values,
as well as a list of the convenience functions.
Abbreviated show conv
.
init-if-undefined $variable = expression
Set a convenience variable if it has not already been set. This is useful for user-defined commands that keep some state. It is similar, in concept, to using local static variables with initializers in C (except that convenience variables are global). It can also be used to allow users to override default values used in a command script.
If the variable is already defined then the expression is not evaluated so any side-effects do not occur.
One of the ways to use a convenience variable is as a counter to be incremented or a pointer to be advanced. For example, to print a field from successive elements of an array of structures:
set $i = 0 print bar[$i++]->contents
Repeat that command by typing RET.
Some convenience variables are created automatically by GDB and given values likely to be useful.
$_
The variable $_
is automatically set by the x
command to
the last address examined (see Examining Memory). Other
commands which provide a default address for x
to examine also
set $_
to that address; these commands include info line
and info breakpoint
. The type of $_
is void *
except when set by the x
command, in which case it is a pointer
to the type of $__
.
$__
The variable $__
is automatically set by the x
command
to the value found in the last address examined. Its type is chosen
to match the format in which the data was printed.
$_exitcode
When the program being debugged terminates normally, GDB
automatically sets this variable to the exit code of the program, and
resets $_exitsignal
to void
.
$_exitsignal
When the program being debugged dies due to an uncaught signal,
GDB automatically sets this variable to that signal’s number,
and resets $_exitcode
to void
.
To distinguish between whether the program being debugged has exited
(i.e., $_exitcode
is not void
) or signalled (i.e.,
$_exitsignal
is not void
), the convenience function
$_isvoid
can be used (see Convenience
Functions). For example, considering the following source code:
#include <signal.h> int main (int argc, char *argv[]) { raise (SIGALRM); return 0; }
A valid way of telling whether the program being debugged has exited or signalled would be:
(gdb) define has_exited_or_signalled Type commands for definition of ``has_exited_or_signalled''. End with a line saying just ``end''. >if $_isvoid ($_exitsignal) >echo The program has exited\n >else >echo The program has signalled\n >end >end (gdb) run Starting program: Program terminated with signal SIGALRM, Alarm clock. The program no longer exists. (gdb) has_exited_or_signalled The program has signalled
As can be seen, GDB correctly informs that the program being
debugged has signalled, since it calls raise
and raises a
SIGALRM
signal. If the program being debugged had not called
raise
, then GDB would report a normal exit:
(gdb) has_exited_or_signalled The program has exited
$_exception
The variable $_exception
is set to the exception object being
thrown at an exception-related catchpoint. See Set Catchpoints.
$_probe_argc
$_probe_arg0…$_probe_arg11
Arguments to a static probe. See Static Probe Points.
$_sdata
The variable $_sdata
contains extra collected static tracepoint
data. See Tracepoint Action Lists. Note that
$_sdata
could be empty, if not inspecting a trace buffer, or
if extra static tracepoint data has not been collected.
$_siginfo
The variable $_siginfo
contains extra signal information
(see extra signal information). Note that $_siginfo
could be empty, if the application has not yet received any signals.
For example, it will be empty before you execute the run
command.
$_tlb
The variable $_tlb
is automatically set when debugging
applications running on MS-Windows in native mode or connected to
gdbserver that supports the qGetTIBAddr
request.
See General Query Packets.
This variable contains the address of the thread information block.
$_inferior
The number of the current inferior. See Debugging Multiple Inferiors and Programs.
$_thread
The thread number of the current thread. See thread numbers.
$_gthread
The global number of the current thread. See global thread numbers.
Next: Convenience Funs, Previous: Value History, Up: Data [Contents][Index]