我正在使用 ptrace 获取与 Linux 上的 Callstack 相关的信息。我可以使用 ptarces 返回的寄存器检索指向我的堆栈的 Spack 指针。但是使用这个堆栈指针如何检索与当前调用堆栈的函数名称和签名相关的信息?
是否有任何 Linux API 可以遍历此调用堆栈?
请帮助..我正在寻找它从过去几天...
提前感谢桑迪普
我正在使用 ptrace 获取与 Linux 上的 Callstack 相关的信息。我可以使用 ptarces 返回的寄存器检索指向我的堆栈的 Spack 指针。但是使用这个堆栈指针如何检索与当前调用堆栈的函数名称和签名相关的信息?
是否有任何 Linux API 可以遍历此调用堆栈?
请帮助..我正在寻找它从过去几天...
提前感谢桑迪普
您需要获取的第一件事是代码地址列表——当前执行函数的地址,以及返回调用链的返回地址。
在 x86 上,%eip
寄存器将包含当前执行函数代码中的内存地址。该%ebp
寄存器将指向堆栈上%ebp
存储先前值的位置,然后是返回值。您需要遵循该%ebp
值链,随时记录返回地址。
然后,您需要读取正在调试的二进制文件中的 DWARF 调试信息,以将代码地址解析回函数名称。
请注意,只有使用帧指针编译代码才能可靠地完成回溯。
我强烈建议在这种情况下使用 libunwind。它为遍历调用堆栈提供了一个很好的 API。它取决于目标文件中是否存在 .eh_frame 标头。它可以在本地和远程(您的用例)上下文中使用。堆栈展开不依赖于 DWARF 信息或调试版本。