检查局部变量返回函数

Examining local variables returned function

我有一个崩溃的进程的核心转储(难以重现)。

我发现刚刚返回的函数出了点问题(它返回了一个NULL指针而不是一个非NULL指针)。

知道那个函数中栈变量的内容对我有很大的帮助。我认为在大多数架构中,从函数返回只是意味着更改堆栈指针。换句话说,那些值仍然存在(如果我们以 x86 为例,则在堆栈指针下方)。

任何人都可以确认我的推理是正确的,并且可以提供一个如何使用 gdb 执行此操作的示例吗?

我的推理也适用于 MIPS 吗?

您可能会看到未使用以下方法优化的局部变量:

info locals

不过,它可能不适用于已经 return 的函数。如果您可以再次 运行 该程序,请尝试在函数 return.

之前放置一个断点

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

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

局部变量可能已经存储在堆栈中,但不一定。如果只有少量变量适合寄存器并且优化了代码,那么局部变量永远不会保存在堆栈中。 根据使用的调用约定,局部变量的最终值可能仍保留在寄存器中。

反汇编有问题的函数(您可以使用 objdump -dS 来执行此操作,因此您可以轻松关联源代码)。查看局部变量是如何被访问的。它们是存储在内存中还是寄存器中?寄存器是否已恢复到与调用者相关的值?

如果没有恢复原来的寄存器值,你可以只检查用于存储本地的寄存器。如果它已经恢复,那么它可能丢失了。

如果局部值存储到堆栈,那么函数序言(第一条指令)应该告诉您如何操作堆栈和帧指针。考虑到该调用也保存到堆栈(保存 PC),您可以计算该函数中使用的 stack/frame 指针的值。然后使用 x 检查内存位置。

根据调用的函数,您还可以检查其参数(调用时)并重新计算局部变量的值。