2012-06-04 161 views
3

我跟随此帖子打印堆栈跟踪How to generate a stacktrace when my gcc C++ app crashes。它在x86 linux中运行良好。任何人都可以教我如何使它在arm-linux上工作吗?在arm-linux中打印堆栈跟踪

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

[[email protected] /]# ./test1 
Error: signal 11: 
[0x0] 

在86

[email protected]:~/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

你可以发布ARM编译的gcc命令行吗?你无法尝试在ARM目标上运行x86二进制文件,对吗? –

回答

5

ARM不返回地址存储在堆栈上分支到子程序的时候,而是希望任何调用子程序的函数在调用其他函数之前都会将链接寄存器保存到它自己的栈帧中,因此不可能遵循栈帧hout调试信息。

+0

这并不意味着没有可用的有用信息。例如,当android为应用程序进程崩溃提供支持时,链接寄存器的当前值以及堆栈中最后一些值的转储可以为熟练的人类解释提供线索 - 您不知道所有这些值是地址,但调用堆栈返回地址应该在其中。如果这些值自动关联为可执行文件/库映射中的潜在地址及其中的任何可识别符号,则这更加有用。 –

+0

你能教你如何获得更多的调试信息吗?我的目标是调试分段故障。我不熟悉转储或链接寄存器。 – Mickey

+0

最好的方法是在运行程序时附加一个诸如gdb的调试器;通过这种方式,SIGSEGV被传递给调试器,程序被冻结在非法访问中。然后调试器可以查看错误指令并将其映射回源代码行,并在调试信息中的此处查找寄存器和堆栈使用情况,这足以生成堆栈跟踪。 –

4

我刚拿到backtrace()与GCC for ARM一起工作。我的关键是用-funwind-tables编译。否则堆栈深度总是1(即空)。

+0

你的意思是我编译我的程序时添加了一个funwind-tables的标志吗? – Mickey

+0

是的,编译时将-funwind-tables标志传递给gcc。 – jfritz42