It is easy to get confused when referencing stack frames. gdb uses some precise terminology.
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 innermost frame is the frame of the current executing
function, or where the program stopped, in this example, in the middle
of the call to
fact (0)). It is always numbered frame #0.
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.