'How does `gdb` compute the bounds of a stack frame?

I am debugging a new thread library, in which I set the stack register rsp manually (to switch to a user-managed stack), and then invoke a function which never returns.

When I try to get a backtrace in gdb, I get the following output.

(gdb) bt
#0  load (_m=std::memory_order_seq_cst, this=<error reading variable: Asked for position 0 of stack, stack only has 0 elements on it.>)
    at /usr/include/c++/4.9/atomic:209
#1  Arachne::schedulerMainLoop () at Arachne.cc:236
#2  0x000000000040268d in Arachne::threadMainFunction (id=<optimized out>) at Arachne.cc:135
#3  0x0000000000000000 in ?? ()

How does gdb determine that the stack has 0 elements in it?

More generally, how does gdb determine how many elements the stack has?



Solution 1:[1]

Asked for position 0 of stack, stack only has 0 elements on it. comes from gdb/dwarf2/expr.c and doesn't refer to your CPU stack. Instead, it complains about the stack that DWARF expressions work on.

This might mean that your DWARF debug info is invalid. Or what you did with esp confused GDB's DWARF expression evaluator.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 0xF