2015-12-28 56 views
0

我们正在研究STM32F103(ARM Cortex M3)芯片并使用uVersion(ARM-MDK编译器)编译我们的项目。发生崩溃时,我们保存了PC和LR寄存器。之后,我们希望通过编写某些脚本将保存在PC和LR寄存器中的地址映射到人类阅读的源代码行。我读了这个What are .axf files?,其中说axf包含这样的信息。但我不知道如何利用它。 非常感谢。如何将ARM Cortex M3 PC/LR地址映射到源代码行?

[更新1]
今天,我试图其中可以转储一些调试有用信息的fromelf.exe(fromelf.exe --text -g E:\ proj_keil \ keil_output \ test.axf) 例如:

008f5d: SPECIAL(0, 1) : 13 080043cc: ..\init\main.c:23.5 
008f5e: DW_LNS_negate_stmt : 06 
008f5f: SPECIAL(1, 2) : 1a 080043d0: ..\init\main.c:24.5 [ 

当我搜索了崩溃的个人电脑地址(0x080043d0),我可以找到其对应的源代码行,虽然我没有找到这崩溃的LR地址的源代码行。

那么我可以用fromelf.exe来解决我的问题吗?

+0

我不知道ARM-MDK,但gcc工具链有用于此目的的“addr2line”实用程序。你的工具链最有可能有类似的东西。 Addr2line需要调试信息的.elf文件。 .axf似乎与.elf一样的文件与调试.. – mkmk88

回答

1

调试器使用符号和调试信息。当前的代码位置和调用堆栈直接显示在调试器中。

如果你想验尸一个特定的地址,你可以启动调试器,在目标或模拟器中,并要求在上述地址进行反汇编。将显示反汇编和原始源代码(如果可用)。

如果您需要在没有调试信息的情况下进行验尸,可以使用地图文件中的信息手动确定最近的公共符号,然后使用.lst文件确定精确位置作为偏移量从链接地图位置。生成.map和.lst文件都是uVision中的项目选项。

+0

谢谢@Clifford,今天我尝试了fromelf.exe并更新了一些关于它的信息,我可以使用fromelf.exe吗? – bettermanlu

+0

不错的+1这 –

+0

只要目标代码文件实际包含调试信息,使用工具从目标代码提取调试符号将工作。这个映射文件是在构建时生成的,并且不管调试信息是否被编译,都会生成。由于调试器通常是调试代码的最简单方法,因此我很难看到这种方式很难实现。 – Clifford