在c中实现堆栈回溯

时间:2014-09-03 13:32:38

标签: c

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

         

    ARG1     

    

    ARG2     

    

ret_add1

    

bp1

    

arg1


    

arg2     

ret_add2

    

bp2

    

叠加顶部

         

由于

1 个答案:

答案 0 :(得分:4)

这是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

BTW,请注意,某些C编译器能够执行tail call optimizations,并且许多C编译器能够执行inline expansion(即使没有inline关键字)。在这两种情况下,你的问题都没有实际意义。