`gdb`如何计算堆栈帧的边界?

4

我正在调试一个新的线程库,在其中手动设置堆栈寄存器rsp(以切换到用户管理的堆栈),然后调用一个永远不会返回的函数。

当我尝试在gdb中获取回溯时,我得到以下输出。

(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 ?? ()
< p > gdb 如何确定堆栈中没有元素?

更一般地说, gdb 如何确定堆栈中有多少个元素?


帧指针 - n. m.
这个链接https://sourceware.org/gdb/wiki/Internals%20Stack-Frames 可能会有帮助。 - Inian
你好,以下是关于编程的内容,请注意根据你的系统是32位还是64位进行区分。 - Thomas Weller
在x86-64 Linux上,回溯/异常处理堆栈展开依赖于.eh_frame_hdr部分中的元数据。帧指针是完全可选的,即使使用-fno-omit-frame-pointer编译代码也可能不使用。请参见https://dev59.com/MWYq5IYBdhLWcg3w7E0F和http://stackoverflow.com/questions/34055891/implementing-stack-backtrace-without-using-ebp。请查看这些内容,看看是否有重复。`.eh_frame_hdr`的搜索命中率更高。 - Peter Cordes
抱歉我有点懒,没有花时间来找出最好的重复目标,但我从未自己深入研究过细节。 我只知道编译器生成了元数据。 不过,我应该有时间查一下如何为手写汇编函数生成相同的元数据。 无论如何,希望这个线索足以让你自己找到答案。 我不知道 gdb 是如何确定已经达到取消堆栈的末尾的。 但也许当它寻找另一个返回地址来索引元数据时,会找到一些错误的东西。 - Peter Cordes
1个回答

1
Asked for position 0 of stack, stack only has 0 elements on it.这句话来源于gdb/dwarf2/expr.c,并不是指CPU堆栈。它实际上是在抱怨与DWARF表达式相关的堆栈。

这可能意味着您的DWARF调试信息无效。或者您对esp的操作使GDB的DWARF表达式求值器感到困惑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接