summaryrefslogtreecommitdiff
path: root/share/doc/gdb/Macros.html
diff options
context:
space:
mode:
authoralk3pInjection <webmaster@raspii.tech>2024-02-04 16:16:35 +0800
committeralk3pInjection <webmaster@raspii.tech>2024-02-04 16:16:35 +0800
commit6ce4ebed87858ecdd79a1091367c6e961055daa9 (patch)
tree1c2a6a60531acf791531bbd9c8ac14c23ef8a66c /share/doc/gdb/Macros.html
Import stripped Arm GNU Toolchain 13.2.Rel1HEADumineko
https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads Change-Id: I7303388733328cd98ab9aa3c30236db67f2e9e9c
Diffstat (limited to 'share/doc/gdb/Macros.html')
-rw-r--r--share/doc/gdb/Macros.html343
1 files changed, 343 insertions, 0 deletions
diff --git a/share/doc/gdb/Macros.html b/share/doc/gdb/Macros.html
new file mode 100644
index 0000000..7e1f876
--- /dev/null
+++ b/share/doc/gdb/Macros.html
@@ -0,0 +1,343 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!-- Copyright (C) 1988-2023 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 5.1, http://www.gnu.org/software/texinfo/ -->
+<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="makeinfo">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<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="previous" title="Tail Call Frames">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+div.indentedblock {margin-left: 3.2em}
+div.lisp {margin-left: 3.2em}
+div.smalldisplay {margin-left: 3.2em}
+div.smallexample {margin-left: 3.2em}
+div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
+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.nocodebreak {white-space:nowrap}
+span.nolinebreak {white-space:nowrap}
+span.roman {font-family:serif; font-weight:normal}
+span.sansserif {font-family:sans-serif; font-weight:normal}
+ul.no-bullet {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+<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="previous">Optimized Code</a>, Up: <a href="index.html#Top" accesskey="u" rel="up">Top</a> &nbsp; [<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
+&ldquo;preprocessor macros&rdquo; 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&rsquo;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&rsquo;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>locspec</var></code></dt>
+<dd><p>Show all macro definitions that are in effect at the source line of
+the code location that results from resolving <var>locspec</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
+&ldquo;object-like&rdquo; macro, which takes no arguments; the second form
+defines a &ldquo;function-like&rdquo; 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 &lt;stdio.h&gt;
+#include &quot;sample.h&quot;
+
+#define M 42
+#define ADD(x) (M + x)
+
+main ()
+{
+#define N 28
+ printf (&quot;Hello, world!\n&quot;);
+#undef N
+ printf (&quot;We're so creative.\n&quot;);
+#define N 1729
+ printf (&quot;Goodbye, world!\n&quot;);
+}
+$ cat sample.h
+#define Q &lt;
+$
+</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, &hellip;
+(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 (&quot;Hello, world!\n&quot;);
+11 #undef N
+12 printf (&quot;We're so creative.\n&quot;);
+(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 &lt;
+(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 &mdash; the invocation of
+<code>ADD</code> &mdash; 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 (&quot;Hello, world!\n&quot;);
+(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 &lt; 42
+(gdb) print N Q M
+$1 = 1
+(gdb)
+</pre></div>
+
+<p>As we step over directives that remove <code>N</code>&rsquo;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 (&quot;We're so creative.\n&quot;);
+(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 (&quot;Goodbye, world!\n&quot;);
+(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 &lt; 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="previous">Optimized Code</a>, Up: <a href="index.html#Top" accesskey="u" rel="up">Top</a> &nbsp; [<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>