hc
2023-11-06 15ade055295d13f95d49e3d99b09f3bbfb4a43e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2021 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: Frames</title>
 
<meta name="description" content="Debugging with GDB: Frames">
<meta name="keywords" content="Debugging with GDB: Frames">
<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="Stack.html#Stack" rel="up" title="Stack">
<link href="Backtrace.html#Backtrace" rel="next" title="Backtrace">
<link href="Stack.html#Stack" rel="previous" title="Stack">
<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="Frames"></a>
<div class="header">
<p>
Next: <a href="Backtrace.html#Backtrace" accesskey="n" rel="next">Backtrace</a>, Up: <a href="Stack.html#Stack" accesskey="u" rel="up">Stack</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="Stack-Frames"></a>
<h3 class="section">8.1 Stack Frames</h3>
 
<a name="index-frame_002c-definition"></a>
<a name="index-stack-frame"></a>
<p>The call stack is divided up into contiguous pieces called <em>stack
frames</em>, or <em>frames</em> for short; each frame is the data associated
with one call to one function.  The frame contains the arguments given
to the function, the function&rsquo;s local variables, and the address at
which the function is executing.
</p>
<a name="index-initial-frame"></a>
<a name="index-outermost-frame"></a>
<a name="index-innermost-frame"></a>
<p>When your program is started, the stack has only one frame, that of the
function <code>main</code>.  This is called the <em>initial</em> frame or the
<em>outermost</em> frame.  Each time a function is called, a new frame is
made.  Each time a function returns, the frame for that function invocation
is eliminated.  If a function is recursive, there can be many frames for
the same function.  The frame for the function in which execution is
actually occurring is called the <em>innermost</em> frame.  This is the most
recently created of all the stack frames that still exist.
</p>
<a name="index-frame-pointer"></a>
<p>Inside your program, stack frames are identified by their addresses.  A
stack frame consists of many bytes, each of which has its own address; each
kind of computer has a convention for choosing one byte whose
address serves as the address of the frame.  Usually this address is kept
in a register called the <em>frame pointer register</em>
(see <a href="Registers.html#Registers">$fp</a>) while execution is going on in that frame.
</p>
<a name="index-frame-level"></a>
<a name="index-frame-number"></a>
<p><small>GDB</small> labels each existing stack frame with a <em>level</em>, a
number that is zero for the innermost frame, one for the frame that
called it, and so on upward.  These level numbers give you a way of
designating stack frames in <small>GDB</small> commands.  The terms
<em>frame number</em> and <em>frame level</em> can be used interchangeably to
describe this number.
</p>
<a name="index-frameless-execution"></a>
<p>Some compilers provide a way to compile functions so that they operate
without stack frames.  (For example, the <small>GCC</small> option
</p><div class="smallexample">
<pre class="smallexample">&lsquo;<samp>-fomit-frame-pointer</samp>&rsquo;
</pre></div>
<p>generates functions without a frame.)
This is occasionally done with heavily used library functions to save
the frame setup time.  <small>GDB</small> has limited facilities for dealing
with these function invocations.  If the innermost function invocation
has no stack frame, <small>GDB</small> nevertheless regards it as though
it had a separate frame, which is numbered zero as usual, allowing
correct tracing of the function call chain.  However, <small>GDB</small> has
no provision for frameless functions elsewhere in the stack.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Backtrace.html#Backtrace" accesskey="n" rel="next">Backtrace</a>, Up: <a href="Stack.html#Stack" accesskey="u" rel="up">Stack</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>