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.
635 lines
26 KiB
HTML
635 lines
26 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: Sequences</TITLE>
|
||
|
|
||
|
<META NAME="description" CONTENT="Debugging with GDB: Sequences">
|
||
|
<META NAME="keywords" CONTENT="Debugging with GDB: Sequences">
|
||
|
<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="SEC229"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_20.html#SEC228"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC230"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_4.html#SEC14"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_22.html#SEC234"> >> </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> 20. Canned Sequences of Commands </H1>
|
||
|
<!--docid::SEC229::-->
|
||
|
<P>
|
||
|
|
||
|
Aside from breakpoint commands (see section <A HREF="gdb_6.html#SEC39">Breakpoint Command Lists</A>), GDB provides two ways to store sequences of
|
||
|
commands for execution as a unit: user-defined commands and command
|
||
|
files.
|
||
|
</P><P>
|
||
|
|
||
|
<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_21.html#SEC230">20.1 User-defined Commands</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">How to define your own commands</TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_21.html#SEC231">20.2 User-defined Command Hooks</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Hooks for user-defined commands</TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_21.html#SEC232">20.3 Command Files</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">How to write scripts of commands to be stored in a file</TD></TR>
|
||
|
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_21.html#SEC233">20.4 Commands for Controlled Output</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Commands for controlled output</TD></TR>
|
||
|
</TABLE></BLOCKQUOTE>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="Define"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC230"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC229"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC231"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC229"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC229"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_22.html#SEC234"> >> </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> 20.1 User-defined Commands </H2>
|
||
|
<!--docid::SEC230::-->
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX1183"></A>
|
||
|
<A NAME="IDX1184"></A>
|
||
|
A <EM>user-defined command</EM> is a sequence of GDB commands to
|
||
|
which you assign a new name as a command. This is done with the
|
||
|
<CODE>define</CODE> command. User commands may accept up to 10 arguments
|
||
|
separated by whitespace. Arguments are accessed within the user command
|
||
|
via <CODE>$arg0<small>...</small>$arg9</CODE>. A trivial example:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>define adder
|
||
|
print $arg0 + $arg1 + $arg2
|
||
|
end
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
To execute the command use:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>adder 1 2 3
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
This defines the command <CODE>adder</CODE>, which prints the sum of
|
||
|
its three arguments. Note the arguments are text substitutions, so they may
|
||
|
reference variables, use complex expressions, or even perform inferior
|
||
|
functions calls.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX1185"></A>
|
||
|
<A NAME="IDX1186"></A>
|
||
|
In addition, <CODE>$argc</CODE> may be used to find out how many arguments have
|
||
|
been passed. This expands to a number in the range 0<small>...</small>10.
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>define adder
|
||
|
if $argc == 2
|
||
|
print $arg0 + $arg1
|
||
|
end
|
||
|
if $argc == 3
|
||
|
print $arg0 + $arg1 + $arg2
|
||
|
end
|
||
|
end
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
|
||
|
<A NAME="IDX1187"></A>
|
||
|
<DT><CODE>define <VAR>commandname</VAR></CODE>
|
||
|
<DD>Define a command named <VAR>commandname</VAR>. If there is already a command
|
||
|
by that name, you are asked to confirm that you want to redefine it.
|
||
|
<P>
|
||
|
|
||
|
The definition of the command is made up of other GDB command lines,
|
||
|
which are given following the <CODE>define</CODE> command. The end of these
|
||
|
commands is marked by a line containing <CODE>end</CODE>.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX1188"></A>
|
||
|
<A NAME="IDX1189"></A>
|
||
|
<DT><CODE>document <VAR>commandname</VAR></CODE>
|
||
|
<DD>Document the user-defined command <VAR>commandname</VAR>, so that it can be
|
||
|
accessed by <CODE>help</CODE>. The command <VAR>commandname</VAR> must already be
|
||
|
defined. This command reads lines of documentation just as <CODE>define</CODE>
|
||
|
reads the lines of the command definition, ending with <CODE>end</CODE>.
|
||
|
After the <CODE>document</CODE> command is finished, <CODE>help</CODE> on command
|
||
|
<VAR>commandname</VAR> displays the documentation you have written.
|
||
|
<P>
|
||
|
|
||
|
You may use the <CODE>document</CODE> command again to change the
|
||
|
documentation of a command. Redefining the command with <CODE>define</CODE>
|
||
|
does not change the documentation.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX1190"></A>
|
||
|
<A NAME="IDX1191"></A>
|
||
|
<DT><CODE>dont-repeat</CODE>
|
||
|
<DD>Used inside a user-defined command, this tells GDB that this
|
||
|
command should not be repeated when the user hits <KBD>RET</KBD>
|
||
|
(see section <A HREF="gdb_4.html#SEC15">repeat last command</A>).
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX1192"></A>
|
||
|
<DT><CODE>help user-defined</CODE>
|
||
|
<DD>List all user-defined commands, with the first line of the documentation
|
||
|
(if any) for each.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX1193"></A>
|
||
|
<DT><CODE>show user</CODE>
|
||
|
<DD><DT><CODE>show user <VAR>commandname</VAR></CODE>
|
||
|
<DD>Display the GDB commands used to define <VAR>commandname</VAR> (but
|
||
|
not its documentation). If no <VAR>commandname</VAR> is given, display the
|
||
|
definitions for all user-defined commands.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX1194"></A>
|
||
|
<A NAME="IDX1195"></A>
|
||
|
<A NAME="IDX1196"></A>
|
||
|
<DT><CODE>show max-user-call-depth</CODE>
|
||
|
<DD><DT><CODE>set max-user-call-depth</CODE>
|
||
|
<DD>The value of <CODE>max-user-call-depth</CODE> controls how many recursion
|
||
|
levels are allowed in user-defined commands before GDB suspects an
|
||
|
infinite recursion and aborts the command.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
In addition to the above commands, user-defined commands frequently
|
||
|
use control flow commands, described in <A HREF="gdb_21.html#SEC232">20.3 Command Files</A>.
|
||
|
</P><P>
|
||
|
|
||
|
When user-defined commands are executed, the
|
||
|
commands of the definition are not printed. An error in any command
|
||
|
stops execution of the user-defined command.
|
||
|
</P><P>
|
||
|
|
||
|
If used interactively, commands that would ask for confirmation proceed
|
||
|
without asking when used inside a user-defined command. Many GDB
|
||
|
commands that normally print messages to say what they are doing omit the
|
||
|
messages when used in a user-defined command.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="Hooks"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC231"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC230"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC232"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC232"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC229"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_22.html#SEC234"> >> </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> 20.2 User-defined Command Hooks </H2>
|
||
|
<!--docid::SEC231::-->
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX1197"></A>
|
||
|
You may define <EM>hooks</EM>, which are a special kind of user-defined
|
||
|
command. Whenever you run the command <SAMP>`foo'</SAMP>, if the user-defined
|
||
|
command <SAMP>`hook-foo'</SAMP> exists, it is executed (with no arguments)
|
||
|
before that command.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX1198"></A>
|
||
|
<A NAME="IDX1199"></A>
|
||
|
A hook may also be defined which is run after the command you executed.
|
||
|
Whenever you run the command <SAMP>`foo'</SAMP>, if the user-defined command
|
||
|
<SAMP>`hookpost-foo'</SAMP> exists, it is executed (with no arguments) after
|
||
|
that command. Post-execution hooks may exist simultaneously with
|
||
|
pre-execution hooks, for the same command.
|
||
|
</P><P>
|
||
|
|
||
|
It is valid for a hook to call the command which it hooks. If this
|
||
|
occurs, the hook is not re-executed, thereby avoiding infinite recursion.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="IDX1200"></A>
|
||
|
In addition, a pseudo-command, <SAMP>`stop'</SAMP> exists. Defining
|
||
|
(<SAMP>`hook-stop'</SAMP>) makes the associated commands execute every time
|
||
|
execution stops in your program: before breakpoint commands are run,
|
||
|
displays are printed, or the stack frame is printed.
|
||
|
</P><P>
|
||
|
|
||
|
For example, to ignore <CODE>SIGALRM</CODE> signals while
|
||
|
single-stepping, but treat them normally during normal execution,
|
||
|
you could define:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>define hook-stop
|
||
|
handle SIGALRM nopass
|
||
|
end
|
||
|
|
||
|
define hook-run
|
||
|
handle SIGALRM pass
|
||
|
end
|
||
|
|
||
|
define hook-continue
|
||
|
handle SIGALRM pass
|
||
|
end
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
As a further example, to hook at the beginning and end of the <CODE>echo</CODE>
|
||
|
command, and to add extra text to the beginning and end of the message,
|
||
|
you could define:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>define hook-echo
|
||
|
echo <<<---
|
||
|
end
|
||
|
|
||
|
define hookpost-echo
|
||
|
echo --->>>\n
|
||
|
end
|
||
|
|
||
|
(gdb) echo Hello World
|
||
|
<<<---Hello World--->>>
|
||
|
(gdb)
|
||
|
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
You can define a hook for any single-word command in GDB, but
|
||
|
not for command aliases; you should define a hook for the basic command
|
||
|
name, e.g. <CODE>backtrace</CODE> rather than <CODE>bt</CODE>.
|
||
|
If an error occurs during the execution of your hook, execution of
|
||
|
GDB commands stops and GDB issues a prompt
|
||
|
(before the command that you actually typed had a chance to run).
|
||
|
</P><P>
|
||
|
|
||
|
If you try to define a hook which does not match any known command, you
|
||
|
get a warning from the <CODE>define</CODE> command.
|
||
|
</P><P>
|
||
|
|
||
|
<A NAME="Command Files"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC232"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC231"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC233"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC233"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC229"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_22.html#SEC234"> >> </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> 20.3 Command Files </H2>
|
||
|
<!--docid::SEC232::-->
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX1201"></A>
|
||
|
<A NAME="IDX1202"></A>
|
||
|
A command file for GDB is a text file made of lines that are
|
||
|
GDB commands. Comments (lines starting with <KBD>#</KBD>) may
|
||
|
also be included. An empty line in a command file does nothing; it
|
||
|
does not mean to repeat the last command, as it would from the
|
||
|
terminal.
|
||
|
</P><P>
|
||
|
|
||
|
You can request the execution of a command file with the <CODE>source</CODE>
|
||
|
command:
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX1203"></A>
|
||
|
<A NAME="IDX1204"></A>
|
||
|
<DT><CODE>source [<CODE>-v</CODE>] <VAR>filename</VAR></CODE>
|
||
|
<DD>Execute the command file <VAR>filename</VAR>.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
The lines in a command file are generally executed sequentially,
|
||
|
unless the order of execution is changed by one of the
|
||
|
<EM>flow-control commands</EM> described below. The commands are not
|
||
|
printed as they are executed. An error in any command terminates
|
||
|
execution of the command file and control is returned to the console.
|
||
|
</P><P>
|
||
|
|
||
|
GDB searches for <VAR>filename</VAR> in the current directory and then
|
||
|
on the search path (specified with the <SAMP>`directory'</SAMP> command).
|
||
|
</P><P>
|
||
|
|
||
|
If <CODE>-v</CODE>, for verbose mode, is given then GDB displays
|
||
|
each command as it is executed. The option must be given before
|
||
|
<VAR>filename</VAR>, and is interpreted as part of the filename anywhere else.
|
||
|
</P><P>
|
||
|
|
||
|
Commands that would ask for confirmation if used interactively proceed
|
||
|
without asking when used in a command file. Many GDB commands that
|
||
|
normally print messages to say what they are doing omit the messages
|
||
|
when called from command files.
|
||
|
</P><P>
|
||
|
|
||
|
GDB also accepts command input from standard input. In this
|
||
|
mode, normal output goes to standard output and error output goes to
|
||
|
standard error. Errors in a command file supplied on standard input do
|
||
|
not terminate execution of the command file--execution continues with
|
||
|
the next command.
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>gdb < cmds > log 2>&1
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
(The syntax above will vary depending on the shell used.) This example
|
||
|
will execute commands from the file <TT>`cmds'</TT>. All output and errors
|
||
|
would be directed to <TT>`log'</TT>.
|
||
|
</P><P>
|
||
|
|
||
|
Since commands stored on command files tend to be more general than
|
||
|
commands typed interactively, they frequently need to deal with
|
||
|
complicated situations, such as different or unexpected values of
|
||
|
variables and symbols, changes in how the program being debugged is
|
||
|
built, etc. GDB provides a set of flow-control commands to
|
||
|
deal with these complexities. Using these commands, you can write
|
||
|
complex scripts that loop over data structures, execute commands
|
||
|
conditionally, etc.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX1205"></A>
|
||
|
<A NAME="IDX1206"></A>
|
||
|
<DT><CODE>if</CODE>
|
||
|
<DD><DT><CODE>else</CODE>
|
||
|
<DD>This command allows to include in your script conditionally executed
|
||
|
commands. The <CODE>if</CODE> command takes a single argument, which is an
|
||
|
expression to evaluate. It is followed by a series of commands that
|
||
|
are executed only if the expression is true (its value is nonzero).
|
||
|
There can then optionally be an <CODE>else</CODE> line, followed by a series
|
||
|
of commands that are only executed if the expression was false. The
|
||
|
end of the list is marked by a line containing <CODE>end</CODE>.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX1207"></A>
|
||
|
<DT><CODE>while</CODE>
|
||
|
<DD>This command allows to write loops. Its syntax is similar to
|
||
|
<CODE>if</CODE>: the command takes a single argument, which is an expression
|
||
|
to evaluate, and must be followed by the commands to execute, one per
|
||
|
line, terminated by an <CODE>end</CODE>. These commands are called the
|
||
|
<EM>body</EM> of the loop. The commands in the body of <CODE>while</CODE> are
|
||
|
executed repeatedly as long as the expression evaluates to true.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX1208"></A>
|
||
|
<DT><CODE>loop_break</CODE>
|
||
|
<DD>This command exits the <CODE>while</CODE> loop in whose body it is included.
|
||
|
Execution of the script continues after that <CODE>while</CODE>s <CODE>end</CODE>
|
||
|
line.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX1209"></A>
|
||
|
<DT><CODE>loop_continue</CODE>
|
||
|
<DD>This command skips the execution of the rest of the body of commands
|
||
|
in the <CODE>while</CODE> loop in whose body it is included. Execution
|
||
|
branches to the beginning of the <CODE>while</CODE> loop, where it evaluates
|
||
|
the controlling expression.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX1210"></A>
|
||
|
<DT><CODE>end</CODE>
|
||
|
<DD>Terminate the block of commands that are the body of <CODE>if</CODE>,
|
||
|
<CODE>else</CODE>, or <CODE>while</CODE> flow-control commands.
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="Output"></A>
|
||
|
<HR SIZE="6">
|
||
|
<A NAME="SEC233"></A>
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC232"> < </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_22.html#SEC234"> > </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC229"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC229"> Up </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_22.html#SEC234"> >> </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> 20.4 Commands for Controlled Output </H2>
|
||
|
<!--docid::SEC233::-->
|
||
|
<P>
|
||
|
|
||
|
During the execution of a command file or a user-defined command, normal
|
||
|
GDB output is suppressed; the only output that appears is what is
|
||
|
explicitly printed by the commands in the definition. This section
|
||
|
describes three commands useful for generating exactly the output you
|
||
|
want.
|
||
|
</P><P>
|
||
|
|
||
|
<DL COMPACT>
|
||
|
<A NAME="IDX1211"></A>
|
||
|
<DT><CODE>echo <VAR>text</VAR></CODE>
|
||
|
<DD>Print <VAR>text</VAR>. Nonprinting characters can be included in
|
||
|
<VAR>text</VAR> using C escape sequences, such as <SAMP>`\n'</SAMP> to print a
|
||
|
newline. <STRONG>No newline is printed unless you specify one.</STRONG>
|
||
|
In addition to the standard C escape sequences, a backslash followed
|
||
|
by a space stands for a space. This is useful for displaying a
|
||
|
string with spaces at the beginning or the end, since leading and
|
||
|
trailing spaces are otherwise trimmed from all arguments.
|
||
|
To print <SAMP>` and foo = '</SAMP>, use the command
|
||
|
<SAMP>`echo \ and foo = \ '</SAMP>.
|
||
|
<P>
|
||
|
|
||
|
A backslash at the end of <VAR>text</VAR> can be used, as in C, to continue
|
||
|
the command onto subsequent lines. For example,
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>echo This is some text\n\
|
||
|
which is continued\n\
|
||
|
onto several lines.\n
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
produces the same output as
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>echo This is some text\n
|
||
|
echo which is continued\n
|
||
|
echo onto several lines.\n
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
<A NAME="IDX1212"></A>
|
||
|
<DT><CODE>output <VAR>expression</VAR></CODE>
|
||
|
<DD>Print the value of <VAR>expression</VAR> and nothing but that value: no
|
||
|
newlines, no <SAMP>`$<VAR>nn</VAR> = '</SAMP>. The value is not entered in the
|
||
|
value history either. See section <A HREF="gdb_9.html#SEC60">Expressions</A>, for more information
|
||
|
on expressions.
|
||
|
<P>
|
||
|
|
||
|
<DT><CODE>output/<VAR>fmt</VAR> <VAR>expression</VAR></CODE>
|
||
|
<DD>Print the value of <VAR>expression</VAR> in format <VAR>fmt</VAR>. You can use
|
||
|
the same formats as for <CODE>print</CODE>. See section <A HREF="gdb_9.html#SEC63">Output Formats</A>, for more information.
|
||
|
<P>
|
||
|
|
||
|
<A NAME="IDX1213"></A>
|
||
|
<DT><CODE>printf <VAR>template</VAR>, <VAR>expressions</VAR><small>...</small></CODE>
|
||
|
<DD>Print the values of one or more <VAR>expressions</VAR> under the control of
|
||
|
the string <VAR>template</VAR>. To print several values, make
|
||
|
<VAR>expressions</VAR> be a comma-separated list of individual expressions,
|
||
|
which may be either numbers or pointers. Their values are printed as
|
||
|
specified by <VAR>template</VAR>, exactly as a C program would do by
|
||
|
executing the code below:
|
||
|
<P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>printf (<VAR>template</VAR>, <VAR>expressions</VAR><small>...</small>);
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
As in <CODE>C</CODE> <CODE>printf</CODE>, ordinary characters in <VAR>template</VAR>
|
||
|
are printed verbatim, while <EM>conversion specification</EM> introduced
|
||
|
by the <SAMP>`%'</SAMP> character cause subsequent <VAR>expressions</VAR> to be
|
||
|
evaluated, their values converted and formatted according to type and
|
||
|
style information encoded in the conversion specifications, and then
|
||
|
printed.
|
||
|
</P><P>
|
||
|
|
||
|
For example, you can print two values in hex like this:
|
||
|
</P><P>
|
||
|
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>printf "foo, bar-foo = 0x%x, 0x%x\n", foo, bar-foo
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
<CODE>printf</CODE> supports all the standard <CODE>C</CODE> conversion
|
||
|
specifications, including the flags and modifiers between the <SAMP>`%'</SAMP>
|
||
|
character and the conversion letter, with the following exceptions:
|
||
|
</P><P>
|
||
|
|
||
|
<UL>
|
||
|
<LI>
|
||
|
The argument-ordering modifiers, such as <SAMP>`2$'</SAMP>, are not supported.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
The modifier <SAMP>`*'</SAMP> is not supported for specifying precision or
|
||
|
width.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
The <SAMP>`''</SAMP> flag (for separation of digits into groups according to
|
||
|
<CODE>LC_NUMERIC'</CODE>) is not supported.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
The type modifiers <SAMP>`hh'</SAMP>, <SAMP>`j'</SAMP>, <SAMP>`t'</SAMP>, and <SAMP>`z'</SAMP> are not
|
||
|
supported.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
The conversion letter <SAMP>`n'</SAMP> (as in <SAMP>`%n'</SAMP>) is not supported.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
The conversion letters <SAMP>`a'</SAMP> and <SAMP>`A'</SAMP> are not supported.
|
||
|
</UL>
|
||
|
<P>
|
||
|
|
||
|
Note that the <SAMP>`ll'</SAMP> type modifier is supported only if the
|
||
|
underlying <CODE>C</CODE> implementation used to build GDB supports
|
||
|
the <CODE>long long int</CODE> type, and the <SAMP>`L'</SAMP> type modifier is
|
||
|
supported only if <CODE>long double</CODE> type is available.
|
||
|
</P><P>
|
||
|
|
||
|
As in <CODE>C</CODE>, <CODE>printf</CODE> supports simple backslash-escape
|
||
|
sequences, such as <CODE>\n</CODE>, <SAMP>`\t'</SAMP>, <SAMP>`\\'</SAMP>, <SAMP>`\"'</SAMP>,
|
||
|
<SAMP>`\a'</SAMP>, and <SAMP>`\f'</SAMP>, that consist of backslash followed by a
|
||
|
single character. Octal and hexadecimal escape sequences are not
|
||
|
supported.
|
||
|
</P><P>
|
||
|
|
||
|
Additionally, <CODE>printf</CODE> supports conversion specifications for DFP
|
||
|
(<EM>Decimal Floating Point</EM>) types using the following length modifiers
|
||
|
together with a floating point specifier.
|
||
|
letters:
|
||
|
</P><P>
|
||
|
|
||
|
<UL>
|
||
|
<LI>
|
||
|
<SAMP>`H'</SAMP> for printing <CODE>Decimal32</CODE> types.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
<SAMP>`D'</SAMP> for printing <CODE>Decimal64</CODE> types.
|
||
|
<P>
|
||
|
|
||
|
<LI>
|
||
|
<SAMP>`DD'</SAMP> for printing <CODE>Decimal128</CODE> types.
|
||
|
</UL>
|
||
|
<P>
|
||
|
|
||
|
If the underlying <CODE>C</CODE> implementation used to build GDB has
|
||
|
support for the three length modifiers for DFP types, other modifiers
|
||
|
such as width and precision will also be available for GDB to use.
|
||
|
</P><P>
|
||
|
|
||
|
In case there is no such <CODE>C</CODE> support, no additional modifiers will be
|
||
|
available and the value will be printed in the standard way.
|
||
|
</P><P>
|
||
|
|
||
|
Here's an example of printing DFP types using the above conversion letters:
|
||
|
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>printf "D32: %Hf - D64: %Df - D128: %DDf\n",1.2345df,1.2E10dd,1.2E1dl
|
||
|
</FONT></pre></td></tr></table></P><P>
|
||
|
|
||
|
</DL>
|
||
|
<P>
|
||
|
|
||
|
<A NAME="Interpreters"></A>
|
||
|
<HR SIZE="6">
|
||
|
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||
|
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_21.html#SEC229"> << </A>]</TD>
|
||
|
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_22.html#SEC234"> >> </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>
|