11.7.2 Frame Handling Terminology
It is easy to get confused when referencing stack frames. gdb uses some precise terminology.
- THIS frame is the frame currently under consideration.
- The NEXT frame, also sometimes called the inner or newer frame is the frame of the function called by the function of THIS frame.
- The PREVIOUS frame, also sometimes called the outer or older frame is the frame of the function which called the function of THIS frame.
So in the example in the previous section (see All About Stack Frames), if THIS frame is #3 (the call to
fact (3)), the NEXT frame is frame #2 (the call to
fact (2)) and the PREVIOUS frame is frame #4 (the call to
The base of a frame is the address immediately before the start of the NEXT frame. For a stack which grows down in memory (a falling stack) this will be the lowest address and for a stack which grows up in memory (a rising stack) this will be the highest address in the frame.
gdb functions to analyze the stack are typically given a pointer to the NEXT frame to determine information about THIS frame. Information about THIS frame includes data on where the registers of the PREVIOUS frame are stored in this stack frame. In this example the frame pointer of the PREVIOUS frame is stored at offset 0 from the stack pointer of THIS frame.
The process whereby a function is given a pointer to the NEXT frame to work out information about THIS frame is referred to as unwinding. The gdb functions involved in this typically include unwind in their name.
The process of analyzing a target to determine the information that should go in struct frame_info is called sniffing. The functions that carry this out are called sniffers and typically include sniffer in their name. More than one sniffer may be required to extract all the information for a particular frame.
Because so many functions work using the NEXT frame, there is an issue about addressing the innermost frame—it has no NEXT frame. To solve this gdb creates a dummy frame #-1, known as the sentinel frame.