在 Renesas e2 Studio 和 embOS 库中调试 ARM TrustZone 项目时,没有可用的“Reset_Handler() at 0x8984”源代码

问题描述 投票:0回答:1

总结

我有一个在 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 的项目

非安全项目包含 embOS-MPU 库

libosT8MLVHLDP_TZ.a
并且该项目正在编译一些最小配置,没有错误。没有实现任务或其他 embOS 功能。当我从项目中删除这个库时,调试器正常工作,并且还能够找到非安全项目中的文件。这意味着:空的裸机 ARM TrustZone 项目是可调试的。

我检查过的内容

  • 编译器调试级别:默认(-g)
  • 调试格式:dwart-4
  • 使用不同的优化级别进行调试(-Og、-O0、-O2)
  • 链接器命令:
    -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"

.elf 文件

每个项目

host_sw_s.elf
host_sw_ns.elf
都有一个.elf文件。安全项目
host_sw_s.elf
的.elf文件可以在Project Explorer中展开:

host_sw_s Binaries

无法展开

sw_ns.elf

host_sw_ns Binaries

在没有 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。

检查gdb版本

我正在使用 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 不理解这个符号。

不成功的尝试

使用 Release embOS 库进行调试

还有 embOS 库的发布版本

libosT8MLVHLR_TZ.a
。也许发布版本库不包含任何调试信息,因此 dwarf 5 未定义。 → 同样的错误

运行外部 gdb 调试器

系统上有一个与 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

我没有进一步解决此解决方案。

尝试更新内部 e2-studio gdb 调试器

我还没找到方法。这可能吗?

gdb dwarf trust-zone embos
1个回答
0
投票

问题是,embOS-MPU 库是使用 GCC V11.2 构建的,其中包含 Dwarf-5 调试信息。 e2-Studio v4.4 中集成的 gdb 调试器 v7.8 不支持 Dwarf-5。

我通过集成 embOS 的源文件而不是预编译的库文件解决了调试问题。通过此解决方案,e2-Studio 的集成 GCC 和 gdb 调试器可以与 Dwarf-4 调试信息一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.