2011-09-07 44 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

相关问题