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

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选项特别有用。您可以在编译器中打开列表,并告诉链接器生成映射文件。映射文件将为您提供发生问题的函数的绝

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

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

如何将PC地址转换为实际的源代码?换句话说,我怎样才能理解这条信息呢。转储可执行文件,然后搜索
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”,并记录在此处