C++ 如何将PC(ARMv5)地址映射到源代码?
我正在运行Linux的ARM9E处理器上开发。有时我的应用程序会崩溃,并显示以下消息: [142.410000]对齐陷阱:rtspserverd(996)PC=0x4034f61c Instr=0xe591300c地址=0x0000000d FSR 0x001 如何将PC地址转换为实际的源代码?换句话说,我怎样才能理解这条信息呢。转储可执行文件,然后搜索C++ 如何将PC(ARMv5)地址映射到源代码?,c++,c,linux,arm,alignment,C++,C,Linux,Arm,Alignment,我正在运行Linux的ARM9E处理器上开发。有时我的应用程序会崩溃,并显示以下消息: [142.410000]对齐陷阱:rtspserverd(996)PC=0x4034f61c Instr=0xe591300c地址=0x0000000d FSR 0x001 如何将PC地址转换为实际的源代码?换句话说,我怎样才能理解这条信息呢。转储可执行文件,然后搜索4034f61c:。 -x、-反汇编和-l选项特别有用。您可以在编译器中打开列表,并告诉链接器生成映射文件。映射文件将为您提供发生问题的函数的绝
4034f61c:
。
-x
、-反汇编
和-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
命令查看崩溃后的堆栈转储。我正在从x86 ubuntu交叉编译到arm,有什么需要注意的吗?您需要使用arm特定的objdump。它应该与您的gcc工具链一起提供(假设您使用的是gcc)<代码>--architecture=和-i
列出可用的体系结构。或添加r2line-e 0x4034f61c
(需要调试信息)。正常工作。事实上,我需要对e591300c进行grep,而不是PC指令和“grep-A 5-B 5”输出程序进行grep,我认为e591300c不是应该注意的,这是ldr指令,而不是它崩溃的地方。我使用的是arm工具链,这些选项似乎没有被识别。在其他编译器中应该有类似的东西。这应该独立于目标体系结构使用GNU工具链。我刚刚检查了avr gcc
(我想作为常规构建的一部分生成这些文件)。即使使用标准gcc,我也会得到“Unrecognized command line option-Wa”@Eric您在逗号前的“-Wa”后面添加了空格吗?选项为“-Wa”,并记录在此处