gpt4 book ai didi

c - 在 C 中实现堆栈回溯

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:21 25 4
gpt4 key购买 nike

我想通过读取存储在堆栈中的所有值在 c 中实现 stack_back-trace 函数!我的问题是,我可以读取当前函数的基指针和返回地址,但我不知道如何跳过返回地址上方的参数以到达下一个基指针和返回地址!在下面的示例中,我可以读取 bp2 和 ret_add2 但我不知道我应该如何跳过传递给函数的参数(通过向 bp2 添加特定数量)来读取 bp1 和 ret_add1!任何人都可以帮助我解决这个问题问题?

arg1

参数 2

ret_add1

bp1

arg1


参数 2

ret_add2

bp2

栈顶

谢谢

最佳答案

这是 ABI具体的。实际上取决于目标处理器、编译器和操作系统。对于 Linux/x86-64,请阅读其 ABI spec

有了 GNU libc,你可以使用它的 backtrace(3)函数(然后可能是 dladdr(3) 来查找返回地址附近的符号)。

否则,在汇编程序中编写一些代码(它将是特定于 ABI 和处理器的),也许作为某些 C 函数中的 asm 指令。

一般来说,你甚至不能这样做,例如因为编译器可以自由地进行不遵循 ABI 规范的内部调用。就像在某些带有 GCC 的处理器上使用 -fomit-frame-pointer 标志时一样。

另请参阅 Ian Taylor 的 libbacktrace (它从 DWARF 可用的调试信息中获利);也许 GCC return address builtins可能会有帮助。另见 libffi .

顺便说一句,请注意一些 C 编译器能够做到 tail call optimizations , 许多人都能做到 inline expansion (即使没有 inline 关键字)。在这两种情况下,您的问题都没有实际意义。

关于c - 在 C 中实现堆栈回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25645761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com