toolchain/share/doc/gdb/Reverse-Execution.html

155 lines
9.4 KiB
HTML
Raw Permalink Normal View History

2024-01-10 05:24:32 +00:00
<html lang="en">
<head>
<title>Reverse Execution - Debugging with GDB</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="Debugging with GDB">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="prev" href="Stopping.html#Stopping" title="Stopping">
<link rel="next" href="Process-Record-and-Replay.html#Process-Record-and-Replay" title="Process Record and Replay">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
Copyright (C) 1988-2019 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software'' and ``Free Software Needs
Free Documentation'', with the Front-Cover Texts being ``A GNU Manual,''
and with the Back-Cover Texts as in (a) below.
(a) The FSF's Back-Cover Text is: ``You are free to copy and modify
this GNU Manual. Buying copies from GNU Press supports the FSF in
developing GNU and promoting software freedom.''
-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
</head>
<body>
<div class="node">
<a name="Reverse-Execution"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Process-Record-and-Replay.html#Process-Record-and-Replay">Process Record and Replay</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Stopping.html#Stopping">Stopping</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
<hr>
</div>
<h2 class="chapter">6 Running programs backward</h2>
<p><a name="index-reverse-execution-441"></a><a name="index-running-programs-backward-442"></a>
When you are debugging a program, it is not unusual to realize that
you have gone too far, and some event of interest has already happened.
If the target environment supports it, <span class="sc">gdb</span> can allow you to
&ldquo;rewind&rdquo; the program by running it backward.
<p>A target environment that supports reverse execution should be able
to &ldquo;undo&rdquo; the changes in machine state that have taken place as the
program was executing normally. Variables, registers etc. should
revert to their previous values. Obviously this requires a great
deal of sophistication on the part of the target environment; not
all target environments can support reverse execution.
<p>When a program is executed in reverse, the instructions that
have most recently been executed are &ldquo;un-executed&rdquo;, in reverse
order. The program counter runs backward, following the previous
thread of execution in reverse. As each instruction is &ldquo;un-executed&rdquo;,
the values of memory and/or registers that were changed by that
instruction are reverted to their previous states. After executing
a piece of source code in reverse, all side effects of that code
should be &ldquo;undone&rdquo;, and all variables should be returned to their
prior values<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a>.
<p>If you are debugging in a target environment that supports
reverse execution, <span class="sc">gdb</span> provides the following commands.
<a name="index-reverse_002dcontinue-443"></a>
<a name="index-rc-_0040r_007b_0028_0040code_007breverse_002dcontinue_007d_0029_007d-444"></a>
<dl><dt><code>reverse-continue </code><span class="roman">[</span><var>ignore-count</var><span class="roman">]</span><dt><code>rc </code><span class="roman">[</span><var>ignore-count</var><span class="roman">]</span><dd>Beginning at the point where your program last stopped, start executing
in reverse. Reverse execution will stop for breakpoints and synchronous
exceptions (signals), just like normal execution. Behavior of
asynchronous signals depends on the target environment.
<p><a name="index-reverse_002dstep-445"></a><a name="index-rs-_0040r_007b_0028_0040code_007bstep_007d_0029_007d-446"></a><br><dt><code>reverse-step </code><span class="roman">[</span><var>count</var><span class="roman">]</span><dd>Run the program backward until control reaches the start of a
different source line; then stop it, and return control to <span class="sc">gdb</span>.
<p>Like the <code>step</code> command, <code>reverse-step</code> will only stop
at the beginning of a source line. It &ldquo;un-executes&rdquo; the previously
executed source line. If the previous source line included calls to
debuggable functions, <code>reverse-step</code> will step (backward) into
the called function, stopping at the beginning of the <em>last</em>
statement in the called function (typically a return statement).
<p>Also, as with the <code>step</code> command, if non-debuggable functions are
called, <code>reverse-step</code> will run thru them backward without stopping.
<p><a name="index-reverse_002dstepi-447"></a><a name="index-rsi-_0040r_007b_0028_0040code_007breverse_002dstepi_007d_0029_007d-448"></a><br><dt><code>reverse-stepi </code><span class="roman">[</span><var>count</var><span class="roman">]</span><dd>Reverse-execute one machine instruction. Note that the instruction
to be reverse-executed is <em>not</em> the one pointed to by the program
counter, but the instruction executed prior to that one. For instance,
if the last instruction was a jump, <code>reverse-stepi</code> will take you
back from the destination of the jump to the jump instruction itself.
<p><a name="index-reverse_002dnext-449"></a><a name="index-rn-_0040r_007b_0028_0040code_007breverse_002dnext_007d_0029_007d-450"></a><br><dt><code>reverse-next </code><span class="roman">[</span><var>count</var><span class="roman">]</span><dd>Run backward to the beginning of the previous line executed in
the current (innermost) stack frame. If the line contains function
calls, they will be &ldquo;un-executed&rdquo; without stopping. Starting from
the first line of a function, <code>reverse-next</code> will take you back
to the caller of that function, <em>before</em> the function was called,
just as the normal <code>next</code> command would take you from the last
line of a function back to its return to its caller
<a rel="footnote" href="#fn-2" name="fnd-2"><sup>2</sup></a>.
<p><a name="index-reverse_002dnexti-451"></a><a name="index-rni-_0040r_007b_0028_0040code_007breverse_002dnexti_007d_0029_007d-452"></a><br><dt><code>reverse-nexti </code><span class="roman">[</span><var>count</var><span class="roman">]</span><dd>Like <code>nexti</code>, <code>reverse-nexti</code> executes a single instruction
in reverse, except that called functions are &ldquo;un-executed&rdquo; atomically.
That is, if the previously executed instruction was a return from
another function, <code>reverse-nexti</code> will continue to execute
in reverse until the call to that function (from the current stack
frame) is reached.
<p><a name="index-reverse_002dfinish-453"></a><br><dt><code>reverse-finish</code><dd>Just as the <code>finish</code> command takes you to the point where the
current function returns, <code>reverse-finish</code> takes you to the point
where it was called. Instead of ending up at the end of the current
function invocation, you end up at the beginning.
<p><a name="index-set-exec_002ddirection-454"></a><br><dt><code>set exec-direction</code><dd>Set the direction of target execution.
<br><dt><code>set exec-direction reverse</code><dd><a name="index-execute-forward-or-backward-in-time-455"></a><span class="sc">gdb</span> will perform all execution commands in reverse, until the
exec-direction mode is changed to &ldquo;forward&rdquo;. Affected commands include
<code>step, stepi, next, nexti, continue, and finish</code>. The <code>return</code>
command cannot be used in reverse mode.
<br><dt><code>set exec-direction forward</code><dd><span class="sc">gdb</span> will perform all execution commands in the normal fashion.
This is the default.
</dl>
<div class="footnote">
<hr>
<h4>Footnotes</h4><p class="footnote"><small>[<a name="fn-1" href="#fnd-1">1</a>]</small>
Note that some side effects are easier to undo than others. For instance,
memory and registers are relatively easy, but device I/O is hard. Some
targets may be able undo things like device I/O, and some may not.
<p>The contract between <span class="sc">gdb</span> and the reverse executing target
requires only that the target do something reasonable when
<span class="sc">gdb</span> tells it to execute backwards, and then report the
results back to <span class="sc">gdb</span>. Whatever the target reports back to
<span class="sc">gdb</span>, <span class="sc">gdb</span> will report back to the user. <span class="sc">gdb</span>
assumes that the memory and registers that the target reports are in a
consistant state, but <span class="sc">gdb</span> accepts whatever it is given.
</p>
<p class="footnote"><small>[<a name="fn-2" href="#fnd-2">2</a>]</small> Unless the code is too heavily optimized.</p>
<hr></div>
</body></html>