【问题标题】:How to map ARM Cortex M3 PC/LR address to source line?如何将 ARM Cortex M3 PC/LR 地址映射到源代码行?
【发布时间】:2016-04-02 02:07:52
【问题描述】:

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

[更新 1]
今天试了一下fromelf.exe,它可以dump一些调试有用的信息(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 [

当我搜索崩溃的PC地址(0x080043d0)时,我可以找到它对应的源行,虽然我没有找到这次崩溃的LR地址的源行。

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

【问题讨论】:

  • 我不了解 ARM-MDK,但 gcc 工具链具有用于此目的的“addr2line”实用程序。你的工具链很可能有类似的东西。 Addr2line 需要带有调试信息的 .elf 文件。 .axf 似乎与带有调试的 .elf 文件相同。

标签: arm embedded stm32 keil cortex-m


【解决方案1】:

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

如果您想对特定地址进行事后分析,您可以在目标或模拟器中启动调试器,并在该地址请求反汇编。将显示反汇编和原始源代码(如果有)。

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

【讨论】:

  • 谢谢@Clifford,今天我试用了fromelf.exe并更新了一些信息,我可以用fromelf.exe代替吗?
  • 只要目标代码文件实际包含调试信息,就可以使用工具从目标代码中提取调试符号。映射文件是在构建时生成的,并且无论是否编译了调试信息都会生成。由于调试器在任何情况下通常都是调试代码的最简单方法,所以我看不出这样做有什么好处这是艰难的方式。
  • 谢谢克利福德。我们希望通过脚本自动进行一些数据分析工作,例如根据源代码对故障类别进行分类,因此使用某些自动化工具比调试器 IDE 更可取。
猜你喜欢
  • 2011-11-12
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 2011-10-01
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
相关资源
最近更新 更多