2010-04-15 11 views
1

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

是否有任何Linux API可以遍历此调用堆栈?

请帮助..我寻找它从过去的几天...

在此先感谢 桑迪普

回答

0

你需要得到的第一件事是代码的地址的列表 - 即的当前正在执行的功能,并且返回地址返回到调用链。

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

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

请注意,只有在使用帧指针编译代码时,才能可靠地执行回溯。

+0

这些指针的意义是什么,因为我从寄存器中获取这些值?如何可以遵循这个链 - #define BP rbp/*帧指针*/ #define SP rsp/*堆栈指针*/ #define IP rip/*程序计数器*/ 我是这个概念的新手。你可以指导吗? – 2010-04-16 06:45:07

+0

输入函数时发生的第一件事情是将帧指针的当前值压入堆栈。然后,帧指针被设置为堆栈指针的当前值。所以,反向工作时,可以使用当前帧指针来查找前一帧指针的位置和返回值。 – caf 2010-04-16 08:54:03

+0

嗨caf,谢谢你的回答。但我很困惑这里.. 让我告诉你我所有关于我的调用堆栈的信息。 我有一个寄存器结构的指针,它有三个指针。即堆栈指针,程序计数器和帧指针以及其他通用指针。现在我想遍历堆栈以获取每个帧的地址。 – 2010-04-16 10:20:56

0

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

+0

我找不到与我的Linux兼容的libunwind库。我可以从哪里下载。 – 2010-04-19 04:03:24

+0

是在编译时自动生成的“.eh_frame头”头?你怎么看?你正在谈论哪个目标文件? – 2010-07-07 11:21:58

相关问题