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.
921 lines
40 KiB
HTML
921 lines
40 KiB
HTML
15 years ago
|
<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"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC85"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_3.html#SEC6"> << </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"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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> </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> </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> </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"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC86"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> << </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"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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> </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> </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> </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> </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> </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> </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"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC87"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> << </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"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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> </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> </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"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC88"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC88"> << </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"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC89"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC89"> << </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"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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> </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"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC90"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC90"> << </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"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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> </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> </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:
|
||
|
> collect bar,baz
|
||
|
> collect $regs
|
||
|
> while-stepping 12
|
||
|
> collect $fp, $sp
|
||
|
> 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> </td><td class=smallexample><FONT SIZE=-1><pre>> while-stepping 12
|
||
|
> collect $regs, myglobal
|
||
|
> end
|
||
|
>
|
||
|
</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"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC91"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC91"> << </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"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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> </td><td class=smallexample><FONT SIZE=-1><pre>(gdb) <B>info trace</B>
|
||
|
Num Enb Address PassC StepC What
|
||
|
1 y 0x002117c4 0 0 <gdb_asm>
|
||
|
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"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC92"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> << </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"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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> </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.
|
||
|
> collect $regs,$locals,$args
|
||
|
> while-stepping 11
|
||
|
> collect $regs
|
||
|
> end
|
||
|
> 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"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC93"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC96"> << </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"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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> </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> </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> </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"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC94"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC96"> << </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"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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> </td><td class=smallexample><FONT SIZE=-1><pre>(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
|
||
|
</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> </td><td class=smallexample><FONT SIZE=-1><pre>(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
|
||
|
</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"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC95"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC95"> << </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"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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> </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:
|
||
|
> collect $regs, $locals, $args, gdb_long_test
|
||
|
> 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"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC96"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC96"> << </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"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_12.html#SEC97"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> << </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"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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> </td><td class=smallexample><FONT SIZE=-1><pre>(gdb) <B>tfind start</B>
|
||
|
|
||
|
(gdb) <B>while $trace_frame != -1</B>
|
||
|
> output $trace_file
|
||
|
> printf ", line %d (tracepoint #%d)\n", $trace_line, $tracepoint
|
||
|
> tfind
|
||
|
> 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"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_12.html#SEC97"> >> </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <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 & GNU inquiries & 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>
|