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> [<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 — 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 (‘<samp>DW_AT_call_file</samp>’ and 89‘<samp>DW_AT_call_line</samp>’); <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> [<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