背景:我用getcontext(3)
/makecontext(3)
/setcontext(3)
(ucontext.h
; SUSv2,POSIX.1-2001)系列函数分配我自己的机器上下文和堆栈。GDB如何确定堆栈的底部?
当我使用gdb(版本6.1.1)来检查一个堆栈,而线程是在我分配的这些上下文中的一个上下文中时,看起来好像gdb不知道堆栈的末端(逻辑底部)在哪里是。例如,这里有来自86 FreeBSD的堆栈:
#0 0x2872d79f in poll() from /lib/libc.so.7
#1 0x28646e23 in poll() from /lib/libthr.so.3
#2 0x2869b267 in fdtask (task=0x28a3dc40, v=0x0) at fd.c:58
#3 0x2869c8dc in taskstart (y=681827392, x=0) at task.c:58
#4 0x00000000 in ??()
#5 0x28a3dc40 in ??()
#6 0x00000000 in ??()
#7 0x00000000 in ??()
…
#65 0x00000000 in ??()
…
(是的,这是建立在Russ Cox' libtask library顶部)。
这方面的执行始于taskstart
功能,但它似乎是GDB想不通它应该停止尝试读取堆栈,即使它在该帧中返回NULL的返回地址。
我的问题是:有什么我可以做(通过格式化以某种方式堆栈,或者设置寄存器,任何东西),以帮助GDB明白的地方堆栈的顶部?谢谢。
编辑:结论:似乎gdb 6.1.1检测堆栈的结束是通过检查存储的帧指针是否为NULL;我通过修改x86和AMD64 makecontext(2)
函数初始化新的情境时,EBP或RBP归零固定我的使用情况的问题。 (在这种情况下,我不关心其他体系结构。)这个问题在gdb 7.1中消失了;据推测gdb 7.1能够通过其他方式检测堆栈的结束,例如debuginfo。
这听起来像一个问题要问在gdb的开发人员邮件列表。 – 2012-04-05 15:38:30