Once you think you have found an error in your program, you might want to find out for certain whether correcting the apparent error would lead to correct results in the rest of the run. You can find the answer by experiment, using the GDB features for altering execution of the program.
For example, you can store new values into variables or memory locations, give your program a signal, restart it at a different address, or even return prematurely from a function.
To alter the value of a variable, evaluate an assignment expression. See section Expressions. For example,
print x=4
stores the value 4 into the variable x
, and then prints the
value of the assignment expression (which is 4).
See section Using GDB with Different Languages, for more
information on operators in supported languages.
If you are not interested in seeing the value of the assignment, use the
set
command instead of the print
command. set
is
really the same as print
except that the expression's value is
not printed and is not put in the value history (see section Value history). The expression is evaluated only for its effects.
If the beginning of the argument string of the set
command
appears identical to a set
subcommand, use the set
variable
command instead of just set
. This command is identical
to set
except for its lack of subcommands. For example, if
your program has a variable width
, you get
an error if you try to set a new value with just `set width=13',
because GDB has the command set width
:
(gdb) whatis width type = double (gdb) p width $4 = 13 (gdb) set width=47 Invalid syntax in expression.
The invalid expression, of course, is `=47'. In
order to actually set the program's variable width
, use
(gdb) set var width=47
GDB allows more implicit conversions in assignments than C; you can freely store an integer value into a pointer variable or vice versa, and you can convert any structure to any other structure that is the same length or shorter.
To store values into arbitrary places in memory, use the `{...}'
construct to generate a value of specified type at a specified address
(see section Expressions). For example, {int}0x83040
refers
to memory location 0x83040
as an integer (which implies a certain size
and representation in memory), and
set {int}0x83040 = 4
stores the value 4 into that memory location.
Ordinarily, when you continue your program, you do so at the place where
it stopped, with the continue
command. You can instead continue at
an address of your own choosing, with the following commands:
jump linespec
jump
command does not change the current stack frame, or
the stack pointer, or the contents of any memory location or any
register other than the program counter. If line linespec is in
a different function from the one currently executing, the results may
be bizarre if the two functions expect different patterns of arguments or
of local variables. For this reason, the jump
command requests
confirmation if the specified line is not in the function currently
executing. However, even bizarre results are predictable if you are
well acquainted with the machine-language code of your program.
jump *address
You can get much the same effect as the jump
command by storing a
new value into the register $pc
. The difference is that this
does not start your program running; it only changes the address of where it
will run when you continue. For example,
set $pc = 0x485
makes the next continue
command or stepping command execute at
address 0x485
, rather than at the address where your program stopped.
See section Continuing and stepping.
The most common occasion to use the jump
command is to back up--
perhaps with more breakpoints set--over a portion of a program that has
already executed, in order to examine its execution in more detail.
signal signal
signal 2
and signal
SIGINT
are both ways of sending an interrupt signal.
Alternatively, if signal is zero, continue execution without
giving a signal. This is useful when your program stopped on account of
a signal and would ordinary see the signal when resumed with the
continue
command; `signal 0' causes it to resume without a
signal.
signal
does not repeat when you press RET a second time
after executing the command.
Invoking the signal
command is not the same as invoking the
kill
utility from the shell. Sending a signal with kill
causes GDB to decide what to do with the signal depending on
the signal handling tables (see section Signals). The signal
command
passes the signal directly to your program.
return
return expression
return
command. If you give an
expression argument, its value is used as the function's return
value.
When you use return
, GDB discards the selected stack frame
(and all frames within it). You can think of this as making the
discarded frame return prematurely. If you wish to specify a value to
be returned, give that value as the argument to return
.
This pops the selected stack frame (see section Selecting a frame), and any other frames inside of it, leaving its caller as the innermost remaining frame. That frame becomes selected. The specified value is stored in the registers used for returning values of functions.
The return
command does not resume execution; it leaves the
program stopped in the state that would exist if the function had just
returned. In contrast, the finish
command (see section Continuing and stepping) resumes execution until the
selected stack frame returns naturally.
call expr
void
returned values.
You can use this variant of the print
command if you want to
execute a function from your program, but without cluttering the output
with void
returned values. If the result is not void, it
is printed and saved in the value history.
A new user-controlled variable, call_scratch_address, specifies the location of a scratch area to be used when GDB calls a function in the target. This is necessary because the usual method of putting the scratch area on the stack does not work in systems that have separate instruction and data spaces.
By default, GDB opens the file containing your program's executable code (or the corefile) read-only. This prevents accidental alterations to machine code; but it also prevents you from intentionally patching your program's binary.
If you'd like to be able to patch the binary, you can specify that
explicitly with the set write
command. For example, you might
want to turn on internal debugging flags, or even to make emergency
repairs.
set write on
set write off
exec-file
or core-file
command) after changing set write
, for your new setting to take
effect.
show write
Go to the first, previous, next, last section, table of contents.