| 
							- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 - <html>
 - <!-- Copyright (C) 1988-2020 Free Software Foundation, Inc.
 - 
 - Permission is granted to copy, distribute and/or modify this document
 - under the terms of the GNU Free Documentation License, Version 1.3 or
 - any later version published by the Free Software Foundation; with the
 - Invariant Sections being "Free Software" and "Free Software Needs
 - Free Documentation", with the Front-Cover Texts being "A GNU Manual,"
 - and with the Back-Cover Texts as in (a) below.
 - 
 - (a) The FSF's Back-Cover Text is: "You are free to copy and modify
 - this GNU Manual.  Buying copies from GNU Press supports the FSF in
 - developing GNU and promoting software freedom." -->
 - <!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
 - <head>
 - <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 - <title>Macros (Debugging with GDB)</title>
 - 
 - <meta name="description" content="Macros (Debugging with GDB)">
 - <meta name="keywords" content="Macros (Debugging with GDB)">
 - <meta name="resource-type" content="document">
 - <meta name="distribution" content="global">
 - <meta name="Generator" content="makeinfo">
 - <link href="index.html#Top" rel="start" title="Top">
 - <link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
 - <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
 - <link href="index.html#Top" rel="up" title="Top">
 - <link href="Tracepoints.html#Tracepoints" rel="next" title="Tracepoints">
 - <link href="Tail-Call-Frames.html#Tail-Call-Frames" rel="prev" title="Tail Call Frames">
 - <style type="text/css">
 - <!--
 - a.summary-letter {text-decoration: none}
 - blockquote.indentedblock {margin-right: 0em}
 - blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
 - blockquote.smallquotation {font-size: smaller}
 - div.display {margin-left: 3.2em}
 - div.example {margin-left: 3.2em}
 - div.lisp {margin-left: 3.2em}
 - div.smalldisplay {margin-left: 3.2em}
 - div.smallexample {margin-left: 3.2em}
 - div.smalllisp {margin-left: 3.2em}
 - kbd {font-style: oblique}
 - pre.display {font-family: inherit}
 - pre.format {font-family: inherit}
 - pre.menu-comment {font-family: serif}
 - pre.menu-preformatted {font-family: serif}
 - pre.smalldisplay {font-family: inherit; font-size: smaller}
 - pre.smallexample {font-size: smaller}
 - pre.smallformat {font-family: inherit; font-size: smaller}
 - pre.smalllisp {font-size: smaller}
 - span.nolinebreak {white-space: nowrap}
 - span.roman {font-family: initial; font-weight: normal}
 - span.sansserif {font-family: sans-serif; font-weight: normal}
 - ul.no-bullet {list-style: none}
 - -->
 - </style>
 - 
 - 
 - </head>
 - 
 - <body lang="en">
 - <a name="Macros"></a>
 - <div class="header">
 - <p>
 - Next: <a href="Tracepoints.html#Tracepoints" accesskey="n" rel="next">Tracepoints</a>, Previous: <a href="Optimized-Code.html#Optimized-Code" accesskey="p" rel="prev">Optimized Code</a>, Up: <a href="index.html#Top" accesskey="u" rel="up">Top</a>   [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
 - </div>
 - <hr>
 - <a name="C-Preprocessor-Macros"></a>
 - <h2 class="chapter">12 C Preprocessor Macros</h2>
 - 
 - <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.
 - <small>GDB</small> 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 <small>GDB</small>
 - 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 <a href="Compilation.html#Compilation">Compilation</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, <small>GDB</small>
 - uses the macros in scope at that frame’s source code line.  Otherwise,
 - <small>GDB</small> uses the macros in scope at the current listing location;
 - see <a href="List.html#List">List</a>.
 - </p>
 - <p>Whenever <small>GDB</small> evaluates an expression, it always expands any
 - macro invocations present in the expression.  <small>GDB</small> also provides
 - the following commands for working with macros explicitly.
 - </p>
 - <dl compact="compact">
 - <dd>
 - <a name="index-macro-expand"></a>
 - <a name="index-macro-expansion_002c-showing-the-results-of-preprocessor"></a>
 - <a name="index-preprocessor-macro-expansion_002c-showing-the-results-of"></a>
 - <a name="index-expanding-preprocessor-macros"></a>
 - </dd>
 - <dt><code>macro expand <var>expression</var></code></dt>
 - <dt><code>macro exp <var>expression</var></code></dt>
 - <dd><p>Show the results of expanding all preprocessor macro invocations in
 - <var>expression</var>.  Since <small>GDB</small> 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="index-macro-exp1"></a>
 - </dd>
 - <dt><code>macro expand-once <var>expression</var></code></dt>
 - <dt><code>macro exp1 <var>expression</var></code></dt>
 - <dd><a name="index-expand-macro-once"></a>
 - <p><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 <small>GDB</small> 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="index-info-macro"></a>
 - <a name="index-macro-definition_002c-showing"></a>
 - <a name="index-definition-of-a-macro_002c-showing"></a>
 - <a name="index-macros_002c-from-debug-info"></a>
 - </dd>
 - <dt><code>info macro [-a|-all] [--] <var>macro</var></code></dt>
 - <dd><p>Show the current definition or all definitions of the named <var>macro</var>,
 - and describe the source location or compiler command-line where that
 - definition was established.  The optional double dash is to signify the end of
 - argument processing and the beginning of <var>macro</var> for non C-like macros where
 - the macro may begin with a hyphen.
 - </p>
 - <a name="index-info-macros"></a>
 - </dd>
 - <dt><code>info macros <var>location</var></code></dt>
 - <dd><p>Show all macro definitions that are in effect at the location specified
 - by <var>location</var>,  and describe the source location or compiler
 - command-line where those definitions were established.
 - </p>
 - <a name="index-macro-define"></a>
 - <a name="index-user_002ddefined-macros"></a>
 - <a name="index-defining-macros-interactively"></a>
 - <a name="index-macros_002c-user_002ddefined"></a>
 - </dd>
 - <dt><code>macro define <var>macro</var> <var>replacement-list</var></code></dt>
 - <dt><code>macro define <var>macro</var>(<var>arglist</var>) <var>replacement-list</var></code></dt>
 - <dd><p>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>
 - <p>A definition introduced by this command is in scope in every
 - expression evaluated in <small>GDB</small>, 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>
 - <a name="index-macro-undef"></a>
 - </dd>
 - <dt><code>macro undef <var>macro</var></code></dt>
 - <dd><p>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="index-macro-list"></a>
 - </dd>
 - <dt><code>macro list</code></dt>
 - <dd><p>List all the macros defined using the <code>macro define</code> command.
 - </p></dd>
 - </dl>
 - 
 - <a name="index-macros_002c-example-of-debugging-with"></a>
 - <p>Here is a transcript showing the above commands in action.  First, we
 - show our source files:
 - </p>
 - <div class="smallexample">
 - <pre class="smallexample">$ cat sample.c
 - #include <stdio.h>
 - #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 <
 - $
 - </pre></div>
 - 
 - <p>Now, we compile the program using the <small>GNU</small> C compiler,
 - <small>GCC</small>.  We pass the <samp>-gdwarf-2</samp><a name="DOCF14" href="#FOOT14"><sup>14</sup></a> <em>and</em> <samp>-g3</samp> flags to ensure the compiler
 - includes information about preprocessor macros in the debugging
 - information.
 - </p>
 - <div class="smallexample">
 - <pre class="smallexample">$ gcc -gdwarf-2 -g3 sample.c -o sample
 - $
 - </pre></div>
 - 
 - <p>Now, we start <small>GDB</small> on our sample program:
 - </p>
 - <div class="smallexample">
 - <pre class="smallexample">$ gdb -nw sample
 - GNU gdb 2002-05-06-cvs
 - Copyright 2002 Free Software Foundation, Inc.
 - GDB is free software, …
 - (gdb)
 - </pre></div>
 - 
 - <p>We can expand macros and examine their definitions, even when the
 - program is not running.  <small>GDB</small> uses the current listing position
 - to decide which macro definitions are in scope:
 - </p>
 - <div class="smallexample">
 - <pre class="smallexample">(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 <
 - (gdb) macro expand ADD(1)
 - expands to: (42 + 1)
 - (gdb) macro expand-once ADD(1)
 - expands to: once (M + 1)
 - (gdb)
 - </pre></div>
 - 
 - <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, <small>GDB</small> uses the macro definitions in
 - force at the source line of the current stack frame:
 - </p>
 - <div class="smallexample">
 - <pre class="smallexample">(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)
 - </pre></div>
 - 
 - <p>At line 10, the definition of the macro <code>N</code> at line 9 is in force:
 - </p>
 - <div class="smallexample">
 - <pre class="smallexample">(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 < 42
 - (gdb) print N Q M
 - $1 = 1
 - (gdb)
 - </pre></div>
 - 
 - <p>As we step over directives that remove <code>N</code>’s definition, and then
 - give it a new definition, <small>GDB</small> finds the definition (or lack
 - thereof) in force at each point:
 - </p>
 - <div class="smallexample">
 - <pre class="smallexample">(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 < 42
 - (gdb) print N Q M
 - $2 = 0
 - (gdb)
 - </pre></div>
 - 
 - <p>In addition to source files, macros can be defined on the compilation command
 - line using the <samp>-D<var>name</var>=<var>value</var></samp> syntax.  For macros defined in
 - such a way, <small>GDB</small> displays the location of their definition as line zero
 - of the source file submitted to the compiler.
 - </p>
 - <div class="smallexample">
 - <pre class="smallexample">(gdb) info macro __STDC__
 - Defined at /home/jimb/gdb/macros/play/sample.c:0
 - -D__STDC__=1
 - (gdb)
 - </pre></div>
 - 
 - 
 - <div class="footnote">
 - <hr>
 - <h4 class="footnotes-heading">Footnotes</h4>
 - 
 - <h3><a name="FOOT14" href="#DOCF14">(14)</a></h3>
 - <p>This is the
 - minimum.  Recent versions of <small>GCC</small> support <samp>-gdwarf-3</samp>
 - and <samp>-gdwarf-4</samp>; we recommend always choosing the most recent
 - version of DWARF.</p>
 - </div>
 - <hr>
 - <div class="header">
 - <p>
 - Next: <a href="Tracepoints.html#Tracepoints" accesskey="n" rel="next">Tracepoints</a>, Previous: <a href="Optimized-Code.html#Optimized-Code" accesskey="p" rel="prev">Optimized Code</a>, Up: <a href="index.html#Top" accesskey="u" rel="up">Top</a>   [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
 - </div>
 - 
 - 
 - 
 - </body>
 - </html>
 
 
  |