3

我按照这篇文章打印堆栈跟踪如何在我的 gcc C++ 应用程序崩溃时生成堆栈跟踪。它在 x86 linux 中运行良好。谁能教我如何让它在 arm-linux 上工作?

我正在使用 arm-linux-gcc 4.4.3。

[root@FriendlyARM /]# ./test1
Error: signal 11:
[0x0]

在 x86 中

mickey@mickeyvm:~/Desktop/workspace/test/testCatchSeg/src$ ./test1
Error: signal 11:
./test1(_Z7handleri+0x19)[0x804876d]
[0xedd400]
./test1(_Z3bazv+0x10)[0x80487c2]
./test1(_Z3barv+0xb)[0x80487e1]
./test1(_Z3foov+0xb)[0x80487ee]
./test1(main+0x22)[0x8048812]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x84de37]
./test1[0x80486c1]

这就是我为 arm-linux 编译的方式

 arm-linux-g++ -g -rdynamic ./testCatchSeg.cpp -o testCatchSeg
4

2 回答 2

5

ARM 在跳转到子程序时不会将返回地址存储在堆栈中,而是希望任何调用子程序的函数在调用其他函数之前将链接寄存器保存到自己的堆栈帧中,因此不可能在没有调试信息的情况下跟踪堆栈帧。

于 2012-06-04T12:13:16.983 回答
4

我刚刚让 backtrace() 与 GCC for ARM 一起工作。对我来说,关键是使用 -funwind-tables 进行编译。否则堆栈深度始终为 1(即为空)。

于 2013-04-10T20:18:18.617 回答