2012-02-10 91 views

回答

12

根据这个帖子< http://codingrelic.geekhold.com/2009/05/pre-mortem-backtracing.html>,

而且在一些架构上,包括我心爱的MIPS,只有__builtin_return_address(0)作品。 MIPS没有帧指针,因此难以走回堆栈。帧0可以直接使用返回地址寄存器。 如果ARM也没有帧指针,这将解释限制。

另请参阅http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

+6

在ARM上,返回地址在寄存器R14中传递,调用另一个函数时被调用者有责任保存它。所以即使使用帧指针,也不能保证返回地址曾经存储在堆栈中。 – 2012-02-10 16:16:48

+3

实际上,当返回地址被调用保存而不是通过调用指令保存在堆栈上时,通常不可能找到它。应该有一种使用dwarf2展开/调试数据的方式,但是这将需要'__builtin_return_address'来调用一个重磅的展开库调用,而不是一个简单的内置... – 2012-02-10 16:37:53

+1

顺便说一句,我在ARM上解决了这个堆栈跟踪问题使用在每个函数入口/出口处调用的[-finstrument-functions](http://gcc.activeventure.org/Code-Gen-Options.html)。当然有开销,但对我来说是可以接受的。 (并且有'no_instrument_function'属性需要最大呼叫速度......) – 2012-02-14 08:58:42

4

在ARM 上的回溯是难。目前Glibc backtrace函数确实有效,但您需要最新的编译器/ glibc,并且您需要使用-funwind-tables构建所有内容。没有调试信息,GDB也有问题。

+0

感谢提及 - 风风车桌!在我启用这个编译器标志之前,我在ARM上的回溯始终是深度1。使用GCC 4.3.2。 – jfritz42 2013-04-10 16:12:19