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