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.
2161 lines
95 KiB
HTML
2161 lines
95 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: Stopping</TITLE>
|
||
|
|
||
|
<META NAME="description" CONTENT="Debugging with GDB: Stopping">
|
||
|
<META NAME="keywords" CONTENT="Debugging with GDB: Stopping">
|
||
|
<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="SEC31"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_5.html#SEC30"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC32"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_7.html#SEC46"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_7.html#SEC46"> >> </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> 5. Stopping and Continuing </H1>
|
||
|
<!--docid::SEC31::-->
|
||
|
<P>
|
||
|
|
||
|
The principal purposes of using a debugger are so that you can stop your
|
||
|
program before it terminates; or so that, if your program runs into
|
||
|
trouble, you can investigate and find out why.
|
||
|
</P><P>
|
||
|
|
||
|
Inside GDB, your program may stop for any of several reasons,
|
||
|
such as a signal, a breakpoint, or reaching a new line after a
|
||
|
GDB command such as <CODE>step</CODE>. You may then examine and
|
||
|
change variables, set new breakpoints or remove old ones, and then
|
||
|
continue execution. Usually, the messages shown by GDB provide
|
||
|
ample explanation of the status of your program--but you can also
|
||
|
explicitly request this information at any time.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX171"></A>
|
||
|
<DT><CODE>info program</CODE>
|
||
|
<DD>Display information about the status of your program: whether it is
|
||
|
running or not, what process it is, and why it stopped.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC32">5.1 Breakpoints, Watchpoints, and Catchpoints</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Breakpoints, watchpoints, and catchpoints</TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC43">5.2 Continuing and Stepping</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Resuming execution</TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC44">5.3 Signals</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC45">5.4 Stopping and Starting Multi-thread Programs</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Stopping and starting multi-thread programs</TD></TR>
|
||
|
</TABLE></BLOCKQUOTE>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="Breakpoints"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC32"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC31"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC33"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC31"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC31"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC43"> >> </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> 5.1 Breakpoints, Watchpoints, and Catchpoints </H2>
|
||
|
<!--docid::SEC32::-->
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX172"></A>
|
||
|
A <EM>breakpoint</EM> makes your program stop whenever a certain point in
|
||
|
the program is reached. For each breakpoint, you can add conditions to
|
||
|
control in finer detail whether your program stops. You can set
|
||
|
breakpoints with the <CODE>break</CODE> command and its variants (see section <A HREF="gdb_6.html#SEC33">Setting Breakpoints</A>), to specify the place where your program
|
||
|
should stop by line number, function name or exact address in the
|
||
|
program.
|
||
|
</P><P>
|
||
|
|
||
|
On some systems, you can set breakpoints in shared libraries before
|
||
|
the executable is run. There is a minor limitation on HP-UX systems:
|
||
|
you must wait until the executable is run in order to set breakpoints
|
||
|
in shared library routines that are not called directly by the program
|
||
|
(for example, routines that are arguments in a <CODE>pthread_create</CODE>
|
||
|
call).
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX173"></A>
|
||
|
<A NAME="IDX174"></A>
|
||
|
<A NAME="IDX175"></A>
|
||
|
<A NAME="IDX176"></A>
|
||
|
<A NAME="IDX177"></A>
|
||
|
A <EM>watchpoint</EM> is a special breakpoint that stops your program
|
||
|
when the value of an expression changes. The expression may be a value
|
||
|
of a variable, or it could involve values of one or more variables
|
||
|
combined by operators, such as <SAMP>`a + b'</SAMP>. This is sometimes called
|
||
|
<EM>data breakpoints</EM>. You must use a different command to set
|
||
|
watchpoints (see section <A HREF="gdb_6.html#SEC34">Setting Watchpoints</A>), but aside
|
||
|
from that, you can manage a watchpoint like any other breakpoint: you
|
||
|
enable, disable, and delete both breakpoints and watchpoints using the
|
||
|
same commands.
|
||
|
</P><P>
|
||
|
|
||
|
You can arrange to have values from your program displayed automatically
|
||
|
whenever GDB stops at a breakpoint. See section <A HREF="gdb_9.html#SEC65">Automatic Display</A>.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX178"></A>
|
||
|
<A NAME="IDX179"></A>
|
||
|
A <EM>catchpoint</EM> is another special breakpoint that stops your program
|
||
|
when a certain kind of event occurs, such as the throwing of a C<TT>++</TT>
|
||
|
exception or the loading of a library. As with watchpoints, you use a
|
||
|
different command to set a catchpoint (see section <A HREF="gdb_6.html#SEC35">Setting Catchpoints</A>), but aside from that, you can manage a catchpoint like any
|
||
|
other breakpoint. (To stop when your program receives a signal, use the
|
||
|
<CODE>handle</CODE> command; see <A HREF="gdb_6.html#SEC44">Signals</A>.)
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX180"></A>
|
||
|
<A NAME="IDX181"></A>
|
||
|
GDB assigns a number to each breakpoint, watchpoint, or
|
||
|
catchpoint when you create it; these numbers are successive integers
|
||
|
starting with one. In many of the commands for controlling various
|
||
|
features of breakpoints you use the breakpoint number to say which
|
||
|
breakpoint you want to change. Each breakpoint may be <EM>enabled</EM> or
|
||
|
<EM>disabled</EM>; if disabled, it has no effect on your program until you
|
||
|
enable it again.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX182"></A>
|
||
|
<A NAME="IDX183"></A>
|
||
|
Some GDB commands accept a range of breakpoints on which to
|
||
|
operate. A breakpoint range is either a single breakpoint number, like
|
||
|
<SAMP>`5'</SAMP>, or two such numbers, in increasing order, separated by a
|
||
|
hyphen, like <SAMP>`5-7'</SAMP>. When a breakpoint range is given to a command,
|
||
|
all breakpoints in that range are operated on.
|
||
|
</P><P>
|
||
|
|
||
|
<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC33">5.1.1 Setting Breakpoints</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Setting breakpoints</TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC34">5.1.2 Setting Watchpoints</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Setting watchpoints</TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC35">5.1.3 Setting Catchpoints</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Setting catchpoints</TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC36">5.1.4 Deleting Breakpoints</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Deleting breakpoints</TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC37">5.1.5 Disabling Breakpoints</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Disabling breakpoints</TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC38">5.1.6 Break Conditions</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Break conditions</TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC39">5.1.7 Breakpoint Command Lists</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Breakpoint command lists</TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC40">5.1.8 Breakpoint Menus</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Breakpoint menus</TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC41">5.1.9 "Cannot insert breakpoints"</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_6.html#SEC42">5.1.10 "Breakpoint address adjusted..."</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
|
||
|
</TABLE></BLOCKQUOTE>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="Set Breaks"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC33"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC32"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC34"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC31"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC32"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC43"> >> </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> 5.1.1 Setting Breakpoints </H3>
|
||
|
<!--docid::SEC33::-->
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX184"></A>
|
||
|
<A NAME="IDX185"></A>
|
||
|
<A NAME="IDX186"></A>
|
||
|
<A NAME="IDX187"></A>
|
||
|
Breakpoints are set with the <CODE>break</CODE> command (abbreviated
|
||
|
<CODE>b</CODE>). The debugger convenience variable <SAMP>`$bpnum'</SAMP> records the
|
||
|
number of the breakpoint you've set most recently; see <A HREF="gdb_9.html#SEC68">Convenience Variables</A>, for a discussion of what you can do with
|
||
|
convenience variables.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<DT><CODE>break <VAR>location</VAR></CODE>
|
||
|
<DD>Set a breakpoint at the given <VAR>location</VAR>, which can specify a
|
||
|
function name, a line number, or an address of an instruction.
|
||
|
(See section <A HREF="gdb_8.html#SEC53">7.2 Specifying a Location</A>, for a list of all the possible ways to
|
||
|
specify a <VAR>location</VAR>.) The breakpoint will stop your program just
|
||
|
before it executes any of the code in the specified <VAR>location</VAR>.
|
||
|
<P>
|
||
|
|
||
|
When using source languages that permit overloading of symbols, such as
|
||
|
C<TT>++</TT>, a function name may refer to more than one possible place to break.
|
||
|
See section <A HREF="gdb_6.html#SEC40">Breakpoint Menus</A>, for a discussion of that situation.
|
||
|
</P><P>
|
||
|
|
||
|
<DT><CODE>break</CODE>
|
||
|
<DD>When called without any arguments, <CODE>break</CODE> sets a breakpoint at
|
||
|
the next instruction to be executed in the selected stack frame
|
||
|
(see section <A HREF="gdb_7.html#SEC46">Examining the Stack</A>). In any selected frame but the
|
||
|
innermost, this makes your program stop as soon as control
|
||
|
returns to that frame. This is similar to the effect of a
|
||
|
<CODE>finish</CODE> command in the frame inside the selected frame--except
|
||
|
that <CODE>finish</CODE> does not leave an active breakpoint. If you use
|
||
|
<CODE>break</CODE> without an argument in the innermost frame, GDB stops
|
||
|
the next time it reaches the current location; this may be useful
|
||
|
inside loops.
|
||
|
<P>
|
||
|
|
||
|
GDB normally ignores breakpoints when it resumes execution, until at
|
||
|
least one instruction has been executed. If it did not do this, you
|
||
|
would be unable to proceed past a breakpoint without first disabling the
|
||
|
breakpoint. This rule applies whether or not the breakpoint already
|
||
|
existed when your program stopped.
|
||
|
</P><P>
|
||
|
|
||
|
<DT><CODE>break <small>...</small> if <VAR>cond</VAR></CODE>
|
||
|
<DD>Set a breakpoint with condition <VAR>cond</VAR>; evaluate the expression
|
||
|
<VAR>cond</VAR> each time the breakpoint is reached, and stop only if the
|
||
|
value is nonzero--that is, if <VAR>cond</VAR> evaluates as true.
|
||
|
<SAMP>`<small>...</small>'</SAMP> stands for one of the possible arguments described
|
||
|
above (or no argument) specifying where to break. See section <A HREF="gdb_6.html#SEC38">Break Conditions</A>, for more information on breakpoint conditions.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX188"></A>
|
||
|
<DT><CODE>tbreak <VAR>args</VAR></CODE>
|
||
|
<DD>Set a breakpoint enabled only for one stop. <VAR>args</VAR> are the
|
||
|
same as for the <CODE>break</CODE> command, and the breakpoint is set in the same
|
||
|
way, but the breakpoint is automatically deleted after the first time your
|
||
|
program stops there. See section <A HREF="gdb_6.html#SEC37">Disabling Breakpoints</A>.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX189"></A>
|
||
|
<A NAME="IDX190"></A>
|
||
|
<DT><CODE>hbreak <VAR>args</VAR></CODE>
|
||
|
<DD>Set a hardware-assisted breakpoint. <VAR>args</VAR> are the same as for the
|
||
|
<CODE>break</CODE> command and the breakpoint is set in the same way, but the
|
||
|
breakpoint requires hardware support and some target hardware may not
|
||
|
have this support. The main purpose of this is EPROM/ROM code
|
||
|
debugging, so you can set a breakpoint at an instruction without
|
||
|
changing the instruction. This can be used with the new trap-generation
|
||
|
provided by SPARClite DSU and most x86-based targets. These targets
|
||
|
will generate traps when a program accesses some data or instruction
|
||
|
address that is assigned to the debug registers. However the hardware
|
||
|
breakpoint registers can take a limited number of breakpoints. For
|
||
|
example, on the DSU, only two data breakpoints can be set at a time, and
|
||
|
GDB will reject this command if more than two are used. Delete
|
||
|
or disable unused hardware breakpoints before setting new ones
|
||
|
(see section <A HREF="gdb_6.html#SEC37">Disabling Breakpoints</A>).
|
||
|
See section <A HREF="gdb_6.html#SEC38">Break Conditions</A>.
|
||
|
For remote targets, you can restrict the number of hardware
|
||
|
breakpoints GDB will use, see <A HREF="gdb_18.html#set remote hardware-breakpoint-limit">set remote hardware-breakpoint-limit</A>.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX191"></A>
|
||
|
<DT><CODE>thbreak <VAR>args</VAR></CODE>
|
||
|
<DD>Set a hardware-assisted breakpoint enabled only for one stop. <VAR>args</VAR>
|
||
|
are the same as for the <CODE>hbreak</CODE> command and the breakpoint is set in
|
||
|
the same way. However, like the <CODE>tbreak</CODE> command,
|
||
|
the breakpoint is automatically deleted after the
|
||
|
first time your program stops there. Also, like the <CODE>hbreak</CODE>
|
||
|
command, the breakpoint requires hardware support and some target hardware
|
||
|
may not have this support. See section <A HREF="gdb_6.html#SEC37">Disabling Breakpoints</A>.
|
||
|
See also <A HREF="gdb_6.html#SEC38">Break Conditions</A>.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX192"></A>
|
||
|
<A NAME="IDX193"></A>
|
||
|
<A NAME="IDX194"></A>
|
||
|
<A NAME="IDX195"></A>
|
||
|
<DT><CODE>rbreak <VAR>regex</VAR></CODE>
|
||
|
<DD>Set breakpoints on all functions matching the regular expression
|
||
|
<VAR>regex</VAR>. This command sets an unconditional breakpoint on all
|
||
|
matches, printing a list of all breakpoints it set. Once these
|
||
|
breakpoints are set, they are treated just like the breakpoints set with
|
||
|
the <CODE>break</CODE> command. You can delete them, disable them, or make
|
||
|
them conditional the same way as any other breakpoint.
|
||
|
<P>
|
||
|
|
||
|
The syntax of the regular expression is the standard one used with tools
|
||
|
like <TT>`grep'</TT>. Note that this is different from the syntax used by
|
||
|
shells, so for instance <CODE>foo*</CODE> matches all functions that include
|
||
|
an <CODE>fo</CODE> followed by zero or more <CODE>o</CODE>s. There is an implicit
|
||
|
<CODE>.*</CODE> leading and trailing the regular expression you supply, so to
|
||
|
match only functions that begin with <CODE>foo</CODE>, use <CODE>^foo</CODE>.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX196"></A>
|
||
|
When debugging C<TT>++</TT> programs, <CODE>rbreak</CODE> is useful for setting
|
||
|
breakpoints on overloaded functions that are not members of any special
|
||
|
classes.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX197"></A>
|
||
|
The <CODE>rbreak</CODE> command can be used to set breakpoints in
|
||
|
<STRONG>all</STRONG> the functions in a program, like this:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>(gdb) rbreak .
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
<A NAME="IDX198"></A>
|
||
|
<A NAME="IDX199"></A>
|
||
|
<DT><CODE>info breakpoints [<VAR>n</VAR>]</CODE>
|
||
|
<DD><DT><CODE>info break [<VAR>n</VAR>]</CODE>
|
||
|
<DD><DT><CODE>info watchpoints [<VAR>n</VAR>]</CODE>
|
||
|
<DD>Print a table of all breakpoints, watchpoints, and catchpoints set and
|
||
|
not deleted. Optional argument <VAR>n</VAR> means print information only
|
||
|
about the specified breakpoint (or watchpoint or catchpoint). For
|
||
|
each breakpoint, following columns are printed:
|
||
|
<P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<DT><EM>Breakpoint Numbers</EM>
|
||
|
<DD><DT><EM>Type</EM>
|
||
|
<DD>Breakpoint, watchpoint, or catchpoint.
|
||
|
<DT><EM>Disposition</EM>
|
||
|
<DD>Whether the breakpoint is marked to be disabled or deleted when hit.
|
||
|
<DT><EM>Enabled or Disabled</EM>
|
||
|
<DD>Enabled breakpoints are marked with <SAMP>`y'</SAMP>. <SAMP>`n'</SAMP> marks breakpoints
|
||
|
that are not enabled.
|
||
|
<DT><EM>Address</EM>
|
||
|
<DD>Where the breakpoint is in your program, as a memory address. For a
|
||
|
pending breakpoint whose address is not yet known, this field will
|
||
|
contain <SAMP>`<PENDING>'</SAMP>. Such breakpoint won't fire until a shared
|
||
|
library that has the symbol or line referred by breakpoint is loaded.
|
||
|
See below for details. A breakpoint with several locations will
|
||
|
have <SAMP>`<MULTIPLE>'</SAMP> in this field--see below for details.
|
||
|
<DT><EM>What</EM>
|
||
|
<DD>Where the breakpoint is in the source for your program, as a file and
|
||
|
line number. For a pending breakpoint, the original string passed to
|
||
|
the breakpoint command will be listed as it cannot be resolved until
|
||
|
the appropriate shared library is loaded in the future.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
If a breakpoint is conditional, <CODE>info break</CODE> shows the condition on
|
||
|
the line following the affected breakpoint; breakpoint commands, if any,
|
||
|
are listed after that. A pending breakpoint is allowed to have a condition
|
||
|
specified for it. The condition is not parsed for validity until a shared
|
||
|
library is loaded that allows the pending breakpoint to resolve to a
|
||
|
valid location.
|
||
|
</P><P>
|
||
|
|
||
|
<CODE>info break</CODE> with a breakpoint
|
||
|
number <VAR>n</VAR> as argument lists only that breakpoint. The
|
||
|
convenience variable <CODE>$_</CODE> and the default examining-address for
|
||
|
the <CODE>x</CODE> command are set to the address of the last breakpoint
|
||
|
listed (see section <A HREF="gdb_9.html#SEC64">Examining Memory</A>).
|
||
|
</P><P>
|
||
|
|
||
|
<CODE>info break</CODE> displays a count of the number of times the breakpoint
|
||
|
has been hit. This is especially useful in conjunction with the
|
||
|
<CODE>ignore</CODE> command. You can ignore a large number of breakpoint
|
||
|
hits, look at the breakpoint info to see how many times the breakpoint
|
||
|
was hit, and then run again, ignoring one less than that number. This
|
||
|
will get you quickly to the last hit of that breakpoint.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
GDB allows you to set any number of breakpoints at the same place in
|
||
|
your program. There is nothing silly or meaningless about this. When
|
||
|
the breakpoints are conditional, this is even useful
|
||
|
(see section <A HREF="gdb_6.html#SEC38">Break Conditions</A>).
|
||
|
</P><P>
|
||
|
|
||
|
It is possible that a breakpoint corresponds to several locations
|
||
|
in your program. Examples of this situation are:
|
||
|
</P><P>
|
||
|
|
||
|
<UL>
|
||
|
|
||
|
<LI>
|
||
|
For a C<TT>++</TT> constructor, the GCC compiler generates several
|
||
|
instances of the function body, used in different cases.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
For a C<TT>++</TT> template function, a given line in the function can
|
||
|
correspond to any number of instantiations.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
For an inlined function, a given source line can correspond to
|
||
|
several places where that function is inlined.
|
||
|
<P>
|
||
|
|
||
|
</UL>
|
||
|
<P>
|
||
|
|
||
|
In all those cases, GDB will insert a breakpoint at all
|
||
|
the relevant locations.
|
||
|
</P><P>
|
||
|
|
||
|
A breakpoint with multiple locations is displayed in the breakpoint
|
||
|
table using several rows--one header row, followed by one row for
|
||
|
each breakpoint location. The header row has <SAMP>`<MULTIPLE>'</SAMP> in the
|
||
|
address column. The rows for individual locations contain the actual
|
||
|
addresses for locations, and show the functions to which those
|
||
|
locations belong. The number column for a location is of the form
|
||
|
<VAR>breakpoint-number</VAR>.<VAR>location-number</VAR>.
|
||
|
</P><P>
|
||
|
|
||
|
For example:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>Num Type Disp Enb Address What
|
||
|
1 breakpoint keep y <MULTIPLE>
|
||
|
stop only if i==1
|
||
|
breakpoint already hit 1 time
|
||
|
1.1 y 0x080486a2 in void foo<int>() at t.cc:8
|
||
|
1.2 y 0x080486ca in void foo<double>() at t.cc:8
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
Each location can be individually enabled or disabled by passing
|
||
|
<VAR>breakpoint-number</VAR>.<VAR>location-number</VAR> as argument to the
|
||
|
<CODE>enable</CODE> and <CODE>disable</CODE> commands. Note that you cannot
|
||
|
delete the individual locations from the list, you can only delete the
|
||
|
entire list of locations that belong to their parent breakpoint (with
|
||
|
the <KBD>delete <VAR>num</VAR></KBD> command, where <VAR>num</VAR> is the number of
|
||
|
the parent breakpoint, 1 in the above example). Disabling or enabling
|
||
|
the parent breakpoint (see section <A HREF="gdb_6.html#SEC37">5.1.5 Disabling Breakpoints</A>) affects all of the locations
|
||
|
that belong to that breakpoint.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX200"></A>
|
||
|
It's quite common to have a breakpoint inside a shared library.
|
||
|
Shared libraries can be loaded and unloaded explicitly,
|
||
|
and possibly repeatedly, as the program is executed. To support
|
||
|
this use case, GDB updates breakpoint locations whenever
|
||
|
any shared library is loaded or unloaded. Typically, you would
|
||
|
set a breakpoint in a shared library at the beginning of your
|
||
|
debugging session, when the library is not loaded, and when the
|
||
|
symbols from the library are not available. When you try to set
|
||
|
breakpoint, GDB will ask you if you want to set
|
||
|
a so called <EM>pending breakpoint</EM>---breakpoint whose address
|
||
|
is not yet resolved.
|
||
|
</P><P>
|
||
|
|
||
|
After the program is run, whenever a new shared library is loaded,
|
||
|
GDB reevaluates all the breakpoints. When a newly loaded
|
||
|
shared library contains the symbol or line referred to by some
|
||
|
pending breakpoint, that breakpoint is resolved and becomes an
|
||
|
ordinary breakpoint. When a library is unloaded, all breakpoints
|
||
|
that refer to its symbols or source lines become pending again.
|
||
|
</P><P>
|
||
|
|
||
|
This logic works for breakpoints with multiple locations, too. For
|
||
|
example, if you have a breakpoint in a C<TT>++</TT> template function, and
|
||
|
a newly loaded shared library has an instantiation of that template,
|
||
|
a new location is added to the list of locations for the breakpoint.
|
||
|
</P><P>
|
||
|
|
||
|
Except for having unresolved address, pending breakpoints do not
|
||
|
differ from regular breakpoints. You can set conditions or commands,
|
||
|
enable and disable them and perform other breakpoint operations.
|
||
|
</P><P>
|
||
|
|
||
|
GDB provides some additional commands for controlling what
|
||
|
happens when the <SAMP>`break'</SAMP> command cannot resolve breakpoint
|
||
|
address specification to an address:
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX201"></A>
|
||
|
<A NAME="IDX202"></A>
|
||
|
<DL COMPACT>
|
||
|
<DT><CODE>set breakpoint pending auto</CODE>
|
||
|
<DD>This is the default behavior. When GDB cannot find the breakpoint
|
||
|
location, it queries you whether a pending breakpoint should be created.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>set breakpoint pending on</CODE>
|
||
|
<DD>This indicates that an unrecognized breakpoint location should automatically
|
||
|
result in a pending breakpoint being created.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>set breakpoint pending off</CODE>
|
||
|
<DD>This indicates that pending breakpoints are not to be created. Any
|
||
|
unrecognized breakpoint location results in an error. This setting does
|
||
|
not affect any pending breakpoints previously created.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>show breakpoint pending</CODE>
|
||
|
<DD>Show the current behavior setting for creating pending breakpoints.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
The settings above only affect the <CODE>break</CODE> command and its
|
||
|
variants. Once breakpoint is set, it will be automatically updated
|
||
|
as shared libraries are loaded and unloaded.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX203"></A>
|
||
|
For some targets, GDB can automatically decide if hardware or
|
||
|
software breakpoints should be used, depending on whether the
|
||
|
breakpoint address is read-only or read-write. This applies to
|
||
|
breakpoints set with the <CODE>break</CODE> command as well as to internal
|
||
|
breakpoints set by commands like <CODE>next</CODE> and <CODE>finish</CODE>. For
|
||
|
breakpoints set with <CODE>hbreak</CODE>, GDB will always use hardware
|
||
|
breakpoints.
|
||
|
</P><P>
|
||
|
|
||
|
You can control this automatic behaviour with the following commands::
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX204"></A>
|
||
|
<A NAME="IDX205"></A>
|
||
|
<DL COMPACT>
|
||
|
<DT><CODE>set breakpoint auto-hw on</CODE>
|
||
|
<DD>This is the default behavior. When GDB sets a breakpoint, it
|
||
|
will try to use the target memory map to decide if software or hardware
|
||
|
breakpoint must be used.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>set breakpoint auto-hw off</CODE>
|
||
|
<DD>This indicates GDB should not automatically select breakpoint
|
||
|
type. If the target provides a memory map, GDB will warn when
|
||
|
trying to set software breakpoint at a read-only address.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX206"></A>
|
||
|
<A NAME="IDX207"></A>
|
||
|
GDB itself sometimes sets breakpoints in your program for
|
||
|
special purposes, such as proper handling of <CODE>longjmp</CODE> (in C
|
||
|
programs). These internal breakpoints are assigned negative numbers,
|
||
|
starting with <CODE>-1</CODE>; <SAMP>`info breakpoints'</SAMP> does not display them.
|
||
|
You can see these breakpoints with the GDB maintenance command
|
||
|
<SAMP>`maint info breakpoints'</SAMP> (see <A HREF="gdb_32.html#maint info breakpoints">maint info breakpoints</A>).
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="Set Watchpoints"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC34"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC33"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC35"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC35"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC32"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC43"> >> </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> 5.1.2 Setting Watchpoints </H3>
|
||
|
<!--docid::SEC34::-->
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX208"></A>
|
||
|
You can use a watchpoint to stop execution whenever the value of an
|
||
|
expression changes, without having to predict a particular place where
|
||
|
this may happen. (This is sometimes called a <EM>data breakpoint</EM>.)
|
||
|
The expression may be as simple as the value of a single variable, or
|
||
|
as complex as many variables combined by operators. Examples include:
|
||
|
</P><P>
|
||
|
|
||
|
<UL>
|
||
|
<LI>
|
||
|
A reference to the value of a single variable.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
An address cast to an appropriate data type. For example,
|
||
|
<SAMP>`*(int *)0x12345678'</SAMP> will watch a 4-byte region at the specified
|
||
|
address (assuming an <CODE>int</CODE> occupies 4 bytes).
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
An arbitrarily complex expression, such as <SAMP>`a*b + c/d'</SAMP>. The
|
||
|
expression can use any operators valid in the program's native
|
||
|
language (see section <A HREF="gdb_13.html#SEC102">12. Using GDB with Different Languages</A>).
|
||
|
</UL>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX209"></A>
|
||
|
<A NAME="IDX210"></A>
|
||
|
Depending on your system, watchpoints may be implemented in software or
|
||
|
hardware. GDB does software watchpointing by single-stepping your
|
||
|
program and testing the variable's value each time, which is hundreds of
|
||
|
times slower than normal execution. (But this may still be worth it, to
|
||
|
catch errors where you have no clue what part of your program is the
|
||
|
culprit.)
|
||
|
</P><P>
|
||
|
|
||
|
On some systems, such as HP-UX, PowerPC, GNU/Linux and most other
|
||
|
x86-based targets, GDB includes support for hardware
|
||
|
watchpoints, which do not slow down the running of your program.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX211"></A>
|
||
|
<DT><CODE>watch <VAR>expr</VAR> [thread <VAR>threadnum</VAR>]</CODE>
|
||
|
<DD>Set a watchpoint for an expression. GDB will break when the
|
||
|
expression <VAR>expr</VAR> is written into by the program and its value
|
||
|
changes. The simplest (and the most popular) use of this command is
|
||
|
to watch the value of a single variable:
|
||
|
<P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>(gdb) watch foo
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
If the command includes a <CODE>[thread <VAR>threadnum</VAR>]</CODE>
|
||
|
clause, GDB breaks only when the thread identified by
|
||
|
<VAR>threadnum</VAR> changes the value of <VAR>expr</VAR>. If any other threads
|
||
|
change the value of <VAR>expr</VAR>, GDB will not break. Note
|
||
|
that watchpoints restricted to a single thread in this way only work
|
||
|
with Hardware Watchpoints.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX212"></A>
|
||
|
<DT><CODE>rwatch <VAR>expr</VAR> [thread <VAR>threadnum</VAR>]</CODE>
|
||
|
<DD>Set a watchpoint that will break when the value of <VAR>expr</VAR> is read
|
||
|
by the program.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX213"></A>
|
||
|
<DT><CODE>awatch <VAR>expr</VAR> [thread <VAR>threadnum</VAR>]</CODE>
|
||
|
<DD>Set a watchpoint that will break when <VAR>expr</VAR> is either read from
|
||
|
or written into by the program.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX214"></A>
|
||
|
<DT><CODE>info watchpoints</CODE>
|
||
|
<DD>This command prints a list of watchpoints, breakpoints, and catchpoints;
|
||
|
it is the same as <CODE>info break</CODE> (see section <A HREF="gdb_6.html#SEC33">5.1.1 Setting Breakpoints</A>).
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
GDB sets a <EM>hardware watchpoint</EM> if possible. Hardware
|
||
|
watchpoints execute very quickly, and the debugger reports a change in
|
||
|
value at the exact instruction where the change occurs. If GDB
|
||
|
cannot set a hardware watchpoint, it sets a software watchpoint, which
|
||
|
executes more slowly and reports the change in value at the next
|
||
|
<EM>statement</EM>, not the instruction, after the change occurs.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX215"></A>
|
||
|
You can force GDB to use only software watchpoints with the
|
||
|
<KBD>set can-use-hw-watchpoints 0</KBD> command. With this variable set to
|
||
|
zero, GDB will never try to use hardware watchpoints, even if
|
||
|
the underlying system supports them. (Note that hardware-assisted
|
||
|
watchpoints that were set <EM>before</EM> setting
|
||
|
<CODE>can-use-hw-watchpoints</CODE> to zero will still use the hardware
|
||
|
mechanism of watching expression values.)
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<DT><CODE>set can-use-hw-watchpoints</CODE>
|
||
|
<DD><A NAME="IDX216"></A>
|
||
|
Set whether or not to use hardware watchpoints.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>show can-use-hw-watchpoints</CODE>
|
||
|
<DD><A NAME="IDX217"></A>
|
||
|
Show the current mode of using hardware watchpoints.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
For remote targets, you can restrict the number of hardware
|
||
|
watchpoints GDB will use, see <A HREF="gdb_18.html#set remote hardware-breakpoint-limit">set remote hardware-breakpoint-limit</A>.
|
||
|
</P><P>
|
||
|
|
||
|
When you issue the <CODE>watch</CODE> command, GDB reports
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>Hardware watchpoint <VAR>num</VAR>: <VAR>expr</VAR>
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
if it was able to set a hardware watchpoint.
|
||
|
</P><P>
|
||
|
|
||
|
Currently, the <CODE>awatch</CODE> and <CODE>rwatch</CODE> commands can only set
|
||
|
hardware watchpoints, because accesses to data that don't change the
|
||
|
value of the watched expression cannot be detected without examining
|
||
|
every instruction as it is being executed, and GDB does not do
|
||
|
that currently. If GDB finds that it is unable to set a
|
||
|
hardware breakpoint with the <CODE>awatch</CODE> or <CODE>rwatch</CODE> command, it
|
||
|
will print a message like this:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>Expression cannot be implemented with read/access watchpoint.
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
Sometimes, GDB cannot set a hardware watchpoint because the
|
||
|
data type of the watched expression is wider than what a hardware
|
||
|
watchpoint on the target machine can handle. For example, some systems
|
||
|
can only watch regions that are up to 4 bytes wide; on such systems you
|
||
|
cannot set hardware watchpoints for an expression that yields a
|
||
|
double-precision floating-point number (which is typically 8 bytes
|
||
|
wide). As a work-around, it might be possible to break the large region
|
||
|
into a series of smaller ones and watch them with separate watchpoints.
|
||
|
</P><P>
|
||
|
|
||
|
If you set too many hardware watchpoints, GDB might be unable
|
||
|
to insert all of them when you resume the execution of your program.
|
||
|
Since the precise number of active watchpoints is unknown until such
|
||
|
time as the program is about to be resumed, GDB might not be
|
||
|
able to warn you about this when you set the watchpoints, and the
|
||
|
warning will be printed only when the program is resumed:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>Hardware watchpoint <VAR>num</VAR>: Could not insert watchpoint
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
If this happens, delete or disable some of the watchpoints.
|
||
|
</P><P>
|
||
|
|
||
|
Watching complex expressions that reference many variables can also
|
||
|
exhaust the resources available for hardware-assisted watchpoints.
|
||
|
That's because GDB needs to watch every variable in the
|
||
|
expression with separately allocated resources.
|
||
|
</P><P>
|
||
|
|
||
|
The SPARClite DSU will generate traps when a program accesses some data
|
||
|
or instruction address that is assigned to the debug registers. For the
|
||
|
data addresses, DSU facilitates the <CODE>watch</CODE> command. However the
|
||
|
hardware breakpoint registers can only take two data watchpoints, and
|
||
|
both watchpoints must be the same kind. For example, you can set two
|
||
|
watchpoints with <CODE>watch</CODE> commands, two with <CODE>rwatch</CODE> commands,
|
||
|
<STRONG>or</STRONG> two with <CODE>awatch</CODE> commands, but you cannot set one
|
||
|
watchpoint with one command and the other with a different command.
|
||
|
GDB will reject the command if you try to mix watchpoints.
|
||
|
Delete or disable unused watchpoint commands before setting new ones.
|
||
|
</P><P>
|
||
|
|
||
|
If you call a function interactively using <CODE>print</CODE> or <CODE>call</CODE>,
|
||
|
any watchpoints you have set will be inactive until GDB reaches another
|
||
|
kind of breakpoint or the call completes.
|
||
|
</P><P>
|
||
|
|
||
|
GDB automatically deletes watchpoints that watch local
|
||
|
(automatic) variables, or expressions that involve such variables, when
|
||
|
they go out of scope, that is, when the execution leaves the block in
|
||
|
which these variables were defined. In particular, when the program
|
||
|
being debugged terminates, <EM>all</EM> local variables go out of scope,
|
||
|
and so only watchpoints that watch global variables remain set. If you
|
||
|
rerun the program, you will need to set all such watchpoints again. One
|
||
|
way of doing that would be to set a code breakpoint at the entry to the
|
||
|
<CODE>main</CODE> function and when it breaks, set all the watchpoints.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX218"></A>
|
||
|
<A NAME="IDX219"></A>
|
||
|
In multi-threaded programs, watchpoints will detect changes to the
|
||
|
watched expression from every thread.
|
||
|
</P><P>
|
||
|
|
||
|
<BLOCKQUOTE>
|
||
|
<EM>Warning:</EM> In multi-threaded programs, software watchpoints
|
||
|
have only limited usefulness. If GDB creates a software
|
||
|
watchpoint, it can only watch the value of an expression <EM>in a
|
||
|
single thread</EM>. If you are confident that the expression can only
|
||
|
change due to the current thread's activity (and if you are also
|
||
|
confident that no other thread can become current), then you can use
|
||
|
software watchpoints as usual. However, GDB may not notice
|
||
|
when a non-current thread's activity changes the expression. (Hardware
|
||
|
watchpoints, in contrast, watch an expression in all threads.)
|
||
|
</BLOCKQUOTE>
|
||
|
<P>
|
||
|
|
||
|
See <A HREF="gdb_18.html#set remote hardware-watchpoint-limit">set remote hardware-watchpoint-limit</A>.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="Set Catchpoints"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC35"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC34"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC36"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC36"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC32"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC43"> >> </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> 5.1.3 Setting Catchpoints </H3>
|
||
|
<!--docid::SEC35::-->
|
||
|
<P>
|
||
|
|
||
|
You can use <EM>catchpoints</EM> to cause the debugger to stop for certain
|
||
|
kinds of program events, such as C<TT>++</TT> exceptions or the loading of a
|
||
|
shared library. Use the <CODE>catch</CODE> command to set a catchpoint.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX220"></A>
|
||
|
<DT><CODE>catch <VAR>event</VAR></CODE>
|
||
|
<DD>Stop when <VAR>event</VAR> occurs. <VAR>event</VAR> can be any of the following:
|
||
|
<DL COMPACT>
|
||
|
<DT><CODE>throw</CODE>
|
||
|
<DD><A NAME="IDX221"></A>
|
||
|
The throwing of a C<TT>++</TT> exception.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>catch</CODE>
|
||
|
<DD>The catching of a C<TT>++</TT> exception.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>exception</CODE>
|
||
|
<DD><A NAME="IDX222"></A>
|
||
|
<A NAME="IDX223"></A>
|
||
|
An Ada exception being raised. If an exception name is specified
|
||
|
at the end of the command (eg <CODE>catch exception Program_Error</CODE>),
|
||
|
the debugger will stop only when this specific exception is raised.
|
||
|
Otherwise, the debugger stops execution when any Ada exception is raised.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>exception unhandled</CODE>
|
||
|
<DD>An exception that was raised but is not handled by the program.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>assert</CODE>
|
||
|
<DD>A failed Ada assertion.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>exec</CODE>
|
||
|
<DD><A NAME="IDX224"></A>
|
||
|
A call to <CODE>exec</CODE>. This is currently only available for HP-UX
|
||
|
and GNU/Linux.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>fork</CODE>
|
||
|
<DD>A call to <CODE>fork</CODE>. This is currently only available for HP-UX
|
||
|
and GNU/Linux.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>vfork</CODE>
|
||
|
<DD>A call to <CODE>vfork</CODE>. This is currently only available for HP-UX
|
||
|
and GNU/Linux.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>load</CODE>
|
||
|
<DD><DT><CODE>load <VAR>libname</VAR></CODE>
|
||
|
<DD><A NAME="IDX225"></A>
|
||
|
The dynamic loading of any shared library, or the loading of the library
|
||
|
<VAR>libname</VAR>. This is currently only available for HP-UX.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>unload</CODE>
|
||
|
<DD><DT><CODE>unload <VAR>libname</VAR></CODE>
|
||
|
<DD>The unloading of any dynamically loaded shared library, or the unloading
|
||
|
of the library <VAR>libname</VAR>. This is currently only available for HP-UX.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>tcatch <VAR>event</VAR></CODE>
|
||
|
<DD>Set a catchpoint that is enabled only for one stop. The catchpoint is
|
||
|
automatically deleted after the first time the event is caught.
|
||
|
<P>
|
||
|
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
Use the <CODE>info break</CODE> command to list the current catchpoints.
|
||
|
</P><P>
|
||
|
|
||
|
There are currently some limitations to C<TT>++</TT> exception handling
|
||
|
(<CODE>catch throw</CODE> and <CODE>catch catch</CODE>) in GDB:
|
||
|
</P><P>
|
||
|
|
||
|
<UL>
|
||
|
<LI>
|
||
|
If you call a function interactively, GDB normally returns
|
||
|
control to you when the function has finished executing. If the call
|
||
|
raises an exception, however, the call may bypass the mechanism that
|
||
|
returns control to you and cause your program either to abort or to
|
||
|
simply continue running until it hits a breakpoint, catches a signal
|
||
|
that GDB is listening for, or exits. This is the case even if
|
||
|
you set a catchpoint for the exception; catchpoints on exceptions are
|
||
|
disabled within interactive calls.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
You cannot raise an exception interactively.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
You cannot install an exception handler interactively.
|
||
|
</UL>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX226"></A>
|
||
|
Sometimes <CODE>catch</CODE> is not the best way to debug exception handling:
|
||
|
if you need to know exactly where an exception is raised, it is better to
|
||
|
stop <EM>before</EM> the exception handler is called, since that way you
|
||
|
can see the stack before any unwinding takes place. If you set a
|
||
|
breakpoint in an exception handler instead, it may not be easy to find
|
||
|
out where the exception was raised.
|
||
|
</P><P>
|
||
|
|
||
|
To stop just before an exception handler is called, you need some
|
||
|
knowledge of the implementation. In the case of GNU C<TT>++</TT>, exceptions are
|
||
|
raised by calling a library function named <CODE>__raise_exception</CODE>
|
||
|
which has the following ANSI C interface:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre> /* <VAR>addr</VAR> is where the exception identifier is stored.
|
||
|
<VAR>id</VAR> is the exception identifier. */
|
||
|
void __raise_exception (void **addr, void *id);
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
To make the debugger catch all exceptions before any stack
|
||
|
unwinding takes place, set a breakpoint on <CODE>__raise_exception</CODE>
|
||
|
(see section <A HREF="gdb_6.html#SEC32">Breakpoints; Watchpoints; and Exceptions</A>).
|
||
|
</P><P>
|
||
|
|
||
|
With a conditional breakpoint (see section <A HREF="gdb_6.html#SEC38">Break Conditions</A>)
|
||
|
that depends on the value of <VAR>id</VAR>, you can stop your program when
|
||
|
a specific exception is raised. You can use multiple conditional
|
||
|
breakpoints to stop your program when any of a number of exceptions are
|
||
|
raised.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="Delete Breaks"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC36"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC35"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC37"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC37"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC32"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC43"> >> </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> 5.1.4 Deleting Breakpoints </H3>
|
||
|
<!--docid::SEC36::-->
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX227"></A>
|
||
|
<A NAME="IDX228"></A>
|
||
|
It is often necessary to eliminate a breakpoint, watchpoint, or
|
||
|
catchpoint once it has done its job and you no longer want your program
|
||
|
to stop there. This is called <EM>deleting</EM> the breakpoint. A
|
||
|
breakpoint that has been deleted no longer exists; it is forgotten.
|
||
|
</P><P>
|
||
|
|
||
|
With the <CODE>clear</CODE> command you can delete breakpoints according to
|
||
|
where they are in your program. With the <CODE>delete</CODE> command you can
|
||
|
delete individual breakpoints, watchpoints, or catchpoints by specifying
|
||
|
their breakpoint numbers.
|
||
|
</P><P>
|
||
|
|
||
|
It is not necessary to delete a breakpoint to proceed past it. GDB
|
||
|
automatically ignores breakpoints on the first instruction to be executed
|
||
|
when you continue execution without changing the execution address.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX229"></A>
|
||
|
<DT><CODE>clear</CODE>
|
||
|
<DD>Delete any breakpoints at the next instruction to be executed in the
|
||
|
selected stack frame (see section <A HREF="gdb_7.html#SEC49">Selecting a Frame</A>). When
|
||
|
the innermost frame is selected, this is a good way to delete a
|
||
|
breakpoint where your program just stopped.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>clear <VAR>location</VAR></CODE>
|
||
|
<DD>Delete any breakpoints set at the specified <VAR>location</VAR>.
|
||
|
See section <A HREF="gdb_8.html#SEC53">7.2 Specifying a Location</A>, for the various forms of <VAR>location</VAR>; the
|
||
|
most useful ones are listed below:
|
||
|
<P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<DT><CODE>clear <VAR>function</VAR></CODE>
|
||
|
<DD><DT><CODE>clear <VAR>filename</VAR>:<VAR>function</VAR></CODE>
|
||
|
<DD>Delete any breakpoints set at entry to the named <VAR>function</VAR>.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>clear <VAR>linenum</VAR></CODE>
|
||
|
<DD><DT><CODE>clear <VAR>filename</VAR>:<VAR>linenum</VAR></CODE>
|
||
|
<DD>Delete any breakpoints set at or within the code of the specified
|
||
|
<VAR>linenum</VAR> of the specified <VAR>filename</VAR>.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX230"></A>
|
||
|
<A NAME="IDX231"></A>
|
||
|
<A NAME="IDX232"></A>
|
||
|
<DT><CODE>delete [breakpoints] [<VAR>range</VAR><small>...</small>]</CODE>
|
||
|
<DD>Delete the breakpoints, watchpoints, or catchpoints of the breakpoint
|
||
|
ranges specified as arguments. If no argument is specified, delete all
|
||
|
breakpoints (GDB asks confirmation, unless you have <CODE>set
|
||
|
confirm off</CODE>). You can abbreviate this command as <CODE>d</CODE>.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="Disabling"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC37"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC36"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC38"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC38"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC32"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC43"> >> </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> 5.1.5 Disabling Breakpoints </H3>
|
||
|
<!--docid::SEC37::-->
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX233"></A>
|
||
|
Rather than deleting a breakpoint, watchpoint, or catchpoint, you might
|
||
|
prefer to <EM>disable</EM> it. This makes the breakpoint inoperative as if
|
||
|
it had been deleted, but remembers the information on the breakpoint so
|
||
|
that you can <EM>enable</EM> it again later.
|
||
|
</P><P>
|
||
|
|
||
|
You disable and enable breakpoints, watchpoints, and catchpoints with
|
||
|
the <CODE>enable</CODE> and <CODE>disable</CODE> commands, optionally specifying one
|
||
|
or more breakpoint numbers as arguments. Use <CODE>info break</CODE> or
|
||
|
<CODE>info watch</CODE> to print a list of breakpoints, watchpoints, and
|
||
|
catchpoints if you do not know which numbers to use.
|
||
|
</P><P>
|
||
|
|
||
|
Disabling and enabling a breakpoint that has multiple locations
|
||
|
affects all of its locations.
|
||
|
</P><P>
|
||
|
|
||
|
A breakpoint, watchpoint, or catchpoint can have any of four different
|
||
|
states of enablement:
|
||
|
</P><P>
|
||
|
|
||
|
<UL>
|
||
|
<LI>
|
||
|
Enabled. The breakpoint stops your program. A breakpoint set
|
||
|
with the <CODE>break</CODE> command starts out in this state.
|
||
|
<LI>
|
||
|
Disabled. The breakpoint has no effect on your program.
|
||
|
<LI>
|
||
|
Enabled once. The breakpoint stops your program, but then becomes
|
||
|
disabled.
|
||
|
<LI>
|
||
|
Enabled for deletion. The breakpoint stops your program, but
|
||
|
immediately after it does so it is deleted permanently. A breakpoint
|
||
|
set with the <CODE>tbreak</CODE> command starts out in this state.
|
||
|
</UL>
|
||
|
<P>
|
||
|
|
||
|
You can use the following commands to enable or disable breakpoints,
|
||
|
watchpoints, and catchpoints:
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX234"></A>
|
||
|
<A NAME="IDX235"></A>
|
||
|
<DT><CODE>disable [breakpoints] [<VAR>range</VAR><small>...</small>]</CODE>
|
||
|
<DD>Disable the specified breakpoints--or all breakpoints, if none are
|
||
|
listed. A disabled breakpoint has no effect but is not forgotten. All
|
||
|
options such as ignore-counts, conditions and commands are remembered in
|
||
|
case the breakpoint is enabled again later. You may abbreviate
|
||
|
<CODE>disable</CODE> as <CODE>dis</CODE>.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX236"></A>
|
||
|
<DT><CODE>enable [breakpoints] [<VAR>range</VAR><small>...</small>]</CODE>
|
||
|
<DD>Enable the specified breakpoints (or all defined breakpoints). They
|
||
|
become effective once again in stopping your program.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>enable [breakpoints] once <VAR>range</VAR><small>...</small></CODE>
|
||
|
<DD>Enable the specified breakpoints temporarily. GDB disables any
|
||
|
of these breakpoints immediately after stopping your program.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>enable [breakpoints] delete <VAR>range</VAR><small>...</small></CODE>
|
||
|
<DD>Enable the specified breakpoints to work once, then die. GDB
|
||
|
deletes any of these breakpoints as soon as your program stops there.
|
||
|
Breakpoints set by the <CODE>tbreak</CODE> command start out in this state.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
Except for a breakpoint set with <CODE>tbreak</CODE> (see section <A HREF="gdb_6.html#SEC33">Setting Breakpoints</A>), breakpoints that you set are initially enabled;
|
||
|
subsequently, they become disabled or enabled only when you use one of
|
||
|
the commands above. (The command <CODE>until</CODE> can set and delete a
|
||
|
breakpoint of its own, but it does not change the state of your other
|
||
|
breakpoints; see <A HREF="gdb_6.html#SEC43">Continuing and Stepping</A>.)
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="Conditions"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC38"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC37"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC39"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC39"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC32"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC43"> >> </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> 5.1.6 Break Conditions </H3>
|
||
|
<!--docid::SEC38::-->
|
||
|
<P>
|
||
|
|
||
|
The simplest sort of breakpoint breaks every time your program reaches a
|
||
|
specified place. You can also specify a <EM>condition</EM> for a
|
||
|
breakpoint. A condition is just a Boolean expression in your
|
||
|
programming language (see section <A HREF="gdb_9.html#SEC60">Expressions</A>). A breakpoint with
|
||
|
a condition evaluates the expression each time your program reaches it,
|
||
|
and your program stops only if the condition is <EM>true</EM>.
|
||
|
</P><P>
|
||
|
|
||
|
This is the converse of using assertions for program validation; in that
|
||
|
situation, you want to stop when the assertion is violated--that is,
|
||
|
when the condition is false. In C, if you want to test an assertion expressed
|
||
|
by the condition <VAR>assert</VAR>, you should set the condition
|
||
|
<SAMP>`! <VAR>assert</VAR>'</SAMP> on the appropriate breakpoint.
|
||
|
</P><P>
|
||
|
|
||
|
Conditions are also accepted for watchpoints; you may not need them,
|
||
|
since a watchpoint is inspecting the value of an expression anyhow--but
|
||
|
it might be simpler, say, to just set a watchpoint on a variable name,
|
||
|
and specify a condition that tests whether the new value is an interesting
|
||
|
one.
|
||
|
</P><P>
|
||
|
|
||
|
Break conditions can have side effects, and may even call functions in
|
||
|
your program. This can be useful, for example, to activate functions
|
||
|
that log program progress, or to use your own print functions to
|
||
|
format special data structures. The effects are completely predictable
|
||
|
unless there is another enabled breakpoint at the same address. (In
|
||
|
that case, GDB might see the other breakpoint first and stop your
|
||
|
program without checking the condition of this one.) Note that
|
||
|
breakpoint commands are usually more convenient and flexible than break
|
||
|
conditions for the
|
||
|
purpose of performing side effects when a breakpoint is reached
|
||
|
(see section <A HREF="gdb_6.html#SEC39">Breakpoint Command Lists</A>).
|
||
|
</P><P>
|
||
|
|
||
|
Break conditions can be specified when a breakpoint is set, by using
|
||
|
<SAMP>`if'</SAMP> in the arguments to the <CODE>break</CODE> command. See section <A HREF="gdb_6.html#SEC33">Setting Breakpoints</A>. They can also be changed at any time
|
||
|
with the <CODE>condition</CODE> command.
|
||
|
</P><P>
|
||
|
|
||
|
You can also use the <CODE>if</CODE> keyword with the <CODE>watch</CODE> command.
|
||
|
The <CODE>catch</CODE> command does not recognize the <CODE>if</CODE> keyword;
|
||
|
<CODE>condition</CODE> is the only way to impose a further condition on a
|
||
|
catchpoint.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX237"></A>
|
||
|
<DT><CODE>condition <VAR>bnum</VAR> <VAR>expression</VAR></CODE>
|
||
|
<DD>Specify <VAR>expression</VAR> as the break condition for breakpoint,
|
||
|
watchpoint, or catchpoint number <VAR>bnum</VAR>. After you set a condition,
|
||
|
breakpoint <VAR>bnum</VAR> stops your program only if the value of
|
||
|
<VAR>expression</VAR> is true (nonzero, in C). When you use
|
||
|
<CODE>condition</CODE>, GDB checks <VAR>expression</VAR> immediately for
|
||
|
syntactic correctness, and to determine whether symbols in it have
|
||
|
referents in the context of your breakpoint. If <VAR>expression</VAR> uses
|
||
|
symbols not referenced in the context of the breakpoint, GDB
|
||
|
prints an error message:
|
||
|
<P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>No symbol "foo" in current context.
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
GDB does
|
||
|
not actually evaluate <VAR>expression</VAR> at the time the <CODE>condition</CODE>
|
||
|
command (or a command that sets a breakpoint with a condition, like
|
||
|
<CODE>break if <small>...</small></CODE>) is given, however. See section <A HREF="gdb_9.html#SEC60">Expressions</A>.
|
||
|
</P><P>
|
||
|
|
||
|
<DT><CODE>condition <VAR>bnum</VAR></CODE>
|
||
|
<DD>Remove the condition from breakpoint number <VAR>bnum</VAR>. It becomes
|
||
|
an ordinary unconditional breakpoint.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX238"></A>
|
||
|
A special case of a breakpoint condition is to stop only when the
|
||
|
breakpoint has been reached a certain number of times. This is so
|
||
|
useful that there is a special way to do it, using the <EM>ignore
|
||
|
count</EM> of the breakpoint. Every breakpoint has an ignore count, which
|
||
|
is an integer. Most of the time, the ignore count is zero, and
|
||
|
therefore has no effect. But if your program reaches a breakpoint whose
|
||
|
ignore count is positive, then instead of stopping, it just decrements
|
||
|
the ignore count by one and continues. As a result, if the ignore count
|
||
|
value is <VAR>n</VAR>, the breakpoint does not stop the next <VAR>n</VAR> times
|
||
|
your program reaches it.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX239"></A>
|
||
|
<DT><CODE>ignore <VAR>bnum</VAR> <VAR>count</VAR></CODE>
|
||
|
<DD>Set the ignore count of breakpoint number <VAR>bnum</VAR> to <VAR>count</VAR>.
|
||
|
The next <VAR>count</VAR> times the breakpoint is reached, your program's
|
||
|
execution does not stop; other than to decrement the ignore count, GDB
|
||
|
takes no action.
|
||
|
<P>
|
||
|
|
||
|
To make the breakpoint stop the next time it is reached, specify
|
||
|
a count of zero.
|
||
|
</P><P>
|
||
|
|
||
|
When you use <CODE>continue</CODE> to resume execution of your program from a
|
||
|
breakpoint, you can specify an ignore count directly as an argument to
|
||
|
<CODE>continue</CODE>, rather than using <CODE>ignore</CODE>. See section <A HREF="gdb_6.html#SEC43">Continuing and Stepping</A>.
|
||
|
</P><P>
|
||
|
|
||
|
If a breakpoint has a positive ignore count and a condition, the
|
||
|
condition is not checked. Once the ignore count reaches zero,
|
||
|
GDB resumes checking the condition.
|
||
|
</P><P>
|
||
|
|
||
|
You could achieve the effect of the ignore count with a condition such
|
||
|
as <SAMP>`$foo-- <= 0'</SAMP> using a debugger convenience variable that
|
||
|
is decremented each time. See section <A HREF="gdb_9.html#SEC68">Convenience Variables</A>.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
Ignore counts apply to breakpoints, watchpoints, and catchpoints.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="Break Commands"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC39"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC38"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC40"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC40"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC32"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC43"> >> </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> 5.1.7 Breakpoint Command Lists </H3>
|
||
|
<!--docid::SEC39::-->
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX240"></A>
|
||
|
You can give any breakpoint (or watchpoint or catchpoint) a series of
|
||
|
commands to execute when your program stops due to that breakpoint. For
|
||
|
example, you might want to print the values of certain expressions, or
|
||
|
enable other breakpoints.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX241"></A>
|
||
|
<A NAME="IDX242"></A>
|
||
|
<DT><CODE>commands [<VAR>bnum</VAR>]</CODE>
|
||
|
<DD><DT><CODE><small>...</small> <VAR>command-list</VAR> <small>...</small></CODE>
|
||
|
<DD><DT><CODE>end</CODE>
|
||
|
<DD>Specify a list of commands for breakpoint number <VAR>bnum</VAR>. The commands
|
||
|
themselves appear on the following lines. Type a line containing just
|
||
|
<CODE>end</CODE> to terminate the commands.
|
||
|
<P>
|
||
|
|
||
|
To remove all commands from a breakpoint, type <CODE>commands</CODE> and
|
||
|
follow it immediately with <CODE>end</CODE>; that is, give no commands.
|
||
|
</P><P>
|
||
|
|
||
|
With no <VAR>bnum</VAR> argument, <CODE>commands</CODE> refers to the last
|
||
|
breakpoint, watchpoint, or catchpoint set (not to the breakpoint most
|
||
|
recently encountered).
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
Pressing <KBD>RET</KBD> as a means of repeating the last GDB command is
|
||
|
disabled within a <VAR>command-list</VAR>.
|
||
|
</P><P>
|
||
|
|
||
|
You can use breakpoint commands to start your program up again. Simply
|
||
|
use the <CODE>continue</CODE> command, or <CODE>step</CODE>, or any other command
|
||
|
that resumes execution.
|
||
|
</P><P>
|
||
|
|
||
|
Any other commands in the command list, after a command that resumes
|
||
|
execution, are ignored. This is because any time you resume execution
|
||
|
(even with a simple <CODE>next</CODE> or <CODE>step</CODE>), you may encounter
|
||
|
another breakpoint--which could have its own command list, leading to
|
||
|
ambiguities about which list to execute.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX243"></A>
|
||
|
If the first command you specify in a command list is <CODE>silent</CODE>, the
|
||
|
usual message about stopping at a breakpoint is not printed. This may
|
||
|
be desirable for breakpoints that are to print a specific message and
|
||
|
then continue. If none of the remaining commands print anything, you
|
||
|
see no sign that the breakpoint was reached. <CODE>silent</CODE> is
|
||
|
meaningful only at the beginning of a breakpoint command list.
|
||
|
</P><P>
|
||
|
|
||
|
The commands <CODE>echo</CODE>, <CODE>output</CODE>, and <CODE>printf</CODE> allow you to
|
||
|
print precisely controlled output, and are often useful in silent
|
||
|
breakpoints. See section <A HREF="gdb_21.html#SEC233">Commands for Controlled Output</A>.
|
||
|
</P><P>
|
||
|
|
||
|
For example, here is how you could use breakpoint commands to print the
|
||
|
value of <CODE>x</CODE> at entry to <CODE>foo</CODE> whenever <CODE>x</CODE> is positive.
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>break foo if x>0
|
||
|
commands
|
||
|
silent
|
||
|
printf "x is %d\n",x
|
||
|
cont
|
||
|
end
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
One application for breakpoint commands is to compensate for one bug so
|
||
|
you can test for another. Put a breakpoint just after the erroneous line
|
||
|
of code, give it a condition to detect the case in which something
|
||
|
erroneous has been done, and give it commands to assign correct values
|
||
|
to any variables that need them. End with the <CODE>continue</CODE> command
|
||
|
so that your program does not stop, and start with the <CODE>silent</CODE>
|
||
|
command so that no output is produced. Here is an example:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>break 403
|
||
|
commands
|
||
|
silent
|
||
|
set x = y + 4
|
||
|
cont
|
||
|
end
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
<A NAME="Breakpoint Menus"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC40"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC39"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC41"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC41"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC32"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC43"> >> </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> 5.1.8 Breakpoint Menus </H3>
|
||
|
<!--docid::SEC40::-->
|
||
|
<P>
|
||
|
|
||
|
Some programming languages (notably C<TT>++</TT> and Objective-C) permit a
|
||
|
single function name
|
||
|
to be defined several times, for application in different contexts.
|
||
|
This is called <EM>overloading</EM>. When a function name is overloaded,
|
||
|
<SAMP>`break <VAR>function</VAR>'</SAMP> is not enough to tell GDB where you want
|
||
|
a breakpoint. You can use explicit signature of the function, as in
|
||
|
<SAMP>`break <VAR>function</VAR>(<VAR>types</VAR>)'</SAMP>, to specify which
|
||
|
particular version of the function you want. Otherwise, GDB offers
|
||
|
you a menu of numbered choices for different possible breakpoints, and
|
||
|
waits for your selection with the prompt <SAMP>`>'</SAMP>. The first two
|
||
|
options are always <SAMP>`[0] cancel'</SAMP> and <SAMP>`[1] all'</SAMP>. Typing <KBD>1</KBD>
|
||
|
sets a breakpoint at each definition of <VAR>function</VAR>, and typing
|
||
|
<KBD>0</KBD> aborts the <CODE>break</CODE> command without setting any new
|
||
|
breakpoints.
|
||
|
</P><P>
|
||
|
|
||
|
For example, the following session excerpt shows an attempt to set a
|
||
|
breakpoint at the overloaded symbol <CODE>String::after</CODE>.
|
||
|
We choose three particular definitions of that function name:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>(gdb) b String::after
|
||
|
[0] cancel
|
||
|
[1] all
|
||
|
[2] file:String.cc; line number:867
|
||
|
[3] file:String.cc; line number:860
|
||
|
[4] file:String.cc; line number:875
|
||
|
[5] file:String.cc; line number:853
|
||
|
[6] file:String.cc; line number:846
|
||
|
[7] file:String.cc; line number:735
|
||
|
> 2 4 6
|
||
|
Breakpoint 1 at 0xb26c: file String.cc, line 867.
|
||
|
Breakpoint 2 at 0xb344: file String.cc, line 875.
|
||
|
Breakpoint 3 at 0xafcc: file String.cc, line 846.
|
||
|
Multiple breakpoints were set.
|
||
|
Use the "delete" command to delete unwanted
|
||
|
breakpoints.
|
||
|
(gdb)
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
<A NAME="Error in Breakpoints"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC41"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC40"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC42"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC31"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC32"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC43"> >> </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> 5.1.9 "Cannot insert breakpoints" </H3>
|
||
|
<!--docid::SEC41::-->
|
||
|
Under some operating systems, breakpoints cannot be used in a program if
|
||
|
any other process is running that program. In this situation,
|
||
|
attempting to run or continue a program with a breakpoint causes
|
||
|
GDB to print an error message:
|
||
|
<P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>Cannot insert breakpoints.
|
||
|
The same program may be running in another process.
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
When this happens, you have three ways to proceed:
|
||
|
</P><P>
|
||
|
|
||
|
<OL>
|
||
|
<LI>
|
||
|
Remove or disable the breakpoints, then continue.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
Suspend GDB, and copy the file containing your program to a new
|
||
|
name. Resume GDB and use the <CODE>exec-file</CODE> command to specify
|
||
|
that GDB should run your program under that name.
|
||
|
Then start your program again.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
Relink your program so that the text segment is nonsharable, using the
|
||
|
linker option <SAMP>`-N'</SAMP>. The operating system limitation may not apply
|
||
|
to nonsharable executables.
|
||
|
</OL>
|
||
|
<P>
|
||
|
|
||
|
A similar message can be printed if you request too many active
|
||
|
hardware-assisted breakpoints and watchpoints:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>Stopped; cannot insert breakpoints.
|
||
|
You may have requested too many hardware breakpoints and watchpoints.
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
This message is printed when you attempt to resume the program, since
|
||
|
only then GDB knows exactly how many hardware breakpoints and
|
||
|
watchpoints it needs to insert.
|
||
|
</P><P>
|
||
|
|
||
|
When this message is printed, you need to disable or remove some of the
|
||
|
hardware-assisted breakpoints and watchpoints, and then continue.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="Breakpoint-related Warnings"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC42"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC41"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC43"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC34"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC32"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC43"> >> </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> 5.1.10 "Breakpoint address adjusted..." </H3>
|
||
|
<!--docid::SEC42::-->
|
||
|
<P>
|
||
|
|
||
|
Some processor architectures place constraints on the addresses at
|
||
|
which breakpoints may be placed. For architectures thus constrained,
|
||
|
GDB will attempt to adjust the breakpoint's address to comply
|
||
|
with the constraints dictated by the architecture.
|
||
|
</P><P>
|
||
|
|
||
|
One example of such an architecture is the Fujitsu FR-V. The FR-V is
|
||
|
a VLIW architecture in which a number of RISC-like instructions may be
|
||
|
bundled together for parallel execution. The FR-V architecture
|
||
|
constrains the location of a breakpoint instruction within such a
|
||
|
bundle to the instruction with the lowest address. GDB
|
||
|
honors this constraint by adjusting a breakpoint's address to the
|
||
|
first in the bundle.
|
||
|
</P><P>
|
||
|
|
||
|
It is not uncommon for optimized code to have bundles which contain
|
||
|
instructions from different source statements, thus it may happen that
|
||
|
a breakpoint's address will be adjusted from one source statement to
|
||
|
another. Since this adjustment may significantly alter GDB's
|
||
|
breakpoint related behavior from what the user expects, a warning is
|
||
|
printed when the breakpoint is first set and also when the breakpoint
|
||
|
is hit.
|
||
|
</P><P>
|
||
|
|
||
|
A warning like the one below is printed when setting a breakpoint
|
||
|
that's been subject to address adjustment:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>warning: Breakpoint address adjusted from 0x00010414 to 0x00010410.
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
Such warnings are printed both for user settable and GDB's
|
||
|
internal breakpoints. If you see one of these warnings, you should
|
||
|
verify that a breakpoint set at the adjusted address will have the
|
||
|
desired affect. If not, the breakpoint in question may be removed and
|
||
|
other breakpoints may be set which will have the desired behavior.
|
||
|
E.g., it may be sufficient to place the breakpoint at a later
|
||
|
instruction. A conditional breakpoint may also be useful in some
|
||
|
cases to prevent the breakpoint from triggering too often.
|
||
|
</P><P>
|
||
|
|
||
|
GDB will also issue a warning when stopping at one of these
|
||
|
adjusted breakpoints:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>warning: Breakpoint 1 address previously adjusted from 0x00010414
|
||
|
to 0x00010410.
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
When this warning is encountered, it may be too late to take remedial
|
||
|
action except in cases where the breakpoint is hit earlier or more
|
||
|
frequently than expected.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="Continuing and Stepping"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC43"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC42"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC44"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC44"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC31"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_7.html#SEC46"> >> </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> 5.2 Continuing and Stepping </H2>
|
||
|
<!--docid::SEC43::-->
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX244"></A>
|
||
|
<A NAME="IDX245"></A>
|
||
|
<A NAME="IDX246"></A>
|
||
|
<EM>Continuing</EM> means resuming program execution until your program
|
||
|
completes normally. In contrast, <EM>stepping</EM> means executing just
|
||
|
one more "step" of your program, where "step" may mean either one
|
||
|
line of source code, or one machine instruction (depending on what
|
||
|
particular command you use). Either when continuing or when stepping,
|
||
|
your program may stop even sooner, due to a breakpoint or a signal. (If
|
||
|
it stops due to a signal, you may want to use <CODE>handle</CODE>, or use
|
||
|
<SAMP>`signal 0'</SAMP> to resume execution. See section <A HREF="gdb_6.html#SEC44">Signals</A>.)
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX247"></A>
|
||
|
<A NAME="IDX248"></A>
|
||
|
<A NAME="IDX249"></A>
|
||
|
<DT><CODE>continue [<VAR>ignore-count</VAR>]</CODE>
|
||
|
<DD><DT><CODE>c [<VAR>ignore-count</VAR>]</CODE>
|
||
|
<DD><DT><CODE>fg [<VAR>ignore-count</VAR>]</CODE>
|
||
|
<DD>Resume program execution, at the address where your program last stopped;
|
||
|
any breakpoints set at that address are bypassed. The optional argument
|
||
|
<VAR>ignore-count</VAR> allows you to specify a further number of times to
|
||
|
ignore a breakpoint at this location; its effect is like that of
|
||
|
<CODE>ignore</CODE> (see section <A HREF="gdb_6.html#SEC38">Break Conditions</A>).
|
||
|
<P>
|
||
|
|
||
|
The argument <VAR>ignore-count</VAR> is meaningful only when your program
|
||
|
stopped due to a breakpoint. At other times, the argument to
|
||
|
<CODE>continue</CODE> is ignored.
|
||
|
</P><P>
|
||
|
|
||
|
The synonyms <CODE>c</CODE> and <CODE>fg</CODE> (for <EM>foreground</EM>, as the
|
||
|
debugged program is deemed to be the foreground program) are provided
|
||
|
purely for convenience, and have exactly the same behavior as
|
||
|
<CODE>continue</CODE>.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
To resume execution at a different place, you can use <CODE>return</CODE>
|
||
|
(see section <A HREF="gdb_15.html#SEC151">Returning from a Function</A>) to go back to the
|
||
|
calling function; or <CODE>jump</CODE> (see section <A HREF="gdb_15.html#SEC149">Continuing at a Different Address</A>) to go to an arbitrary location in your program.
|
||
|
</P><P>
|
||
|
|
||
|
A typical technique for using stepping is to set a breakpoint
|
||
|
(see section <A HREF="gdb_6.html#SEC32">Breakpoints; Watchpoints; and Catchpoints</A>) at the
|
||
|
beginning of the function or the section of your program where a problem
|
||
|
is believed to lie, run your program until it stops at that breakpoint,
|
||
|
and then step through the suspect area, examining the variables that are
|
||
|
interesting, until you see the problem happen.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX250"></A>
|
||
|
<A NAME="IDX251"></A>
|
||
|
<DT><CODE>step</CODE>
|
||
|
<DD>Continue running your program until control reaches a different source
|
||
|
line, then stop it and return control to GDB. This command is
|
||
|
abbreviated <CODE>s</CODE>.
|
||
|
<P>
|
||
|
|
||
|
<BLOCKQUOTE>
|
||
|
<EM>Warning:</EM> If you use the <CODE>step</CODE> command while control is
|
||
|
within a function that was compiled without debugging information,
|
||
|
execution proceeds until control reaches a function that does have
|
||
|
debugging information. Likewise, it will not step into a function which
|
||
|
is compiled without debugging information. To step through functions
|
||
|
without debugging information, use the <CODE>stepi</CODE> command, described
|
||
|
below.
|
||
|
</BLOCKQUOTE>
|
||
|
<P>
|
||
|
|
||
|
The <CODE>step</CODE> command only stops at the first instruction of a source
|
||
|
line. This prevents the multiple stops that could otherwise occur in
|
||
|
<CODE>switch</CODE> statements, <CODE>for</CODE> loops, etc. <CODE>step</CODE> continues
|
||
|
to stop if a function that has debugging information is called within
|
||
|
the line. In other words, <CODE>step</CODE> <EM>steps inside</EM> any functions
|
||
|
called within the line.
|
||
|
</P><P>
|
||
|
|
||
|
Also, the <CODE>step</CODE> command only enters a function if there is line
|
||
|
number information for the function. Otherwise it acts like the
|
||
|
<CODE>next</CODE> command. This avoids problems when using <CODE>cc -gl</CODE>
|
||
|
on MIPS machines. Previously, <CODE>step</CODE> entered subroutines if there
|
||
|
was any debugging information about the routine.
|
||
|
</P><P>
|
||
|
|
||
|
<DT><CODE>step <VAR>count</VAR></CODE>
|
||
|
<DD>Continue running as in <CODE>step</CODE>, but do so <VAR>count</VAR> times. If a
|
||
|
breakpoint is reached, or a signal not related to stepping occurs before
|
||
|
<VAR>count</VAR> steps, stepping stops right away.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX252"></A>
|
||
|
<A NAME="IDX253"></A>
|
||
|
<DT><CODE>next [<VAR>count</VAR>]</CODE>
|
||
|
<DD>Continue to the next source line in the current (innermost) stack frame.
|
||
|
This is similar to <CODE>step</CODE>, but function calls that appear within
|
||
|
the line of code are executed without stopping. Execution stops when
|
||
|
control reaches a different line of code at the original stack level
|
||
|
that was executing when you gave the <CODE>next</CODE> command. This command
|
||
|
is abbreviated <CODE>n</CODE>.
|
||
|
<P>
|
||
|
|
||
|
An argument <VAR>count</VAR> is a repeat count, as for <CODE>step</CODE>.
|
||
|
</P><P>
|
||
|
|
||
|
The <CODE>next</CODE> command only stops at the first instruction of a
|
||
|
source line. This prevents multiple stops that could otherwise occur in
|
||
|
<CODE>switch</CODE> statements, <CODE>for</CODE> loops, etc.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX254"></A>
|
||
|
<DT><CODE>set step-mode</CODE>
|
||
|
<DD><A NAME="IDX255"></A>
|
||
|
<A NAME="IDX256"></A>
|
||
|
<DT><CODE>set step-mode on</CODE>
|
||
|
<DD>The <CODE>set step-mode on</CODE> command causes the <CODE>step</CODE> command to
|
||
|
stop at the first instruction of a function which contains no debug line
|
||
|
information rather than stepping over it.
|
||
|
<P>
|
||
|
|
||
|
This is useful in cases where you may be interested in inspecting the
|
||
|
machine instructions of a function which has no symbolic info and do not
|
||
|
want GDB to automatically skip over this function.
|
||
|
</P><P>
|
||
|
|
||
|
<DT><CODE>set step-mode off</CODE>
|
||
|
<DD>Causes the <CODE>step</CODE> command to step over any functions which contains no
|
||
|
debug information. This is the default.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>show step-mode</CODE>
|
||
|
<DD>Show whether GDB will stop in or step over functions without
|
||
|
source line debug information.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX257"></A>
|
||
|
<DT><CODE>finish</CODE>
|
||
|
<DD>Continue running until just after function in the selected stack frame
|
||
|
returns. Print the returned value (if any).
|
||
|
<P>
|
||
|
|
||
|
Contrast this with the <CODE>return</CODE> command (see section <A HREF="gdb_15.html#SEC151">Returning from a Function</A>).
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX258"></A>
|
||
|
<A NAME="IDX259"></A>
|
||
|
<A NAME="IDX260"></A>
|
||
|
<DT><CODE>until</CODE>
|
||
|
<DD><DT><CODE>u</CODE>
|
||
|
<DD>Continue running until a source line past the current line, in the
|
||
|
current stack frame, is reached. This command is used to avoid single
|
||
|
stepping through a loop more than once. It is like the <CODE>next</CODE>
|
||
|
command, except that when <CODE>until</CODE> encounters a jump, it
|
||
|
automatically continues execution until the program counter is greater
|
||
|
than the address of the jump.
|
||
|
<P>
|
||
|
|
||
|
This means that when you reach the end of a loop after single stepping
|
||
|
though it, <CODE>until</CODE> makes your program continue execution until it
|
||
|
exits the loop. In contrast, a <CODE>next</CODE> command at the end of a loop
|
||
|
simply steps back to the beginning of the loop, which forces you to step
|
||
|
through the next iteration.
|
||
|
</P><P>
|
||
|
|
||
|
<CODE>until</CODE> always stops your program if it attempts to exit the current
|
||
|
stack frame.
|
||
|
</P><P>
|
||
|
|
||
|
<CODE>until</CODE> may produce somewhat counterintuitive results if the order
|
||
|
of machine code does not match the order of the source lines. For
|
||
|
example, in the following excerpt from a debugging session, the <CODE>f</CODE>
|
||
|
(<CODE>frame</CODE>) command shows that execution is stopped at line
|
||
|
<CODE>206</CODE>; yet when we use <CODE>until</CODE>, we get to line <CODE>195</CODE>:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>(gdb) f
|
||
|
#0 main (argc=4, argv=0xf7fffae8) at m4.c:206
|
||
|
206 expand_input();
|
||
|
(gdb) until
|
||
|
195 for ( ; argc > 0; NEXTARG) {
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
This happened because, for execution efficiency, the compiler had
|
||
|
generated code for the loop closure test at the end, rather than the
|
||
|
start, of the loop--even though the test in a C <CODE>for</CODE>-loop is
|
||
|
written before the body of the loop. The <CODE>until</CODE> command appeared
|
||
|
to step back to the beginning of the loop when it advanced to this
|
||
|
expression; however, it has not really gone to an earlier
|
||
|
statement--not in terms of the actual machine code.
|
||
|
</P><P>
|
||
|
|
||
|
<CODE>until</CODE> with no argument works by means of single
|
||
|
instruction stepping, and hence is slower than <CODE>until</CODE> with an
|
||
|
argument.
|
||
|
</P><P>
|
||
|
|
||
|
<DT><CODE>until <VAR>location</VAR></CODE>
|
||
|
<DD><DT><CODE>u <VAR>location</VAR></CODE>
|
||
|
<DD>Continue running your program until either the specified location is
|
||
|
reached, or the current stack frame returns. <VAR>location</VAR> is any of
|
||
|
the forms described in <A HREF="gdb_8.html#SEC53">7.2 Specifying a Location</A>.
|
||
|
This form of the command uses temporary breakpoints, and
|
||
|
hence is quicker than <CODE>until</CODE> without an argument. The specified
|
||
|
location is actually reached only if it is in the current frame. This
|
||
|
implies that <CODE>until</CODE> can be used to skip over recursive function
|
||
|
invocations. For instance in the code below, if the current location is
|
||
|
line <CODE>96</CODE>, issuing <CODE>until 99</CODE> will execute the program up to
|
||
|
line <CODE>99</CODE> in the same invocation of factorial, i.e., after the inner
|
||
|
invocations have returned.
|
||
|
<P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>94 int factorial (int value)
|
||
|
95 {
|
||
|
96 if (value > 1) {
|
||
|
97 value *= factorial (value - 1);
|
||
|
98 }
|
||
|
99 return (value);
|
||
|
100 }
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
<A NAME="IDX261"></A>
|
||
|
<DT><CODE>advance <VAR>location</VAR></CODE>
|
||
|
<DD>Continue running the program up to the given <VAR>location</VAR>. An argument is
|
||
|
required, which should be of one of the forms described in
|
||
|
<A HREF="gdb_8.html#SEC53">7.2 Specifying a Location</A>.
|
||
|
Execution will also stop upon exit from the current stack
|
||
|
frame. This command is similar to <CODE>until</CODE>, but <CODE>advance</CODE> will
|
||
|
not skip over recursive function calls, and the target location doesn't
|
||
|
have to be in the same frame as the current one.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX262"></A>
|
||
|
<A NAME="IDX263"></A>
|
||
|
<DT><CODE>stepi</CODE>
|
||
|
<DD><DT><CODE>stepi <VAR>arg</VAR></CODE>
|
||
|
<DD><DT><CODE>si</CODE>
|
||
|
<DD>Execute one machine instruction, then stop and return to the debugger.
|
||
|
<P>
|
||
|
|
||
|
It is often useful to do <SAMP>`display/i $pc'</SAMP> when stepping by machine
|
||
|
instructions. This makes GDB automatically display the next
|
||
|
instruction to be executed, each time your program stops. See section <A HREF="gdb_9.html#SEC65">Automatic Display</A>.
|
||
|
</P><P>
|
||
|
|
||
|
An argument is a repeat count, as in <CODE>step</CODE>.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX264"></A>
|
||
|
<A NAME="IDX265"></A>
|
||
|
<DT><CODE>nexti</CODE>
|
||
|
<DD><DT><CODE>nexti <VAR>arg</VAR></CODE>
|
||
|
<DD><DT><CODE>ni</CODE>
|
||
|
<DD>Execute one machine instruction, but if it is a function call,
|
||
|
proceed until the function returns.
|
||
|
<P>
|
||
|
|
||
|
An argument is a repeat count, as in <CODE>next</CODE>.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="Signals"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC44"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC43"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC45"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC45"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC31"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_7.html#SEC46"> >> </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> 5.3 Signals </H2>
|
||
|
<!--docid::SEC44::-->
|
||
|
<P>
|
||
|
|
||
|
A signal is an asynchronous event that can happen in a program. The
|
||
|
operating system defines the possible kinds of signals, and gives each
|
||
|
kind a name and a number. For example, in Unix <CODE>SIGINT</CODE> is the
|
||
|
signal a program gets when you type an interrupt character (often <KBD>Ctrl-c</KBD>);
|
||
|
<CODE>SIGSEGV</CODE> is the signal a program gets from referencing a place in
|
||
|
memory far away from all the areas in use; <CODE>SIGALRM</CODE> occurs when
|
||
|
the alarm clock timer goes off (which happens only if your program has
|
||
|
requested an alarm).
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX266"></A>
|
||
|
Some signals, including <CODE>SIGALRM</CODE>, are a normal part of the
|
||
|
functioning of your program. Others, such as <CODE>SIGSEGV</CODE>, indicate
|
||
|
errors; these signals are <EM>fatal</EM> (they kill your program immediately) if the
|
||
|
program has not specified in advance some other way to handle the signal.
|
||
|
<CODE>SIGINT</CODE> does not indicate an error in your program, but it is normally
|
||
|
fatal so it can carry out the purpose of the interrupt: to kill the program.
|
||
|
</P><P>
|
||
|
|
||
|
GDB has the ability to detect any occurrence of a signal in your
|
||
|
program. You can tell GDB in advance what to do for each kind of
|
||
|
signal.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX267"></A>
|
||
|
Normally, GDB is set up to let the non-erroneous signals like
|
||
|
<CODE>SIGALRM</CODE> be silently passed to your program
|
||
|
(so as not to interfere with their role in the program's functioning)
|
||
|
but to stop your program immediately whenever an error signal happens.
|
||
|
You can change these settings with the <CODE>handle</CODE> command.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX268"></A>
|
||
|
<A NAME="IDX269"></A>
|
||
|
<DT><CODE>info signals</CODE>
|
||
|
<DD><DT><CODE>info handle</CODE>
|
||
|
<DD>Print a table of all the kinds of signals and how GDB has been told to
|
||
|
handle each one. You can use this to see the signal numbers of all
|
||
|
the defined types of signals.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>info signals <VAR>sig</VAR></CODE>
|
||
|
<DD>Similar, but print information only about the specified signal number.
|
||
|
<P>
|
||
|
|
||
|
<CODE>info handle</CODE> is an alias for <CODE>info signals</CODE>.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX270"></A>
|
||
|
<DT><CODE>handle <VAR>signal</VAR> [<VAR>keywords</VAR><small>...</small>]</CODE>
|
||
|
<DD>Change the way GDB handles signal <VAR>signal</VAR>. <VAR>signal</VAR>
|
||
|
can be the number of a signal or its name (with or without the
|
||
|
<SAMP>`SIG'</SAMP> at the beginning); a list of signal numbers of the form
|
||
|
<SAMP>`<VAR>low</VAR>-<VAR>high</VAR>'</SAMP>; or the word <SAMP>`all'</SAMP>, meaning all the
|
||
|
known signals. Optional arguments <VAR>keywords</VAR>, described below,
|
||
|
say what change to make.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
The keywords allowed by the <CODE>handle</CODE> command can be abbreviated.
|
||
|
Their full names are:
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<DT><CODE>nostop</CODE>
|
||
|
<DD>GDB should not stop your program when this signal happens. It may
|
||
|
still print a message telling you that the signal has come in.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>stop</CODE>
|
||
|
<DD>GDB should stop your program when this signal happens. This implies
|
||
|
the <CODE>print</CODE> keyword as well.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>print</CODE>
|
||
|
<DD>GDB should print a message when this signal happens.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>noprint</CODE>
|
||
|
<DD>GDB should not mention the occurrence of the signal at all. This
|
||
|
implies the <CODE>nostop</CODE> keyword as well.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>pass</CODE>
|
||
|
<DD><DT><CODE>noignore</CODE>
|
||
|
<DD>GDB should allow your program to see this signal; your program
|
||
|
can handle the signal, or else it may terminate if the signal is fatal
|
||
|
and not handled. <CODE>pass</CODE> and <CODE>noignore</CODE> are synonyms.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>nopass</CODE>
|
||
|
<DD><DT><CODE>ignore</CODE>
|
||
|
<DD>GDB should not allow your program to see this signal.
|
||
|
<CODE>nopass</CODE> and <CODE>ignore</CODE> are synonyms.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
When a signal stops your program, the signal is not visible to the
|
||
|
program until you
|
||
|
continue. Your program sees the signal then, if <CODE>pass</CODE> is in
|
||
|
effect for the signal in question <EM>at that time</EM>. In other words,
|
||
|
after GDB reports a signal, you can use the <CODE>handle</CODE>
|
||
|
command with <CODE>pass</CODE> or <CODE>nopass</CODE> to control whether your
|
||
|
program sees that signal when you continue.
|
||
|
</P><P>
|
||
|
|
||
|
The default is set to <CODE>nostop</CODE>, <CODE>noprint</CODE>, <CODE>pass</CODE> for
|
||
|
non-erroneous signals such as <CODE>SIGALRM</CODE>, <CODE>SIGWINCH</CODE> and
|
||
|
<CODE>SIGCHLD</CODE>, and to <CODE>stop</CODE>, <CODE>print</CODE>, <CODE>pass</CODE> for the
|
||
|
erroneous signals.
|
||
|
</P><P>
|
||
|
|
||
|
You can also use the <CODE>signal</CODE> command to prevent your program from
|
||
|
seeing a signal, or cause it to see a signal it normally would not see,
|
||
|
or to give it any signal at any time. For example, if your program stopped
|
||
|
due to some sort of memory reference error, you might store correct
|
||
|
values into the erroneous variables and continue, hoping to see more
|
||
|
execution; but your program would probably terminate immediately as
|
||
|
a result of the fatal signal once it saw the signal. To prevent this,
|
||
|
you can continue with <SAMP>`signal 0'</SAMP>. See section <A HREF="gdb_15.html#SEC150">Giving your Program a Signal</A>.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="Thread Stops"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC45"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC44"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_7.html#SEC46"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC31"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC31"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_7.html#SEC46"> >> </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> 5.4 Stopping and Starting Multi-thread Programs </H2>
|
||
|
<!--docid::SEC45::-->
|
||
|
<P>
|
||
|
|
||
|
When your program has multiple threads (see section <A HREF="gdb_5.html#SEC27">Debugging Programs with Multiple Threads</A>), you can choose whether to set
|
||
|
breakpoints on all threads, or on a particular thread.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX271"></A>
|
||
|
<A NAME="IDX272"></A>
|
||
|
<A NAME="IDX273"></A>
|
||
|
<DT><CODE>break <VAR>linespec</VAR> thread <VAR>threadno</VAR></CODE>
|
||
|
<DD><DT><CODE>break <VAR>linespec</VAR> thread <VAR>threadno</VAR> if <small>...</small></CODE>
|
||
|
<DD><VAR>linespec</VAR> specifies source lines; there are several ways of
|
||
|
writing them (see section <A HREF="gdb_8.html#SEC53">7.2 Specifying a Location</A>), but the effect is always to
|
||
|
specify some source line.
|
||
|
<P>
|
||
|
|
||
|
Use the qualifier <SAMP>`thread <VAR>threadno</VAR>'</SAMP> with a breakpoint command
|
||
|
to specify that you only want GDB to stop the program when a
|
||
|
particular thread reaches this breakpoint. <VAR>threadno</VAR> is one of the
|
||
|
numeric thread identifiers assigned by GDB, shown in the first
|
||
|
column of the <SAMP>`info threads'</SAMP> display.
|
||
|
</P><P>
|
||
|
|
||
|
If you do not specify <SAMP>`thread <VAR>threadno</VAR>'</SAMP> when you set a
|
||
|
breakpoint, the breakpoint applies to <EM>all</EM> threads of your
|
||
|
program.
|
||
|
</P><P>
|
||
|
|
||
|
You can use the <CODE>thread</CODE> qualifier on conditional breakpoints as
|
||
|
well; in this case, place <SAMP>`thread <VAR>threadno</VAR>'</SAMP> before the
|
||
|
breakpoint condition, like this:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>(gdb) break frik.c:13 thread 28 if bartab > lim
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX274"></A>
|
||
|
<A NAME="IDX275"></A>
|
||
|
Whenever your program stops under GDB for any reason,
|
||
|
<EM>all</EM> threads of execution stop, not just the current thread. This
|
||
|
allows you to examine the overall state of the program, including
|
||
|
switching between threads, without worrying that things may change
|
||
|
underfoot.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX276"></A>
|
||
|
<A NAME="IDX277"></A>
|
||
|
<A NAME="IDX278"></A>
|
||
|
There is an unfortunate side effect. If one thread stops for a
|
||
|
breakpoint, or for some other reason, and another thread is blocked in a
|
||
|
system call, then the system call may return prematurely. This is a
|
||
|
consequence of the interaction between multiple threads and the signals
|
||
|
that GDB uses to implement breakpoints and other events that
|
||
|
stop execution.
|
||
|
</P><P>
|
||
|
|
||
|
To handle this problem, your program should check the return value of
|
||
|
each system call and react appropriately. This is good programming
|
||
|
style anyways.
|
||
|
</P><P>
|
||
|
|
||
|
For example, do not write code like this:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre> sleep (10);
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
The call to <CODE>sleep</CODE> will return early if a different thread stops
|
||
|
at a breakpoint or for some other reason.
|
||
|
</P><P>
|
||
|
|
||
|
Instead, write this:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre> int unslept = 10;
|
||
|
while (unslept > 0)
|
||
|
unslept = sleep (unslept);
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
A system call is allowed to return early, so the system is still
|
||
|
conforming to its specification. But GDB does cause your
|
||
|
multi-threaded program to behave differently than it would without
|
||
|
GDB.
|
||
|
</P><P>
|
||
|
|
||
|
Also, GDB uses internal breakpoints in the thread library to
|
||
|
monitor certain events such as thread creation and thread destruction.
|
||
|
When such an event happens, a system call in another thread may return
|
||
|
prematurely, even though your program does not appear to stop.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX279"></A>
|
||
|
<A NAME="IDX280"></A>
|
||
|
Conversely, whenever you restart the program, <EM>all</EM> threads start
|
||
|
executing. <EM>This is true even when single-stepping</EM> with commands
|
||
|
like <CODE>step</CODE> or <CODE>next</CODE>.
|
||
|
</P><P>
|
||
|
|
||
|
In particular, GDB cannot single-step all threads in lockstep.
|
||
|
Since thread scheduling is up to your debugging target's operating
|
||
|
system (not controlled by GDB), other threads may
|
||
|
execute more than one statement while the current thread completes a
|
||
|
single step. Moreover, in general other threads stop in the middle of a
|
||
|
statement, rather than at a clean statement boundary, when the program
|
||
|
stops.
|
||
|
</P><P>
|
||
|
|
||
|
You might even find your program stopped in another thread after
|
||
|
continuing or even single-stepping. This happens whenever some other
|
||
|
thread runs into a breakpoint, a signal, or an exception before the
|
||
|
first thread completes whatever you requested.
|
||
|
</P><P>
|
||
|
|
||
|
On some OSes, you can lock the OS scheduler and thus allow only a single
|
||
|
thread to run.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<DT><CODE>set scheduler-locking <VAR>mode</VAR></CODE>
|
||
|
<DD><A NAME="IDX281"></A>
|
||
|
<A NAME="IDX282"></A>
|
||
|
Set the scheduler locking mode. If it is <CODE>off</CODE>, then there is no
|
||
|
locking and any thread may run at any time. If <CODE>on</CODE>, then only the
|
||
|
current thread may run when the inferior is resumed. The <CODE>step</CODE>
|
||
|
mode optimizes for single-stepping. It stops other threads from
|
||
|
"seizing the prompt" by preempting the current thread while you are
|
||
|
stepping. Other threads will only rarely (or never) get a chance to run
|
||
|
when you step. They are more likely to run when you <SAMP>`next'</SAMP> over a
|
||
|
function call, and they are completely free to run when you use commands
|
||
|
like <SAMP>`continue'</SAMP>, <SAMP>`until'</SAMP>, or <SAMP>`finish'</SAMP>. However, unless another
|
||
|
thread hits a breakpoint during its timeslice, they will never steal the
|
||
|
GDB prompt away from the thread that you are debugging.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>show scheduler-locking</CODE>
|
||
|
<DD>Display the current scheduler locking mode.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="Stack"></A>
|
||
|
<HR SIZE="6">
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_6.html#SEC31"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_7.html#SEC46"> >> </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>
|