toolchain/share/doc/gdb/tfind.html

150 lines
7.2 KiB
HTML

<html lang="en">
<head>
<title>tfind - 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="up" href="Analyze-Collected-Data.html#Analyze-Collected-Data" title="Analyze Collected Data">
<link rel="next" href="tdump.html#tdump" title="tdump">
<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="tfind"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="tdump.html#tdump">tdump</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Analyze-Collected-Data.html#Analyze-Collected-Data">Analyze Collected Data</a>
<hr>
</div>
<h4 class="subsection">13.2.1 <code>tfind </code><var>n</var></h4>
<p><a name="index-tfind-927"></a><a name="index-select-trace-snapshot-928"></a><a name="index-find-trace-snapshot-929"></a>The basic command for selecting a trace snapshot from the buffer is
<code>tfind </code><var>n</var>, which finds trace snapshot number <var>n</var>,
counting from zero. If no argument <var>n</var> is given, the next
snapshot is selected.
<p>Here are the various forms of using the <code>tfind</code> command.
<dl>
<dt><code>tfind start</code><dd>Find the first snapshot in the buffer. This is a synonym for
<code>tfind 0</code> (since 0 is the number of the first snapshot).
<br><dt><code>tfind none</code><dd>Stop debugging trace snapshots, resume <em>live</em> debugging.
<br><dt><code>tfind end</code><dd>Same as &lsquo;<samp><span class="samp">tfind none</span></samp>&rsquo;.
<br><dt><code>tfind</code><dd>No argument means find the next trace snapshot or find the first
one if no trace snapshot is selected.
<br><dt><code>tfind -</code><dd>Find the previous trace snapshot before the current one. This permits
retracing earlier steps.
<br><dt><code>tfind tracepoint </code><var>num</var><dd>Find the next snapshot associated with tracepoint <var>num</var>. Search
proceeds forward from the last examined trace snapshot. If no
argument <var>num</var> is given, it means find the next snapshot collected
for the same tracepoint as the current snapshot.
<br><dt><code>tfind pc </code><var>addr</var><dd>Find the next snapshot associated with the value <var>addr</var> of the
program counter. Search proceeds forward from the last examined trace
snapshot. If no argument <var>addr</var> is given, it means find the next
snapshot with the same value of PC as the current snapshot.
<br><dt><code>tfind outside </code><var>addr1</var><code>, </code><var>addr2</var><dd>Find the next snapshot whose PC is outside the given range of
addresses (exclusive).
<br><dt><code>tfind range </code><var>addr1</var><code>, </code><var>addr2</var><dd>Find the next snapshot whose PC is between <var>addr1</var> and
<var>addr2</var> (inclusive).
<br><dt><code>tfind line </code><span class="roman">[</span><var>file</var><code>:</code><span class="roman">]</span><var>n</var><dd>Find the next snapshot associated with the source line <var>n</var>. If
the optional argument <var>file</var> is given, refer to line <var>n</var> in
that source file. Search proceeds forward from the last examined
trace snapshot. If no argument <var>n</var> is given, it means find the
next line other than the one currently being examined; thus saying
<code>tfind line</code> repeatedly can appear to have the same effect as
stepping from line to line in a <em>live</em> debugging session.
</dl>
<p>The default arguments for the <code>tfind</code> commands are specifically
designed to make it easy to scan through the trace buffer. For
instance, <code>tfind</code> with no argument selects the next trace
snapshot, and <code>tfind -</code> with no argument selects the previous
trace snapshot. So, by giving one <code>tfind</code> command, and then
simply hitting &lt;RET&gt; repeatedly you can examine all the trace
snapshots in order. Or, by saying <code>tfind -</code> and then hitting
&lt;RET&gt; repeatedly you can examine the snapshots in reverse order.
The <code>tfind line</code> command with no argument selects the snapshot
for the next source line executed. The <code>tfind pc</code> command with
no argument selects the next snapshot with the same program counter
(PC) as the current frame. The <code>tfind tracepoint</code> command with
no argument selects the next trace snapshot collected by the same
tracepoint as the current one.
<p>In addition to letting you scan through the trace buffer manually,
these commands make it easy to construct <span class="sc">gdb</span> scripts that
scan through the trace buffer and print out whatever collected data
you are interested in. Thus, if we want to examine the PC, FP, and SP
registers from each trace frame in the buffer, we can say this:
<pre class="smallexample"> (gdb) <b>tfind start</b>
(gdb) <b>while ($trace_frame != -1)</b>
&gt; printf "Frame %d, PC = %08X, SP = %08X, FP = %08X\n", \
$trace_frame, $pc, $sp, $fp
&gt; tfind
&gt; end
Frame 0, PC = 0020DC64, SP = 0030BF3C, FP = 0030BF44
Frame 1, PC = 0020DC6C, SP = 0030BF38, FP = 0030BF44
Frame 2, PC = 0020DC70, SP = 0030BF34, FP = 0030BF44
Frame 3, PC = 0020DC74, SP = 0030BF30, FP = 0030BF44
Frame 4, PC = 0020DC78, SP = 0030BF2C, FP = 0030BF44
Frame 5, PC = 0020DC7C, SP = 0030BF28, FP = 0030BF44
Frame 6, PC = 0020DC80, SP = 0030BF24, FP = 0030BF44
Frame 7, PC = 0020DC84, SP = 0030BF20, FP = 0030BF44
Frame 8, PC = 0020DC88, SP = 0030BF1C, FP = 0030BF44
Frame 9, PC = 0020DC8E, SP = 0030BF18, FP = 0030BF44
Frame 10, PC = 00203F6C, SP = 0030BE3C, FP = 0030BF14
</pre>
<p>Or, if we want to examine the variable <code>X</code> at each source line in
the buffer:
<pre class="smallexample"> (gdb) <b>tfind start</b>
(gdb) <b>while ($trace_frame != -1)</b>
&gt; printf "Frame %d, X == %d\n", $trace_frame, X
&gt; tfind line
&gt; end
Frame 0, X = 1
Frame 7, X = 2
Frame 13, X = 255
</pre>
</body></html>