我正在開發運行Linux的ARM9E處理器。有時候,我有以下消息應用程序崩潰:如何將PC(ARMv5)地址映射到源代碼?
[142.410000]對準陷阱:rtspserverd(996)PC = 0x4034f61c INSTR = 0xe591300c地址= 0x0000000d FSR 0×001
我怎麼能翻譯的PC地址到實際的源代碼?換句話說,我如何從這個信息中理解?
我正在開發運行Linux的ARM9E處理器。有時候,我有以下消息應用程序崩潰:如何將PC(ARMv5)地址映射到源代碼?
[142.410000]對準陷阱:rtspserverd(996)PC = 0x4034f61c INSTR = 0xe591300c地址= 0x0000000d FSR 0×001
我怎麼能翻譯的PC地址到實際的源代碼?換句話說,我如何從這個信息中理解?
With objdump。轉儲您的可執行文件,然後搜索4034f61c:
。 -x
,--disassemble
和-l
選項特別有用。
您可以在編譯器中打開清單並告訴鏈接器生成映射文件。地圖文件會給出絕對地址的含義,直到發生問題的函數爲止,而列表將幫助您確定函數中異常的確切位置。
例如在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
命令崩潰後查看堆棧轉儲。
我從x86 ubuntu交叉編譯爲arm,有什麼我應該注意的嗎? – Eric
您需要使用特定於arm的objdump。它應該有你的gcc工具鏈(假設你使用gcc)。 '--architecture ='和'-i'列出可用的體系結構。 –
nmichaels
或'addr2line -e 0x4034f61c'(需要調試信息)。 –
user786653