检查局部变量返回函数

Pau*_*aet 6 c gdb stack-trace

我有一个崩溃的过程的coredump(很难重现).

我已经发现在刚刚返回函数中出现了问题(它返回了一个NULL指针而不是一个非NULL指针).

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

任何人都可以确认我的推理是正确的,并可能提供一个例子如何与gdb这样做?

我的推理也适用于MIPS吗?

dbr*_*nk0 4

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

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

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

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

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