检查返回函数的本地变量

6
我有一个进程的核心转储,该进程已经崩溃(难以复现)。
我已经确定,在一个刚刚返回的函数中出现了问题(它返回了一个空指针而不是非空指针)。
如果我知道该函数中堆栈变量的内容,那将对我大有帮助。我认为在大多数体系结构中,从函数返回只意味着改变堆栈指针。换句话说,这些值仍然存在(如果我们以x86为例,则在堆栈指针下面)。
有人能否确认我的推理是正确的,并可能提供一个使用gdb的示例?
我的推理对于MIPS也适用吗?

1
在gdb中尝试输入help x - alk
2个回答

4
本地变量可能存储在堆栈上,但不一定。如果只有少量变量适合寄存器,并且代码经过了优化,则本地变量从未保存在堆栈上。 根据所使用的调用约定,本地变量的最终值仍然可能存在于寄存器中。
反汇编相关函数(可以使用objdump -dS进行此操作,以便您可以轻松地将其与源代码相关联)。查看如何访问本地变量。它们是否存储在内存或寄存器中?寄存器是否已恢复为对调用者有意义的值?
如果未还原原始寄存器值,则只需检查用于存储局部变量的寄存器。如果已经还原,则可能已经丢失。
如果局部值存储到堆栈中,则函数序言(第一个指令)应告诉您如何操作堆栈和帧指针。考虑到调用也保存到堆栈中(PC已保存),您可以计算在该函数中使用的堆栈/帧指针的值。然后使用x来检查内存位置。
根据所调用的函数,您还可以能够检查其参数(在被调用时)并重新计算局部变量的值。

0

您可能会看到未经过优化的本地变量,可以使用以下方法进行优化:

info locals

虽然在已经返回的函数中可能无法工作。如果可以再次运行该程序,请尝试在函数返回之前设置断点。

否则,您可以使用 x/xinfo register 手动调查堆栈以获得堆栈指针地址。

然后,您可以使用 updown 浏览堆栈。


如果函数已经退出,则其本地变量不再位于堆栈上。 - urzeit
哦,它已经返回了。没注意到。 - blue112

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