我按照这篇文章打印了堆栈跟踪How to generate a stacktrace when my gcc C++ app crashes。它在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
答案 0 :(得分:5)
ARM在分支到子程序时不会将返回地址存储在堆栈上,而是希望任何调用子程序的函数在调用其他函数之前将链接寄存器保存到自己的堆栈帧中,因此它是没有调试信息就无法跟踪堆栈帧。
答案 1 :(得分:4)
我刚刚使用backtrace()与GCC for ARM合作。对我来说关键是使用-funwind-tables进行编译。否则,堆栈深度始终为1(即为空)。