2011-09-07 75 views
3

我正在開發運行Linux的ARM9E處理器。有時候,我有以下消息應用程序崩潰:如何將PC(ARMv5)地址映射到源代碼?

[142.410000]對準陷阱:rtspserverd(996)PC = 0x4034f61c INSTR = 0xe591300c地址= 0x0000000d FSR 0×001

我怎麼能翻譯的PC地址到實際的源代碼?換句話說,我如何從這個信息中理解?

回答

4

With objdump。轉儲您的可執行文件,然後搜索4034f61c:-x--disassemble-l選項特別有用。

+0

我從x86 ubuntu交叉編譯爲arm,有什麼我應該注意的嗎? – Eric

+0

您需要使用特定於arm的objdump。它應該有你的gcc工具鏈(假設你使用gcc)。 '--architecture = '和'-i'列出可用的體系結構。 – nmichaels

+0

或'addr2line -e 0x4034f61c'(需要調試信息)。 – user786653

2

您可以在編譯器中打開清單並告訴鏈接器生成映射文件。地圖文件會給出絕對地址的含義,直到發生問題的函數爲止,而列表將幫助您確定函數中異常的確切位置。

例如在gcc你可以做

gcc -Wa,-a,-ad -c foo.c > foo.lst 

到文件foo.lst中產生的列表。

-Wa,將下列選項發送給彙編器(gas)。

-a告知gas在標準輸出上產生一個列表。

-ad告知gas省略調試指令,否則會增加大量混亂。

GNU鏈接器生成映射文件的選項是-M--print-map。如果您鏈接到gcc,則需要將選項傳遞給鏈接器,並帶有從-Wl,開始的選項,例如-Wl,-M

或者,您也可以在調試器中運行您的應用程序(例如gdb),並在bt命令崩潰後查看堆棧轉儲。

+0

我使用的是一個arm工具鏈,這些選項似乎沒有被識別 – Eric

+0

在其他編譯器中應該有類似的東西。 – starblue

+0

這應該與獨立於目標架構的GNU工具鏈協同工作。我剛剛檢查了'avr-gcc'(我想要生成這些文件作爲常規構建的一部分)。 – starblue

相關問題