2012-06-04 158 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