【按语】:如果需要调试OPTEE,那么在远程调试配置中使用GDB可能会很有用。远程调试意味着GDB在您的PC上运行,它可以访问源代码,而被调试的程序在远程系统上运行(在本例中,在QEMU环境的OPTEE中)。本博客来探讨OPTEE的GDB调试技术实战。
要调试使用GDB运行QEMU的TEE内核,需要禁用TEE ASLR(CFG_CORE_ASLR=n)。此外,请注意,如果禁用了优化,则更容易进行调试。除此之外,你还将拥有4个控制台。
• Qemu console
• NW UART console
• SW UART console
• GDB console
除了GDB控制台之外,它们都是在使用QEMU运行OP-TEE时通常会看到/使用的控制台。
1、首先是修改代码中CFG_CORE_ASLR=n,然后编译optee_os,QEMU中相关操作详见optee4.0.0 qemu_v8环境搭建(支持Hafnium),之后启动QEMU,即:make run-only
2、接下来为GDB启动另一个控制台并执行以下操作:
aarch64-linux-gnu-gdb -q
或者gdb-multiarch -q
3、在GDB控制台中连接到QEMU GDB服务器,如下所示(包含的输出显示了您通常会看到的内容)。
4、仍然在GDB控制台中,加载TEE core的符号表文件
5、现在可以为OP-TEE中的任何符号设置断点
6、最后一步是启动引导,也是从GDB控制台启动
此时将在正常世界控制台和安全世界UART控制台中看到UART输出。例如,如果你现在运行optee_example_hello_world,那么你很快就会遇到我们之前设置的断点,你会在GDB控制台中看到这样的内容:
Normal_world命令执行后,第一个断点生效:
从这里你可以开始使用GDB,单步,读取内存,读取寄存器,打印变量和所有你通常用调试器做的事情。
继续c,第二个断点生效
Normal_world:
Secure_world:
【提示】:有些人发现在调试时查看源代码更容易。您可以启用“TUI模式”以查看GDB中的源代码。要启用该功能,请运行以下命令:
aarch64-linux-gnu-gdb -q -tui
或者gdb-multiarch -q -tui
带有tui功能的调试界面如下,可以看到源码信息:
【结语】:使用本博客中的方法,让你轻松掌握QEMU环境OPTEE的GDB调试技术实战,其他环境使用GDB类似。
OPTEE的其他调试技术参见:OPTEE调试技术汇总