我们如何在Linux上从Spack Pointer(reg / SP)获取函数名?

时间:2010-04-15 15:59:02

标签: linux callstack ptrace cpu-registers

我正在使用ptrace获取与Linux上的Callstack相关的信息。 我可以使用ptarces返回的寄存器将Spack指针检索到我的堆栈。 但使用此堆栈指针如何检索与当前调用堆栈的函数名称和签名相关的信息?

是否有任何Linux API来遍历此callstack?

请帮助..我在过去几天里寻找它......

提前谢谢 和Sandeep

2 个答案:

答案 0 :(得分:0)

您需要获得的第一件事是代码地址列表 - 当前正在执行的函数的列表,以及返回到调用链的返回地址。

在x86上,%eip寄存器将在当前正在执行的函数的代码中包含一个内存地址。 %ebp寄存器将指向堆栈中存储前一个值%ebp的位置,后跟返回值。您需要遵循%ebp值链,记录返回地址。

然后,您需要读取正在调试的二进制文件中的DWARF调试信息,以将代码地址解析回函数名称。

请注意,如果使用帧指针编译代码,则只能可靠地完成回溯。

答案 1 :(得分:0)

我强烈建议在这种情况下使用libunwind。它为遍历调用堆栈提供了一个很好的API。它取决于目标文件中是否存在.eh_frame标头。它可以在本地和远程(您的用例)上下文中使用。堆栈展开不依赖于DWARF信息或调试版本。