【发布时间】:2011-11-12 11:03:22
【问题描述】:
我正在运行 Linux 的 ARM9E 处理器上进行开发。有时我的应用程序崩溃并显示以下消息:
[142.410000] 对齐陷阱:rtspserverd (996) PC=0x4034f61c 指令=0xe591300c 地址=0x0000000d FSR 0x001
如何将 PC 地址转换为实际的源代码?换句话说,我怎样才能理解这条消息?
【问题讨论】:
我正在运行 Linux 的 ARM9E 处理器上进行开发。有时我的应用程序崩溃并显示以下消息:
[142.410000] 对齐陷阱:rtspserverd (996) PC=0x4034f61c 指令=0xe591300c 地址=0x0000000d FSR 0x001
如何将 PC 地址转换为实际的源代码?换句话说,我怎样才能理解这条消息?
【问题讨论】:
objdump。转储您的可执行文件,然后搜索4034f61c:。
-x、--disassemble 和 -l 选项特别有用。
【讨论】:
--architecture=<arch> 和 -i 列出可用的架构。
addr2line -e <file> 0x4034f61c(需要调试信息)。
您可以在编译器中打开列表并告诉链接器生成一个映射文件。映射文件将为您提供直到发生问题的函数的绝对地址的含义,而列表将帮助您查明异常在函数中的确切位置。
例如在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 命令查看堆栈转储。
【讨论】:
avr-gcc(我想生成这些文件作为常规构建的一部分)。