1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<!-- Copyright (C) 1988-2021 Free Software Foundation, Inc.
4
5Permission is granted to copy, distribute and/or modify this document
6under the terms of the GNU Free Documentation License, Version 1.3 or
7any later version published by the Free Software Foundation; with the
8Invariant Sections being "Free Software" and "Free Software Needs
9Free Documentation", with the Front-Cover Texts being "A GNU Manual,"
10and with the Back-Cover Texts as in (a) below.
11
12(a) The FSF's Back-Cover Text is: "You are free to copy and modify
13this GNU Manual.  Buying copies from GNU Press supports the FSF in
14developing GNU and promoting software freedom." -->
15<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
16<head>
17<title>Debugging with GDB: Inline Functions</title>
18
19<meta name="description" content="Debugging with GDB: Inline Functions">
20<meta name="keywords" content="Debugging with GDB: Inline Functions">
21<meta name="resource-type" content="document">
22<meta name="distribution" content="global">
23<meta name="Generator" content="makeinfo">
24<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
25<link href="index.html#Top" rel="start" title="Top">
26<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
27<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
28<link href="Optimized-Code.html#Optimized-Code" rel="up" title="Optimized Code">
29<link href="Tail-Call-Frames.html#Tail-Call-Frames" rel="next" title="Tail Call Frames">
30<link href="Optimized-Code.html#Optimized-Code" rel="previous" title="Optimized Code">
31<style type="text/css">
32<!--
33a.summary-letter {text-decoration: none}
34blockquote.smallquotation {font-size: smaller}
35div.display {margin-left: 3.2em}
36div.example {margin-left: 3.2em}
37div.indentedblock {margin-left: 3.2em}
38div.lisp {margin-left: 3.2em}
39div.smalldisplay {margin-left: 3.2em}
40div.smallexample {margin-left: 3.2em}
41div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
42div.smalllisp {margin-left: 3.2em}
43kbd {font-style:oblique}
44pre.display {font-family: inherit}
45pre.format {font-family: inherit}
46pre.menu-comment {font-family: serif}
47pre.menu-preformatted {font-family: serif}
48pre.smalldisplay {font-family: inherit; font-size: smaller}
49pre.smallexample {font-size: smaller}
50pre.smallformat {font-family: inherit; font-size: smaller}
51pre.smalllisp {font-size: smaller}
52span.nocodebreak {white-space:nowrap}
53span.nolinebreak {white-space:nowrap}
54span.roman {font-family:serif; font-weight:normal}
55span.sansserif {font-family:sans-serif; font-weight:normal}
56ul.no-bullet {list-style: none}
57-->
58</style>
59
60
61</head>
62
63<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
64<a name="Inline-Functions"></a>
65<div class="header">
66<p>
67Next: <a href="Tail-Call-Frames.html#Tail-Call-Frames" accesskey="n" rel="next">Tail Call Frames</a>, Up: <a href="Optimized-Code.html#Optimized-Code" accesskey="u" rel="up">Optimized Code</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>
68</div>
69<hr>
70<a name="Inline-Functions-1"></a>
71<h3 class="section">11.1 Inline Functions</h3>
72<a name="index-inline-functions_002c-debugging"></a>
73
74<p><em>Inlining</em> is an optimization that inserts a copy of the function
75body directly at each call site, instead of jumping to a shared
76routine.  <small>GDB</small> displays inlined functions just like
77non-inlined functions.  They appear in backtraces.  You can view their
78arguments and local variables, step into them with <code>step</code>, skip
79them with <code>next</code>, and escape from them with <code>finish</code>.
80You can check whether a function was inlined by using the
81<code>info frame</code> command.
82</p>
83<p>For <small>GDB</small> to support inlined functions, the compiler must
84record information about inlining in the debug information &mdash;
85<small>GCC</small> using the <small>DWARF 2</small> format does this, and several
86other compilers do also.  <small>GDB</small> only supports inlined functions
87when using <small>DWARF 2</small>.  Versions of <small>GCC</small> before 4.1
88do not emit two required attributes (&lsquo;<samp>DW_AT_call_file</samp>&rsquo; and
89&lsquo;<samp>DW_AT_call_line</samp>&rsquo;); <small>GDB</small> does not display inlined
90function calls with earlier versions of <small>GCC</small>.  It instead
91displays the arguments and local variables of inlined functions as
92local variables in the caller.
93</p>
94<p>The body of an inlined function is directly included at its call site;
95unlike a non-inlined function, there are no instructions devoted to
96the call.  <small>GDB</small> still pretends that the call site and the
97start of the inlined function are different instructions.  Stepping to
98the call site shows the call site, and then stepping again shows
99the first line of the inlined function, even though no additional
100instructions are executed.
101</p>
102<p>This makes source-level debugging much clearer; you can see both the
103context of the call and then the effect of the call.  Only stepping by
104a single instruction using <code>stepi</code> or <code>nexti</code> does not do
105this; single instruction steps always show the inlined body.
106</p>
107<p>There are some ways that <small>GDB</small> does not pretend that inlined
108function calls are the same as normal calls:
109</p>
110<ul>
111<li> Setting breakpoints at the call site of an inlined function may not
112work, because the call site does not contain any code.  <small>GDB</small>
113may incorrectly move the breakpoint to the next line of the enclosing
114function, after the call.  This limitation will be removed in a future
115version of <small>GDB</small>; until then, set a breakpoint on an earlier line
116or inside the inlined function instead.
117
118</li><li> <small>GDB</small> cannot locate the return value of inlined calls after
119using the <code>finish</code> command.  This is a limitation of compiler-generated
120debugging information; after <code>finish</code>, you can step to the next line
121and print a variable where your program stored the return value.
122
123</li></ul>
124
125<hr>
126<div class="header">
127<p>
128Next: <a href="Tail-Call-Frames.html#Tail-Call-Frames" accesskey="n" rel="next">Tail Call Frames</a>, Up: <a href="Optimized-Code.html#Optimized-Code" accesskey="u" rel="up">Optimized Code</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>
129</div>
130
131
132
133</body>
134</html>
135