我正在开发运行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