150 lines
7.2 KiB
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: <a rel="next" accesskey="n" href="tdump.html#tdump">tdump</a>,
|
||
|
Up: <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 ‘<samp><span class="samp">tfind none</span></samp>’.
|
||
|
|
||
|
<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 <RET> repeatedly you can examine all the trace
|
||
|
snapshots in order. Or, by saying <code>tfind -</code> and then hitting
|
||
|
<RET> 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>
|
||
|
> printf "Frame %d, PC = %08X, SP = %08X, FP = %08X\n", \
|
||
|
$trace_frame, $pc, $sp, $fp
|
||
|
> tfind
|
||
|
> 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>
|
||
|
> printf "Frame %d, X == %d\n", $trace_frame, X
|
||
|
> tfind line
|
||
|
> end
|
||
|
|
||
|
Frame 0, X = 1
|
||
|
Frame 7, X = 2
|
||
|
Frame 13, X = 255
|
||
|
</pre>
|
||
|
</body></html>
|
||
|
|