我很好奇为什么__builtin_return_address()
在ARM中不支持0以外的其他参数? 这是一个问题,你不能从ARM堆栈中推导出调用函数地址? 还是别的?ARM体系结构中调用函数的GCC返回地址
感谢
我很好奇为什么__builtin_return_address()
在ARM中不支持0以外的其他参数? 这是一个问题,你不能从ARM堆栈中推导出调用函数地址? 还是别的?ARM体系结构中调用函数的GCC返回地址
感谢
根据这个帖子< http://codingrelic.geekhold.com/2009/05/pre-mortem-backtracing.html>,
而且在一些架构上,包括我心爱的MIPS,只有
__builtin_return_address(0)
作品。 MIPS没有帧指针,因此难以走回堆栈。帧0可以直接使用返回地址寄存器。 如果ARM也没有帧指针,这将解释限制。
在ARM 上的回溯是难。目前Glibc backtrace
函数确实有效,但您需要最新的编译器/ glibc,并且您需要使用-funwind-tables构建所有内容。没有调试信息,GDB也有问题。
感谢提及 - 风风车桌!在我启用这个编译器标志之前,我在ARM上的回溯始终是深度1。使用GCC 4.3.2。 – jfritz42 2013-04-10 16:12:19
在ARM上,返回地址在寄存器R14中传递,调用另一个函数时被调用者有责任保存它。所以即使使用帧指针,也不能保证返回地址曾经存储在堆栈中。 – 2012-02-10 16:16:48
实际上,当返回地址被调用保存而不是通过调用指令保存在堆栈上时,通常不可能找到它。应该有一种使用dwarf2展开/调试数据的方式,但是这将需要'__builtin_return_address'来调用一个重磅的展开库调用,而不是一个简单的内置... – 2012-02-10 16:37:53
顺便说一句,我在ARM上解决了这个堆栈跟踪问题使用在每个函数入口/出口处调用的[-finstrument-functions](http://gcc.activeventure.org/Code-Gen-Options.html)。当然有开销,但对我来说是可以接受的。 (并且有'no_instrument_function'属性需要最大呼叫速度......) – 2012-02-14 08:58:42