检查局部变量返回函数
Examining local variables returned function
我有一个崩溃的进程的核心转储(难以重现)。
我发现刚刚返回的函数出了点问题(它返回了一个NULL指针而不是一个非NULL指针)。
知道那个函数中栈变量的内容对我有很大的帮助。我认为在大多数架构中,从函数返回只是意味着更改堆栈指针。换句话说,那些值仍然存在(如果我们以 x86 为例,则在堆栈指针下方)。
任何人都可以确认我的推理是正确的,并且可以提供一个如何使用 gdb 执行此操作的示例吗?
我的推理也适用于 MIPS 吗?
您可能会看到未使用以下方法优化的局部变量:
info locals
不过,它可能不适用于已经 return 的函数。如果您可以再次 运行 该程序,请尝试在函数 return.
之前放置一个断点
否则,您可以使用 x/x
和 info register
手动调查堆栈以了解堆栈指针地址。
然后您可以使用 up
和 down
浏览堆栈。
局部变量可能已经存储在堆栈中,但不一定。如果只有少量变量适合寄存器并且优化了代码,那么局部变量永远不会保存在堆栈中。
根据使用的调用约定,局部变量的最终值可能仍保留在寄存器中。
反汇编有问题的函数(您可以使用 objdump -dS 来执行此操作,因此您可以轻松关联源代码)。查看局部变量是如何被访问的。它们是存储在内存中还是寄存器中?寄存器是否已恢复到与调用者相关的值?
如果没有恢复原来的寄存器值,你可以只检查用于存储本地的寄存器。如果它已经恢复,那么它可能丢失了。
如果局部值存储到堆栈,那么函数序言(第一条指令)应该告诉您如何操作堆栈和帧指针。考虑到该调用也保存到堆栈(保存 PC),您可以计算该函数中使用的 stack/frame 指针的值。然后使用 x 检查内存位置。
根据调用的函数,您还可以检查其参数(调用时)并重新计算局部变量的值。
我有一个崩溃的进程的核心转储(难以重现)。
我发现刚刚返回的函数出了点问题(它返回了一个NULL指针而不是一个非NULL指针)。
知道那个函数中栈变量的内容对我有很大的帮助。我认为在大多数架构中,从函数返回只是意味着更改堆栈指针。换句话说,那些值仍然存在(如果我们以 x86 为例,则在堆栈指针下方)。
任何人都可以确认我的推理是正确的,并且可以提供一个如何使用 gdb 执行此操作的示例吗?
我的推理也适用于 MIPS 吗?
您可能会看到未使用以下方法优化的局部变量:
info locals
不过,它可能不适用于已经 return 的函数。如果您可以再次 运行 该程序,请尝试在函数 return.
之前放置一个断点否则,您可以使用 x/x
和 info register
手动调查堆栈以了解堆栈指针地址。
然后您可以使用 up
和 down
浏览堆栈。
局部变量可能已经存储在堆栈中,但不一定。如果只有少量变量适合寄存器并且优化了代码,那么局部变量永远不会保存在堆栈中。 根据使用的调用约定,局部变量的最终值可能仍保留在寄存器中。
反汇编有问题的函数(您可以使用 objdump -dS 来执行此操作,因此您可以轻松关联源代码)。查看局部变量是如何被访问的。它们是存储在内存中还是寄存器中?寄存器是否已恢复到与调用者相关的值?
如果没有恢复原来的寄存器值,你可以只检查用于存储本地的寄存器。如果它已经恢复,那么它可能丢失了。
如果局部值存储到堆栈,那么函数序言(第一条指令)应该告诉您如何操作堆栈和帧指针。考虑到该调用也保存到堆栈(保存 PC),您可以计算该函数中使用的 stack/frame 指针的值。然后使用 x 检查内存位置。
根据调用的函数,您还可以检查其参数(调用时)并重新计算局部变量的值。