我们正在研究STM32F103(ARM Cortex M3)芯片,并使用uVersion(ARM-MDK编译器)编译我们的项目。发生崩溃时,我们保存了PC和LR寄存器。之后,我们希望通过编写某些脚本将PC和LR寄存器中保存的地址映射到人类阅读的源代码行。我读了这个What are .axf files?,其中说axf包含这样的信息。但我不知道如何利用它。 非常感谢。
[更新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 [
当我搜索崩溃的PC地址(0x080043d0)时,我可以找到相应的源代码行,但我没有找到此地址的LR地址源代码行。
我可以使用 fromelf.exe 来解决我的问题吗?
答案 0 :(得分:1)
调试器使用符号和调试信息。当前代码位置和调用堆栈直接显示在调试器中。
如果要对特定地址进行事后验证,可以在目标或模拟器中启动调试器,并在该地址请求反汇编。将显示反汇编和原始源代码(如果可用)。
如果您需要在没有调试信息的情况下执行此验证,可以使用地图文件中的信息手动确定最近的公共符号,然后使用.lst文件确定精确位置作为偏移量链接地图位置。生成.map和.lst文件是uVision中的项目选项。