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

318 lines
11 KiB
HTML

<HTML>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- Created on March, 27 2008 by texi2html 1.64 -->
<!--
Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
Karl Berry <karl@freefriends.org>
Olaf Bachmann <obachman@mathematik.uni-kl.de>
and many others.
Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
-->
<HEAD>
<TITLE>Debugging with GDB: Macros</TITLE>
<META NAME="description" CONTENT="Debugging with GDB: Macros">
<META NAME="keywords" CONTENT="Debugging with GDB: Macros">
<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="SEC83"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_9.html#SEC82"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H1> 9. C Preprocessor Macros </H1>
<!--docid::SEC83::-->
<P>
Some languages, such as C and C<TT>++</TT>, provide a way to define and invoke
"preprocessor macros" which expand into strings of tokens.
GDB can evaluate expressions containing macro invocations, show
the result of macro expansion, and show a macro's definition, including
where it was defined.
</P><P>
You may need to compile your program specially to provide GDB
with information about preprocessor macros. Most compilers do not
include macros in their debugging information, even when you compile
with the <SAMP>`-g'</SAMP> flag. See section <A HREF="gdb_5.html#SEC19">4.1 Compiling for Debugging</A>.
</P><P>
A program may define a macro at one point, remove that definition later,
and then provide a different definition after that. Thus, at different
points in the program, a macro may have different definitions, or have
no definition at all. If there is a current stack frame, GDB
uses the macros in scope at that frame's source code line. Otherwise,
GDB uses the macros in scope at the current listing location;
see <A HREF="gdb_8.html#SEC52">7.1 Printing Source Lines</A>.
</P><P>
At the moment, GDB does not support the <CODE>##</CODE>
token-splicing operator, the <CODE>#</CODE> stringification operator, or
variable-arity macros.
</P><P>
Whenever GDB evaluates an expression, it always expands any
macro invocations present in the expression. GDB also provides
the following commands for working with macros explicitly.
</P><P>
<DL COMPACT>
<A NAME="IDX507"></A>
<A NAME="IDX508"></A>
<A NAME="IDX509"></A>
<A NAME="IDX510"></A>
<DT><CODE>macro expand <VAR>expression</VAR></CODE>
<DD><DT><CODE>macro exp <VAR>expression</VAR></CODE>
<DD>Show the results of expanding all preprocessor macro invocations in
<VAR>expression</VAR>. Since GDB simply expands macros, but does
not parse the result, <VAR>expression</VAR> need not be a valid expression;
it can be any string of tokens.
<P>
<A NAME="IDX511"></A>
<DT><CODE>macro expand-once <VAR>expression</VAR></CODE>
<DD><DT><CODE>macro exp1 <VAR>expression</VAR></CODE>
<DD><A NAME="IDX512"></A>
<I>(This command is not yet implemented.)</I> Show the results of
expanding those preprocessor macro invocations that appear explicitly in
<VAR>expression</VAR>. Macro invocations appearing in that expansion are
left unchanged. This command allows you to see the effect of a
particular macro more clearly, without being confused by further
expansions. Since GDB simply expands macros, but does not
parse the result, <VAR>expression</VAR> need not be a valid expression; it
can be any string of tokens.
<P>
<A NAME="IDX513"></A>
<A NAME="IDX514"></A>
<A NAME="IDX515"></A>
<DT><CODE>info macro <VAR>macro</VAR></CODE>
<DD>Show the definition of the macro named <VAR>macro</VAR>, and describe the
source location where that definition was established.
<P>
<A NAME="IDX516"></A>
<A NAME="IDX517"></A>
<A NAME="IDX518"></A>
<A NAME="IDX519"></A>
<DT><CODE>macro define <VAR>macro</VAR> <VAR>replacement-list</VAR></CODE>
<DD><DT><CODE>macro define <VAR>macro</VAR>(<VAR>arglist</VAR>) <VAR>replacement-list</VAR></CODE>
<DD><I>(This command is not yet implemented.)</I> Introduce a definition for a
preprocessor macro named <VAR>macro</VAR>, invocations of which are replaced
by the tokens given in <VAR>replacement-list</VAR>. The first form of this
command defines an "object-like" macro, which takes no arguments; the
second form defines a "function-like" macro, which takes the arguments
given in <VAR>arglist</VAR>.
<P>
A definition introduced by this command is in scope in every expression
evaluated in GDB, until it is removed with the <CODE>macro
undef</CODE> command, described below. The definition overrides all
definitions for <VAR>macro</VAR> present in the program being debugged, as
well as any previous user-supplied definition.
</P><P>
<A NAME="IDX520"></A>
<DT><CODE>macro undef <VAR>macro</VAR></CODE>
<DD><I>(This command is not yet implemented.)</I> Remove any user-supplied
definition for the macro named <VAR>macro</VAR>. This command only affects
definitions provided with the <CODE>macro define</CODE> command, described
above; it cannot remove definitions present in the program being
debugged.
<P>
<A NAME="IDX521"></A>
<DT><CODE>macro list</CODE>
<DD><I>(This command is not yet implemented.)</I> List all the macros
defined using the <CODE>macro define</CODE> command.
</DL>
<P>
<A NAME="IDX522"></A>
Here is a transcript showing the above commands in action. First, we
show our source files:
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>$ cat sample.c
#include &#60;stdio.h&#62;
#include "sample.h"
#define M 42
#define ADD(x) (M + x)
main ()
{
#define N 28
printf ("Hello, world!\n");
#undef N
printf ("We're so creative.\n");
#define N 1729
printf ("Goodbye, world!\n");
}
$ cat sample.h
#define Q &#60;
$
</FONT></pre></td></tr></table></P><P>
Now, we compile the program using the GNU C compiler, GCC.
We pass the <SAMP>`-gdwarf-2'</SAMP> and <SAMP>`-g3'</SAMP> flags to ensure the
compiler includes information about preprocessor macros in the debugging
information.
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>$ gcc -gdwarf-2 -g3 sample.c -o sample
$
</FONT></pre></td></tr></table></P><P>
Now, we start GDB on our sample program:
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>$ gdb -nw sample
GNU gdb 2002-05-06-cvs
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, <small>...</small>
(gdb)
</FONT></pre></td></tr></table></P><P>
We can expand macros and examine their definitions, even when the
program is not running. GDB uses the current listing position
to decide which macro definitions are in scope:
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) list main
3
4 #define M 42
5 #define ADD(x) (M + x)
6
7 main ()
8 {
9 #define N 28
10 printf ("Hello, world!\n");
11 #undef N
12 printf ("We're so creative.\n");
(gdb) info macro ADD
Defined at /home/jimb/gdb/macros/play/sample.c:5
#define ADD(x) (M + x)
(gdb) info macro Q
Defined at /home/jimb/gdb/macros/play/sample.h:1
included at /home/jimb/gdb/macros/play/sample.c:2
#define Q &#60;
(gdb) macro expand ADD(1)
expands to: (42 + 1)
(gdb) macro expand-once ADD(1)
expands to: once (M + 1)
(gdb)
</FONT></pre></td></tr></table></P><P>
In the example above, note that <CODE>macro expand-once</CODE> expands only
the macro invocation explicit in the original text -- the invocation of
<CODE>ADD</CODE> -- but does not expand the invocation of the macro <CODE>M</CODE>,
which was introduced by <CODE>ADD</CODE>.
</P><P>
Once the program is running, GDB uses the macro definitions in
force at the source line of the current stack frame:
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) break main
Breakpoint 1 at 0x8048370: file sample.c, line 10.
(gdb) run
Starting program: /home/jimb/gdb/macros/play/sample
Breakpoint 1, main () at sample.c:10
10 printf ("Hello, world!\n");
(gdb)
</FONT></pre></td></tr></table></P><P>
At line 10, the definition of the macro <CODE>N</CODE> at line 9 is in force:
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) info macro N
Defined at /home/jimb/gdb/macros/play/sample.c:9
#define N 28
(gdb) macro expand N Q M
expands to: 28 &#60; 42
(gdb) print N Q M
$1 = 1
(gdb)
</FONT></pre></td></tr></table></P><P>
As we step over directives that remove <CODE>N</CODE>'s definition, and then
give it a new definition, GDB finds the definition (or lack
thereof) in force at each point:
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>(gdb) next
Hello, world!
12 printf ("We're so creative.\n");
(gdb) info macro N
The symbol `N' has no definition as a C/C++ preprocessor macro
at /home/jimb/gdb/macros/play/sample.c:12
(gdb) next
We're so creative.
14 printf ("Goodbye, world!\n");
(gdb) info macro N
Defined at /home/jimb/gdb/macros/play/sample.c:13
#define N 1729
(gdb) macro expand N Q M
expands to: 1729 &#60; 42
(gdb) print N Q M
$2 = 0
(gdb)
</FONT></pre></td></tr></table></P><P>
<A NAME="Tracepoints"></A>
<HR SIZE="6">
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_11.html#SEC84"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<BR>
<FONT SIZE="-1">
<address>
<p>Please send FSF &amp; GNU inquiries &amp; questions to <a
href="mailto:gnu@gnu.org">gnu@gnu.org</a>. There are also <a
href="http://www.gnu.org/home.html#ContactInfo">other ways to
contact</a> the FSF.</p>
<p>These pages are maintained by <a
href="http://www.gnu.org/software/gdb/">the GDB developers</a>.</p>
<p>Copyright Free Software Foundation, Inc., 59 Temple Place - Suite
330, Boston, MA 02111, USA.</p>
<p>Verbatim copying and distribution of this entire article is
permitted in any medium, provided this notice is preserved.</p>
</address>
This document was generated
by <I>GDB Administrator</I> on <I>March, 27 2008</I>
using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
"><I>texi2html</I></A>
</BODY>
</HTML>