如何将PC(ARMv5)地址映射到源代码?

我正在开发运行Linux的ARM9E处理器。 有时我的应用程序崩溃与以下消息:

[142.410000]alignment陷阱:rtspserverd(996)PC = 0x4034f61c Instr = 0xe591300c地址= 0x0000000d FSR 0x001

如何将PC地址转换为实际的源代码? 换句话说,我怎么能从这个信息中理解呢?

用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命令查看堆栈转储。