我正在开发运行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
命令查看堆栈转储。