neingeist
/
arduinisten
Archived
1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

921 lines
40 KiB
HTML

<HTML>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- Created on March, 27 2008 by texi2html 1.64 -->
<!--
Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
Karl Berry <karl@freefriends.org>
Olaf Bachmann <obachman@mathematik.uni-kl.de>
and many others.
Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
-->
<HEAD>
<TITLE>Debugging with GDB: Tracepoints</TITLE>
<META NAME="description" CONTENT="Debugging with GDB: Tracepoints">
<META NAME="keywords" CONTENT="Debugging with GDB: Tracepoints">
<META NAME="resource-type" CONTENT="document">
<META NAME="distribution" CONTENT="global">
<META NAME="Generator" CONTENT="texi2html 1.64">
</HEAD>
<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
<A NAME="SEC84"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_10.html#SEC83"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC85"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_3.html#SEC6"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_12.html#SEC97"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H1> 10. Tracepoints </H1>
<!--docid::SEC84::-->
<P>
<A NAME="IDX523"></A>
In some applications, it is not feasible for the debugger to interrupt
the program's execution long enough for the developer to learn
anything helpful about its behavior. If the program's correctness
depends on its real-time behavior, delays introduced by a debugger
might cause the program to change its behavior drastically, or perhaps
fail, even when the code itself is correct. It is useful to be able
to observe the program's behavior without interrupting it.
</P><P>
Using GDB's <CODE>trace</CODE> and <CODE>collect</CODE> commands, you can
specify locations in the program, called <EM>tracepoints</EM>, and
arbitrary expressions to evaluate when those tracepoints are reached.
Later, using the <CODE>tfind</CODE> command, you can examine the values
those expressions had when the program hit the tracepoints. The
expressions may also denote objects in memory--structures or arrays,
for example--whose values GDB should record; while visiting
a particular tracepoint, you may inspect those objects as if they were
in memory at that moment. However, because GDB records these
values without interacting with you, it can do so quickly and
unobtrusively, hopefully not disturbing the program's behavior.
</P><P>
The tracepoint facility is currently available only for remote
targets. See section <A HREF="gdb_17.html#SEC158">16. Specifying a Debugging Target</A>. In addition, your remote target must know
how to collect trace data. This functionality is implemented in the
remote stub; however, none of the stubs distributed with GDB
support tracepoints as of this writing. The format of the remote
packets used to implement tracepoints are described in <A HREF="gdb_33.html#SEC700">D.6 Tracepoint Packets</A>.
</P><P>
This chapter describes the tracepoint commands and features.
</P><P>
<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_11.html#SEC85">10.1 Commands to Set Tracepoints</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_11.html#SEC92">10.2 Using the Collected Data</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_11.html#SEC96">10.3 Convenience Variables for Tracepoints</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
</TABLE></BLOCKQUOTE>
<P>
<A NAME="Set Tracepoints"></A>
<HR SIZE="6">
<A NAME="SEC85"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC86"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC92"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H2> 10.1 Commands to Set Tracepoints </H2>
<!--docid::SEC85::-->
<P>
Before running such a <EM>trace experiment</EM>, an arbitrary number of
tracepoints can be set. Like a breakpoint (see section <A HREF="gdb_6.html#SEC33">5.1.1 Setting Breakpoints</A>), a
tracepoint has a number assigned to it by GDB. Like with
breakpoints, tracepoint numbers are successive integers starting from
one. Many of the commands associated with tracepoints take the
tracepoint number as their argument, to identify which tracepoint to
work on.
</P><P>
For each tracepoint, you can specify, in advance, some arbitrary set
of data that you want the target to collect in the trace buffer when
it hits that tracepoint. The collected data can include registers,
local variables, or global data. Later, you can use GDB
commands to examine the values these data had at the time the
tracepoint was hit.
</P><P>
This section describes commands to set tracepoints and associated
conditions and actions.
</P><P>
<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_11.html#SEC86">10.1.1 Create and Delete Tracepoints</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_11.html#SEC87">10.1.2 Enable and Disable Tracepoints</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_11.html#SEC88">10.1.3 Tracepoint Passcounts</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_11.html#SEC89">10.1.4 Tracepoint Action Lists</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_11.html#SEC90">10.1.5 Listing Tracepoints</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_11.html#SEC91">10.1.6 Starting and Stopping Trace Experiments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
</TABLE></BLOCKQUOTE>
<P>
<A NAME="Create and Delete Tracepoints"></A>
<HR SIZE="6">
<A NAME="SEC86"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC85"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC87"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC85"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC92"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H3> 10.1.1 Create and Delete Tracepoints </H3>
<!--docid::SEC86::-->
<P>
<DL COMPACT>
<A NAME="IDX524"></A>
<A NAME="IDX525"></A>
<DT><CODE>trace</CODE>
<DD>The <CODE>trace</CODE> command is very similar to the <CODE>break</CODE> command.
Its argument can be a source line, a function name, or an address in
the target program. See section <A HREF="gdb_6.html#SEC33">5.1.1 Setting Breakpoints</A>. The <CODE>trace</CODE> command
defines a tracepoint, which is a point in the target program where the
debugger will briefly stop, collect some data, and then allow the
program to continue. Setting a tracepoint or changing its commands
doesn't take effect until the next <CODE>tstart</CODE> command; thus, you
cannot change the tracepoint attributes once a trace experiment is
running.
<P>
Here are some examples of using the <CODE>trace</CODE> command:
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) <B>trace foo.c:121</B> // a source file and line number
(gdb) <B>trace +2</B> // 2 lines forward
(gdb) <B>trace my_function</B> // first source line of function
(gdb) <B>trace *my_function</B> // EXACT start address of function
(gdb) <B>trace *0x2117c4</B> // an address
</FONT></pre></td></tr></table></P><P>
You can abbreviate <CODE>trace</CODE> as <CODE>tr</CODE>.
</P><P>
<A NAME="IDX526"></A>
<A NAME="IDX527"></A>
<A NAME="IDX528"></A>
<A NAME="IDX529"></A>
The convenience variable <CODE>$tpnum</CODE> records the tracepoint number
of the most recently set tracepoint.
</P><P>
<A NAME="IDX530"></A>
<A NAME="IDX531"></A>
<DT><CODE>delete tracepoint [<VAR>num</VAR>]</CODE>
<DD>Permanently delete one or more tracepoints. With no argument, the
default is to delete all tracepoints.
<P>
Examples:
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) <B>delete trace 1 2 3</B> // remove three tracepoints
(gdb) <B>delete trace</B> // remove all tracepoints
</FONT></pre></td></tr></table></P><P>
You can abbreviate this command as <CODE>del tr</CODE>.
</DL>
<P>
<A NAME="Enable and Disable Tracepoints"></A>
<HR SIZE="6">
<A NAME="SEC87"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC86"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC88"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC88"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC85"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC92"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H3> 10.1.2 Enable and Disable Tracepoints </H3>
<!--docid::SEC87::-->
<P>
<DL COMPACT>
<A NAME="IDX532"></A>
<DT><CODE>disable tracepoint [<VAR>num</VAR>]</CODE>
<DD>Disable tracepoint <VAR>num</VAR>, or all tracepoints if no argument
<VAR>num</VAR> is given. A disabled tracepoint will have no effect during
the next trace experiment, but it is not forgotten. You can re-enable
a disabled tracepoint using the <CODE>enable tracepoint</CODE> command.
<P>
<A NAME="IDX533"></A>
<DT><CODE>enable tracepoint [<VAR>num</VAR>]</CODE>
<DD>Enable tracepoint <VAR>num</VAR>, or all tracepoints. The enabled
tracepoints will become effective the next time a trace experiment is
run.
</DL>
<P>
<A NAME="Tracepoint Passcounts"></A>
<HR SIZE="6">
<A NAME="SEC88"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC87"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC89"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC89"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC85"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC92"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H3> 10.1.3 Tracepoint Passcounts </H3>
<!--docid::SEC88::-->
<P>
<DL COMPACT>
<A NAME="IDX534"></A>
<A NAME="IDX535"></A>
<DT><CODE>passcount [<VAR>n</VAR> [<VAR>num</VAR>]]</CODE>
<DD>Set the <EM>passcount</EM> of a tracepoint. The passcount is a way to
automatically stop a trace experiment. If a tracepoint's passcount is
<VAR>n</VAR>, then the trace experiment will be automatically stopped on
the <VAR>n</VAR>'th time that tracepoint is hit. If the tracepoint number
<VAR>num</VAR> is not specified, the <CODE>passcount</CODE> command sets the
passcount of the most recently defined tracepoint. If no passcount is
given, the trace experiment will run until stopped explicitly by the
user.
<P>
Examples:
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) <B>passcount 5 2</B> // Stop on the 5th execution of
<CODE>// tracepoint 2</CODE>
(gdb) <B>passcount 12</B> // Stop on the 12th execution of the
<CODE>// most recently defined tracepoint.</CODE>
(gdb) <B>trace foo</B>
(gdb) <B>pass 3</B>
(gdb) <B>trace bar</B>
(gdb) <B>pass 2</B>
(gdb) <B>trace baz</B>
(gdb) <B>pass 1</B> // Stop tracing when foo has been
<CODE>// executed 3 times OR when bar has</CODE>
<CODE>// been executed 2 times</CODE>
<CODE>// OR when baz has been executed 1 time.</CODE>
</FONT></pre></td></tr></table></DL>
<P>
<A NAME="Tracepoint Actions"></A>
<HR SIZE="6">
<A NAME="SEC89"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC88"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC90"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC90"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC85"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC92"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H3> 10.1.4 Tracepoint Action Lists </H3>
<!--docid::SEC89::-->
<P>
<DL COMPACT>
<A NAME="IDX536"></A>
<A NAME="IDX537"></A>
<DT><CODE>actions [<VAR>num</VAR>]</CODE>
<DD>This command will prompt for a list of actions to be taken when the
tracepoint is hit. If the tracepoint number <VAR>num</VAR> is not
specified, this command sets the actions for the one that was most
recently defined (so that you can define a tracepoint and then say
<CODE>actions</CODE> without bothering about its number). You specify the
actions themselves on the following lines, one action at a time, and
terminate the actions list with a line containing just <CODE>end</CODE>. So
far, the only defined actions are <CODE>collect</CODE> and
<CODE>while-stepping</CODE>.
<P>
<A NAME="IDX538"></A>
To remove all actions from a tracepoint, type <SAMP>`actions <VAR>num</VAR>'</SAMP>
and follow it immediately with <SAMP>`end'</SAMP>.
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) <B>collect <VAR>data</VAR></B> // collect some data
(gdb) <B>while-stepping 5</B> // single-step 5 times, collect data
(gdb) <B>end</B> // signals the end of actions.
</FONT></pre></td></tr></table></P><P>
In the following example, the action list begins with <CODE>collect</CODE>
commands indicating the things to be collected when the tracepoint is
hit. Then, in order to single-step and collect additional data
following the tracepoint, a <CODE>while-stepping</CODE> command is used,
followed by the list of things to be collected while stepping. The
<CODE>while-stepping</CODE> command is terminated by its own separate
<CODE>end</CODE> command. Lastly, the action list is terminated by an
<CODE>end</CODE> command.
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) <B>trace foo</B>
(gdb) <B>actions</B>
Enter actions for tracepoint 1, one per line:
&#62; collect bar,baz
&#62; collect $regs
&#62; while-stepping 12
&#62; collect $fp, $sp
&#62; end
end
</FONT></pre></td></tr></table></P><P>
<A NAME="IDX539"></A>
<DT><CODE>collect <VAR>expr1</VAR>, <VAR>expr2</VAR>, <small>...</small></CODE>
<DD>Collect values of the given expressions when the tracepoint is hit.
This command accepts a comma-separated list of any valid expressions.
In addition to global, static, or local variables, the following
special arguments are supported:
<P>
<DL COMPACT>
<DT><CODE>$regs</CODE>
<DD>collect all registers
<P>
<DT><CODE>$args</CODE>
<DD>collect all function arguments
<P>
<DT><CODE>$locals</CODE>
<DD>collect all local variables.
</DL>
<P>
You can give several consecutive <CODE>collect</CODE> commands, each one
with a single argument, or one <CODE>collect</CODE> command with several
arguments separated by commas: the effect is the same.
</P><P>
The command <CODE>info scope</CODE> (see section <A HREF="gdb_14.html#SEC146">info scope</A>) is
particularly useful for figuring out what data to collect.
</P><P>
<A NAME="IDX540"></A>
<DT><CODE>while-stepping <VAR>n</VAR></CODE>
<DD>Perform <VAR>n</VAR> single-step traces after the tracepoint, collecting
new data at each step. The <CODE>while-stepping</CODE> command is
followed by the list of what to collect while stepping (followed by
its own <CODE>end</CODE> command):
<P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>&#62; while-stepping 12
&#62; collect $regs, myglobal
&#62; end
&#62;
</FONT></pre></td></tr></table></P><P>
You may abbreviate <CODE>while-stepping</CODE> as <CODE>ws</CODE> or
<CODE>stepping</CODE>.
</DL>
<P>
<A NAME="Listing Tracepoints"></A>
<HR SIZE="6">
<A NAME="SEC90"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC89"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC91"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC91"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC85"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC92"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H3> 10.1.5 Listing Tracepoints </H3>
<!--docid::SEC90::-->
<P>
<DL COMPACT>
<A NAME="IDX541"></A>
<A NAME="IDX542"></A>
<A NAME="IDX543"></A>
<DT><CODE>info tracepoints [<VAR>num</VAR>]</CODE>
<DD>Display information about the tracepoint <VAR>num</VAR>. If you don't specify
a tracepoint number, displays information about all the tracepoints
defined so far. For each tracepoint, the following information is
shown:
<P>
<UL>
<LI>
its number
<LI>
whether it is enabled or disabled
<LI>
its address
<LI>
its passcount as given by the <CODE>passcount <VAR>n</VAR></CODE> command
<LI>
its step count as given by the <CODE>while-stepping <VAR>n</VAR></CODE> command
<LI>
where in the source files is the tracepoint set
<LI>
its action list as given by the <CODE>actions</CODE> command
</UL>
<P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) <B>info trace</B>
Num Enb Address PassC StepC What
1 y 0x002117c4 0 0 &#60;gdb_asm&#62;
2 y 0x0020dc64 0 0 in g_test at g_test.c:1375
3 y 0x0020b1f4 0 0 in get_data at ../foo.c:41
(gdb)
</FONT></pre></td></tr></table></P><P>
This command can be abbreviated <CODE>info tp</CODE>.
</DL>
<P>
<A NAME="Starting and Stopping Trace Experiments"></A>
<HR SIZE="6">
<A NAME="SEC91"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC90"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC92"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC85"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC92"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H3> 10.1.6 Starting and Stopping Trace Experiments </H3>
<!--docid::SEC91::-->
<P>
<DL COMPACT>
<A NAME="IDX544"></A>
<A NAME="IDX545"></A>
<A NAME="IDX546"></A>
<DT><CODE>tstart</CODE>
<DD>This command takes no arguments. It starts the trace experiment, and
begins collecting data. This has the side effect of discarding all
the data collected in the trace buffer during the previous trace
experiment.
<P>
<A NAME="IDX547"></A>
<A NAME="IDX548"></A>
<DT><CODE>tstop</CODE>
<DD>This command takes no arguments. It ends the trace experiment, and
stops collecting data.
<P>
<STRONG>Note</STRONG>: a trace experiment and data collection may stop
automatically if any tracepoint's passcount is reached
(see section <A HREF="gdb_11.html#SEC88">10.1.3 Tracepoint Passcounts</A>), or if the trace buffer becomes full.
</P><P>
<A NAME="IDX549"></A>
<A NAME="IDX550"></A>
<A NAME="IDX551"></A>
<DT><CODE>tstatus</CODE>
<DD>This command displays the status of the current trace data
collection.
</DL>
<P>
Here is an example of the commands we described so far:
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) <B>trace gdb_c_test</B>
(gdb) <B>actions</B>
Enter actions for tracepoint #1, one per line.
&#62; collect $regs,$locals,$args
&#62; while-stepping 11
&#62; collect $regs
&#62; end
&#62; end
(gdb) <B>tstart</B>
[time passes <small>...</small>]
(gdb) <B>tstop</B>
</FONT></pre></td></tr></table></P><P>
<A NAME="Analyze Collected Data"></A>
<HR SIZE="6">
<A NAME="SEC92"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC91"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC93"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC96"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC96"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H2> 10.2 Using the Collected Data </H2>
<!--docid::SEC92::-->
<P>
After the tracepoint experiment ends, you use GDB commands
for examining the trace data. The basic idea is that each tracepoint
collects a trace <EM>snapshot</EM> every time it is hit and another
snapshot every time it single-steps. All these snapshots are
consecutively numbered from zero and go into a buffer, and you can
examine them later. The way you examine them is to <EM>focus</EM> on a
specific trace snapshot. When the remote stub is focused on a trace
snapshot, it will respond to all GDB requests for memory and
registers by reading from the buffer which belongs to that snapshot,
rather than from <EM>real</EM> memory or registers of the program being
debugged. This means that <STRONG>all</STRONG> GDB commands
(<CODE>print</CODE>, <CODE>info registers</CODE>, <CODE>backtrace</CODE>, etc.) will
behave as if we were currently debugging the program state as it was
when the tracepoint occurred. Any requests for data that are not in
the buffer will fail.
</P><P>
<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_11.html#SEC93">10.2.1 <CODE>tfind <VAR>n</VAR></CODE></A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to select a trace snapshot</TD></TR>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_11.html#SEC94">10.2.2 <CODE>tdump</CODE></A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to display all data for a snapshot</TD></TR>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_11.html#SEC95">10.2.3 <CODE>save-tracepoints <VAR>filename</VAR></CODE></A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to save tracepoints for a future run</TD></TR>
</TABLE></BLOCKQUOTE>
<P>
<A NAME="tfind"></A>
<HR SIZE="6">
<A NAME="SEC93"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC92"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC94"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC96"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC92"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC96"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H3> 10.2.1 <CODE>tfind <VAR>n</VAR></CODE> </H3>
<!--docid::SEC93::-->
<P>
<A NAME="IDX552"></A>
<A NAME="IDX553"></A>
<A NAME="IDX554"></A>
The basic command for selecting a trace snapshot from the buffer is
<CODE>tfind <VAR>n</VAR></CODE>, 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><P>
Here are the various forms of using the <CODE>tfind</CODE> command.
</P><P>
<DL COMPACT>
<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).
<P>
<DT><CODE>tfind none</CODE>
<DD>Stop debugging trace snapshots, resume <EM>live</EM> debugging.
<P>
<DT><CODE>tfind end</CODE>
<DD>Same as <SAMP>`tfind none'</SAMP>.
<P>
<DT><CODE>tfind</CODE>
<DD>No argument means find the next trace snapshot.
<P>
<DT><CODE>tfind -</CODE>
<DD>Find the previous trace snapshot before the current one. This permits
retracing earlier steps.
<P>
<DT><CODE>tfind tracepoint <VAR>num</VAR></CODE>
<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.
<P>
<DT><CODE>tfind pc <VAR>addr</VAR></CODE>
<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.
<P>
<DT><CODE>tfind outside <VAR>addr1</VAR>, <VAR>addr2</VAR></CODE>
<DD>Find the next snapshot whose PC is outside the given range of
addresses.
<P>
<DT><CODE>tfind range <VAR>addr1</VAR>, <VAR>addr2</VAR></CODE>
<DD>Find the next snapshot whose PC is between <VAR>addr1</VAR> and
<VAR>addr2</VAR>.
<P>
<DT><CODE>tfind line [<VAR>file</VAR>:]<VAR>n</VAR></CODE>
<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 <KBD>RET</KBD> repeatedly you can examine all the trace
snapshots in order. Or, by saying <CODE>tfind -</CODE> and then hitting
<KBD>RET</KBD> 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><P>
In addition to letting you scan through the trace buffer manually,
these commands make it easy to construct GDB 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:
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) <B>tfind start</B>
(gdb) <B>while ($trace_frame != -1)</B>
&#62; printf "Frame %d, PC = %08X, SP = %08X, FP = %08X\n", \
$trace_frame, $pc, $sp, $fp
&#62; tfind
&#62; 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
</FONT></pre></td></tr></table></P><P>
Or, if we want to examine the variable <CODE>X</CODE> at each source line in
the buffer:
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) <B>tfind start</B>
(gdb) <B>while ($trace_frame != -1)</B>
&#62; printf "Frame %d, X == %d\n", $trace_frame, X
&#62; tfind line
&#62; end
Frame 0, X = 1
Frame 7, X = 2
Frame 13, X = 255
</FONT></pre></td></tr></table></P><P>
<A NAME="tdump"></A>
<HR SIZE="6">
<A NAME="SEC94"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC93"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC95"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC95"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC92"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC96"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H3> 10.2.2 <CODE>tdump</CODE> </H3>
<!--docid::SEC94::-->
<P>
This command takes no arguments. It prints all the data collected at
the current trace snapshot.
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) <B>trace 444</B>
(gdb) <B>actions</B>
Enter actions for tracepoint #2, one per line:
&#62; collect $regs, $locals, $args, gdb_long_test
&#62; end
(gdb) <B>tstart</B>
(gdb) <B>tfind line 444</B>
#0 gdb_test (p1=0x11, p2=0x22, p3=0x33, p4=0x44, p5=0x55, p6=0x66)
at gdb_test.c:444
444 printp( "%s: arguments = 0x%X 0x%X 0x%X 0x%X 0x%X 0x%X\n", )
(gdb) <B>tdump</B>
Data collected at tracepoint 2, trace frame 1:
d0 0xc4aa0085 -995491707
d1 0x18 24
d2 0x80 128
d3 0x33 51
d4 0x71aea3d 119204413
d5 0x22 34
d6 0xe0 224
d7 0x380035 3670069
a0 0x19e24a 1696330
a1 0x3000668 50333288
a2 0x100 256
a3 0x322000 3284992
a4 0x3000698 50333336
a5 0x1ad3cc 1758156
fp 0x30bf3c 0x30bf3c
sp 0x30bf34 0x30bf34
ps 0x0 0
pc 0x20b2c8 0x20b2c8
fpcontrol 0x0 0
fpstatus 0x0 0
fpiaddr 0x0 0
p = 0x20e5b4 "gdb-test"
p1 = (void *) 0x11
p2 = (void *) 0x22
p3 = (void *) 0x33
p4 = (void *) 0x44
p5 = (void *) 0x55
p6 = (void *) 0x66
gdb_long_test = 17 '\021'
(gdb)
</FONT></pre></td></tr></table></P><P>
<A NAME="save-tracepoints"></A>
<HR SIZE="6">
<A NAME="SEC95"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC94"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC96"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC96"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC92"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC96"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H3> 10.2.3 <CODE>save-tracepoints <VAR>filename</VAR></CODE> </H3>
<!--docid::SEC95::-->
<P>
This command saves all current tracepoint definitions together with
their actions and passcounts, into a file <TT>`<VAR>filename</VAR>'</TT>
suitable for use in a later debugging session. To read the saved
tracepoint definitions, use the <CODE>source</CODE> command (see section <A HREF="gdb_21.html#SEC232">20.3 Command Files</A>).
</P><P>
<A NAME="Tracepoint Variables"></A>
<HR SIZE="6">
<A NAME="SEC96"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC95"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_12.html#SEC97"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_12.html#SEC97"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H2> 10.3 Convenience Variables for Tracepoints </H2>
<!--docid::SEC96::-->
<P>
<DL COMPACT>
<A NAME="IDX555"></A>
<DT><CODE>(int) $trace_frame</CODE>
<DD>The current trace snapshot (a.k.a. <EM>frame</EM>) number, or -1 if no
snapshot is selected.
<P>
<A NAME="IDX556"></A>
<DT><CODE>(int) $tracepoint</CODE>
<DD>The tracepoint for the current trace snapshot.
<P>
<A NAME="IDX557"></A>
<DT><CODE>(int) $trace_line</CODE>
<DD>The line number for the current trace snapshot.
<P>
<A NAME="IDX558"></A>
<DT><CODE>(char []) $trace_file</CODE>
<DD>The source file for the current trace snapshot.
<P>
<A NAME="IDX559"></A>
<DT><CODE>(char []) $trace_func</CODE>
<DD>The name of the function containing <CODE>$tracepoint</CODE>.
</DL>
<P>
Note: <CODE>$trace_file</CODE> is not suitable for use in <CODE>printf</CODE>,
use <CODE>output</CODE> instead.
</P><P>
Here's a simple example of using these convenience variables for
stepping through all the trace snapshots and printing some of their
data.
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) <B>tfind start</B>
(gdb) <B>while $trace_frame != -1</B>
&#62; output $trace_file
&#62; printf ", line %d (tracepoint #%d)\n", $trace_line, $tracepoint
&#62; tfind
&#62; end
</FONT></pre></td></tr></table></P><P>
<A NAME="Overlays"></A>
<HR SIZE="6">
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_12.html#SEC97"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<BR>
<FONT SIZE="-1">
<address>
<p>Please send FSF &amp; GNU inquiries &amp; questions to <a
href="mailto:gnu@gnu.org">gnu@gnu.org</a>. There are also <a
href="http://www.gnu.org/home.html#ContactInfo">other ways to
contact</a> the FSF.</p>
<p>These pages are maintained by <a
href="http://www.gnu.org/software/gdb/">the GDB developers</a>.</p>
<p>Copyright Free Software Foundation, Inc., 59 Temple Place - Suite
330, Boston, MA 02111, USA.</p>
<p>Verbatim copying and distribution of this entire article is
permitted in any medium, provided this notice is preserved.</p>
</address>
This document was generated
by <I>GDB Administrator</I> on <I>March, 27 2008</I>
using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
"><I>texi2html</I></A>
</BODY>
</HTML>