blob: e0d7e79f33c70747a2da8240e60c5f878b91ceeb [file] [log] [blame]
<html lang="en">
<head>
<title>Process Record and Replay - 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="Reverse-Execution.html#Reverse-Execution" title="Reverse Execution">
<link rel="next" href="Stack.html#Stack" title="Stack">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
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>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Process-Record-and-Replay"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Stack.html#Stack">Stack</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Reverse-Execution.html#Reverse-Execution">Reverse Execution</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
<hr>
</div>
<h2 class="chapter">7 Recording Inferior's Execution and Replaying It</h2>
<p><a name="index-process-record-and-replay-373"></a><a name="index-recording-inferior_0027s-execution-and-replaying-it-374"></a>
On some platforms, <span class="sc">gdb</span> provides a special <dfn>process record
and replay</dfn> target that can record a log of the process execution, and
replay it later with both forward and reverse execution commands.
<p><a name="index-replay-mode-375"></a>When this target is in use, if the execution log includes the record
for the next instruction, <span class="sc">gdb</span> will debug in <dfn>replay
mode</dfn>. In the replay mode, the inferior does not really execute code
instructions. Instead, all the events that normally happen during
code execution are taken from the execution log. While code is not
really executed in replay mode, the values of registers (including the
program counter register) and the memory of the inferior are still
changed as they normally would. Their contents are taken from the
execution log.
<p><a name="index-record-mode-376"></a>If the record for the next instruction is not in the execution log,
<span class="sc">gdb</span> will debug in <dfn>record mode</dfn>. In this mode, the
inferior executes normally, and <span class="sc">gdb</span> records the execution log
for future replay.
<p>The process record and replay target supports reverse execution
(see <a href="Reverse-Execution.html#Reverse-Execution">Reverse Execution</a>), even if the platform on which the
inferior runs does not. However, the reverse execution is limited in
this case by the range of the instructions recorded in the execution
log. In other words, reverse execution on platforms that don't
support it directly can only be done in the replay mode.
<p>When debugging in the reverse direction, <span class="sc">gdb</span> will work in
replay mode as long as the execution log includes the record for the
previous instruction; otherwise, it will work in record mode, if the
platform supports reverse execution, or stop if not.
<p>For architecture environments that support process record and replay,
<span class="sc">gdb</span> provides the following commands:
<a name="index-target-record-377"></a>
<a name="index-record-378"></a>
<a name="index-rec-379"></a>
<dl><dt><code>target record</code><dd>This command starts the process record and replay target. The process
record and replay target can only debug a process that is already
running. Therefore, you need first to start the process with the
<kbd>run</kbd> or <kbd>start</kbd> commands, and then start the recording with
the <kbd>target record</kbd> command.
<p>Both <code>record</code> and <code>rec</code> are aliases of <code>target record</code>.
<p><a name="index-displaced-stepping_002c-and-process-record-and-replay-380"></a>Displaced stepping (see <a href="Maintenance-Commands.html#Maintenance-Commands">displaced stepping</a>)
will be automatically disabled when process record and replay target
is started. That's because the process record and replay target
doesn't support displaced stepping.
<p><a name="index-non_002dstop-mode_002c-and-process-record-and-replay-381"></a><a name="index-asynchronous-execution_002c-and-process-record-and-replay-382"></a>If the inferior is in the non-stop mode (see <a href="Non_002dStop-Mode.html#Non_002dStop-Mode">Non-Stop Mode</a>) or in
the asynchronous execution mode (see <a href="Background-Execution.html#Background-Execution">Background Execution</a>), the
process record and replay target cannot be started because it doesn't
support these two modes.
<p><a name="index-record-stop-383"></a><a name="index-rec-s-384"></a><br><dt><code>record stop</code><dd>Stop the process record and replay target. When process record and
replay target stops, the entire execution log will be deleted and the
inferior will either be terminated, or will remain in its final state.
<p>When you stop the process record and replay target in record mode (at
the end of the execution log), the inferior will be stopped at the
next instruction that would have been recorded. In other words, if
you record for a while and then stop recording, the inferior process
will be left in the same state as if the recording never happened.
<p>On the other hand, if the process record and replay target is stopped
while in replay mode (that is, not at the end of the execution log,
but at some earlier point), the inferior process will become &ldquo;live&rdquo;
at that earlier state, and it will then be possible to continue the
usual &ldquo;live&rdquo; debugging of the process from that state.
<p>When the inferior process exits, or <span class="sc">gdb</span> detaches from it,
process record and replay target will automatically stop itself.
<p><a name="index-record-save-385"></a><br><dt><code>record save </code><var>filename</var><dd>Save the execution log to a file <samp><var>filename</var></samp>.
Default filename is <samp><span class="file">gdb_record.</span><var>process_id</var></samp>, where
<var>process_id</var> is the process ID of the inferior.
<p><a name="index-record-restore-386"></a><br><dt><code>record restore </code><var>filename</var><dd>Restore the execution log from a file <samp><var>filename</var></samp>.
File must have been created with <code>record save</code>.
<p><a name="index-set-record-insn_002dnumber_002dmax-387"></a><br><dt><code>set record insn-number-max </code><var>limit</var><dd>Set the limit of instructions to be recorded. Default value is 200000.
<p>If <var>limit</var> is a positive number, then <span class="sc">gdb</span> will start
deleting instructions from the log once the number of the record
instructions becomes greater than <var>limit</var>. For every new recorded
instruction, <span class="sc">gdb</span> will delete the earliest recorded
instruction to keep the number of recorded instructions at the limit.
(Since deleting recorded instructions loses information, <span class="sc">gdb</span>
lets you control what happens when the limit is reached, by means of
the <code>stop-at-limit</code> option, described below.)
<p>If <var>limit</var> is zero, <span class="sc">gdb</span> will never delete recorded
instructions from the execution log. The number of recorded
instructions is unlimited in this case.
<p><a name="index-show-record-insn_002dnumber_002dmax-388"></a><br><dt><code>show record insn-number-max</code><dd>Show the limit of instructions to be recorded.
<p><a name="index-set-record-stop_002dat_002dlimit-389"></a><br><dt><code>set record stop-at-limit</code><dd>Control the behavior when the number of recorded instructions reaches
the limit. If ON (the default), <span class="sc">gdb</span> will stop when the limit
is reached for the first time and ask you whether you want to stop the
inferior or continue running it and recording the execution log. If
you decide to continue recording, each new recorded instruction will
cause the oldest one to be deleted.
<p>If this option is OFF, <span class="sc">gdb</span> will automatically delete the
oldest record to make room for each new one, without asking.
<p><a name="index-show-record-stop_002dat_002dlimit-390"></a><br><dt><code>show record stop-at-limit</code><dd>Show the current setting of <code>stop-at-limit</code>.
<p><a name="index-set-record-memory_002dquery-391"></a><br><dt><code>set record memory-query</code><dd>Control the behavior when <span class="sc">gdb</span> is unable to record memory
changes caused by an instruction. If ON, <span class="sc">gdb</span> will query
whether to stop the inferior in that case.
<p>If this option is OFF (the default), <span class="sc">gdb</span> will automatically
ignore the effect of such instructions on memory. Later, when
<span class="sc">gdb</span> replays this execution log, it will mark the log of this
instruction as not accessible, and it will not affect the replay
results.
<p><a name="index-show-record-memory_002dquery-392"></a><br><dt><code>show record memory-query</code><dd>Show the current setting of <code>memory-query</code>.
<p><a name="index-info-record-393"></a><br><dt><code>info record</code><dd>Show various statistics about the state of process record and its
in-memory execution log buffer, including:
<ul>
<li>Whether in record mode or replay mode.
<li>Lowest recorded instruction number (counting from when the current execution log started recording instructions).
<li>Highest recorded instruction number.
<li>Current instruction about to be replayed (if in replay mode).
<li>Number of instructions contained in the execution log.
<li>Maximum number of instructions that may be contained in the execution log.
</ul>
<p><a name="index-record-delete-394"></a><a name="index-rec-del-395"></a><br><dt><code>record delete</code><dd>When record target runs in replay mode (&ldquo;in the past&rdquo;), delete the
subsequent execution log and begin to record a new execution log starting
from the current address. This means you will abandon the previously
recorded &ldquo;future&rdquo; and begin recording a new &ldquo;future&rdquo;.
</dl>
</body></html>