【问题标题】:How to map PC (ARMv5) address to source code?如何将 PC (ARMv5) 地址映射到源代码?
【发布时间】:2011-11-12 11:03:22
【问题描述】:

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

[142.410000] 对齐陷阱:rtspserverd (996) PC=0x4034f61c 指令=0xe591300c 地址=0x0000000d FSR 0x001

如何将 PC 地址转换为实际的源代码?换句话说,我怎样才能理解这条消息?

【问题讨论】:

    标签: c++ c linux arm alignment


    【解决方案1】:

    objdump。转储您的可执行文件,然后搜索4034f61c:-x--disassemble-l 选项特别有用。

    【讨论】:

    • 我正在从 x86 ubuntu 交叉编译到 arm,有什么需要注意的吗?
    • 您需要使用特定于 arm 的 objdump。它应该与您的 gcc 工具链一起提供(假设您使用的是 gcc)。 --architecture=<arch>-i 列出可用的架构。
    • addr2line -e <file> 0x4034f61c(需要调试信息)。
    • 好的。事实上,我需要 grep 获取 e591300c 而不是 PC 指令和“grep -A 5 -B 5”输出
    • 好吧,我不认为 e591300c 值得关注,它是 ldr 指令,而不是它崩溃的地方。
    【解决方案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 命令查看堆栈转储。

    【讨论】:

    • 我使用的是 arm 工具链,这些选项似乎无法识别
    • 其他编译器应该也有类似的东西。
    • 这应该可以独立于目标架构与 GNU 工具链一起使用。我刚刚检查了avr-gcc(我想生成这些文件作为常规构建的一部分)。
    • 即使使用标准 gcc 我也会得到“无法识别的命令行选项 -Wa”
    • @Eric 你有没有在逗号前的“-Wa”之后加一个空格?选项是“-Wa”,并在此处记录 gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/…
    猜你喜欢
    • 2016-04-02
    • 1970-01-01
    • 2013-04-23
    • 2022-10-13
    • 2017-12-14
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多