我有一个在 R7FA4M2 控制器上运行的 C++ ARM TrustZone 项目,应该使用 embOS-MPU RTOS。当我尝试调试该项目时,一旦代码从安全项目跳转到非安全项目,调试器就找不到源文件。
启动调试器后,可以正确找到代码。我看到地址 000010b0
处的
SystemInit();
处命中了一个断点
void Reset_Handler (void)
{
/* Initialize system using BSP. */
-> 000010b0 SystemInit();
MCU 状态也在 SSD.Secure 中,因此程序应在安全项目中启动。我可以单步执行代码,直到程序跳转到非安全重置处理程序。
/* Jump to the NS Reset_Handler */
-> 00000f54 p_ns_reset();
此后,未正确找到源文件,并且编辑器窗口中显示消息 No source available for "Reset_Handler() at 0x8984。
当我现在切换到反汇编视图并在“指令步骤模式”中单步执行代码时,仍然可以进行调试,并且不知何故,反汇编视图也知道名称
Reset_Handler
。
Reset_Handler:
-> 00008984: push {r3, lr}
00008986: bl 0x8990 <SystemInit>
0000898a: bl 0x83f0 <main>
0000898e: b.n 0x898e <Reset_Handler+10>
看起来代码运行正确,并且还跳转到非安全项目(从地址00008000开始)。
非安全项目包含 embOS-MPU 库
libosT8MLVHLDP_TZ.a
并且该项目正在编译一些最小配置,没有错误。没有实现任务或其他 embOS 功能。当我从项目中删除这个库时,调试器正常工作,并且还能够找到非安全项目中的文件。这意味着:空的裸机 ARM TrustZone 项目是可调试的。
-T "C:\\Workspace\\project\\fsp.ld" -Xlinker --gc-sections -L "C:\\Workspace\\project/script" -Wl,-Map,"host_sw_ns.map" --specs=nano.specs --specs=rdimon.specs secure.o "C:\Workspace\project\embos_mpu\Lib\libosT8MLVHLDP_TZ.a"
每个项目
host_sw_s.elf
和host_sw_ns.elf
都有一个.elf文件。安全项目host_sw_s.elf
的.elf文件可以在Project Explorer中展开:
无法展开
sw_ns.elf
在没有 embOS 库的情况下构建时,功能是可见的。
当调试器已经运行时,我尝试再次加载符号。调试器控制台看起来像这样
add-symbol-file "C://Workspace//project//Debug//host_sw_ns.elf" 0x8000
add symbol table from file "C://Workspace//Gilgen//project//Debug//host_sw_ns.elf" at
.text_addr = 0x8000
(y or n) [answered Y; input not from terminal]
Reading symbols from C://Workspace//project//Debug//host_sw_ns.elf...(no debugging symbols found)...done.
Dwarf Error: wrong version in compilation unit header (is 5, should be 2, 3, or 4) [in module C:\Workspace\project\Debug\host_sw_ns.elf]
即使在设置中定义了 Dwarf 4,.elf 文件中似乎也定义了 Dwarf 5。
我正在使用 Renesas e2-studio v4.4.0 和 gdb 调试器中的构建。在调试器启动时,显示正在使用旧版本的 gdb
GNU gdb (GDB) 7.8.2-20221107-Build_1
gdb v10.1 以上支持 Dwarf 5,这应该会导致 Dwarf 错误消息。
我的假设是 embOS 库是使用 Dwarf 5 调试信息构建的,当链接器完成其工作时,.elf 文件中定义了 Dwarf 5 的某个位置,而旧的 gdb 不理解这个符号。
还有 embOS 库的发布版本
libosT8MLVHLR_TZ.a
。也许发布版本库不包含任何调试信息,因此 dwarf 5 未定义。
→ 同样的错误
系统上有一个与 Cygwin 一起安装的 gdb v12.1 调试器。在调试器设置中,我已将调试器更改为特定路径。 gdb 无法启动并出现以下错误消息: 无法使用命令确定 GDB 版本:gdb --version。 当在 e2 studio 中打开本地控制台时,命令正在运行
C:\Renesas\RA\e2studio_v2023-04_fsp_v4.4.0\eclipse>gdb --version
GNU gdb (GDB) (Cagwin 12.1-1) 12.1
我没有进一步解决此解决方案。
我还没找到方法。这可能吗?
问题是,embOS-MPU 库是使用 GCC V11.2 构建的,其中包含 Dwarf-5 调试信息。 e2-Studio v4.4 中集成的 gdb 调试器 v7.8 不支持 Dwarf-5。
我通过集成 embOS 的源文件而不是预编译的库文件解决了调试问题。通过此解决方案,e2-Studio 的集成 GCC 和 gdb 调试器可以与 Dwarf-4 调试信息一起使用。