blob: 7425428f7fa482023e54d6458e6e2990a672b5a2 [file] [view]
---
permalink: /trustzone-sdk-docs/debugging-optee-ta.md
---
# Debugging OP-TEE TA
When developing applications, it is inevitable that there will be a need for
debugging. This tutorial introduces how to configure the debug environment in
OP-TEE enabled QEMU environment. You may also check
[OP-TEE documentation](https://optee.readthedocs.io/en/latest/building/devices/qemu.html)
for more information about running QEMU for Arm v8.
To debug TEE core running QEMU with GDB, it is necessary to disable TEE ASLR with
`CFG_CORE_ASLR ?= n` in `OP-TEE/optee_os/mk/config.mk`. Note that you need to
recompile QEMU with `make run` again. You can also choose to add the compilation
information directly at compile time.
```sh
$ make run CFG_CORE_ASLR=n
```
Since we will debug the TA remotely with a `gdb` server, please also add the
`GDBSERVER=y` flag when compiling QEMU.
To debug a TA, you need to first start a gdb on the host machine. Then run
`target remote :1234` to connect to the remote QEMU GDB server.
```sh
$ ./path/to/qemu-v8-project/out-br/host/bin/aarch64-buildroot-linux-gnu-gdb
(gdb) target remote :1234
Remote debugging using :1234
warning: No executable has been specified and target does not support
determining executable automatically. Try using the "file" command.
0xffffb30b00ea12b4 in ?? ()
```
Next, in the GDB console, load the symbol table of the TEE core library.
```sh
(gdb) symbol-file /path/to/qemu-v8-project/optee_os/out/arm/core/tee.elf
```
Taking `hello_world-rs` as an example, you can get the start address of the text
section from the log in the secure world console, which is 0x40014000.
```sh
D/LD: ldelf:168 ELF (133af0ca-bdab-11eb-9130-43bf7873bf67) at 0x40014000
```
Then, you can load symbols from TA file (in debug build) to the address.
```sh
(gdb) add-symbol-file /path/to/examples/hello_world-rs/ta/target/aarch64-unknown-optee-trustzone/debug/ta 0x40014000
```
Now, you can add breakpoints according to your own needs in the corresponding
functions or addresses.
```sh
(gdb) b invoke_command
Breakpoint 2 at 0xe11bb08: invoke_command. (6 locations)
```
Last, initiate the boot. You can execute `hello_world-rs` in the normal world
console, and will see that the breakpoint we set was hit.
```sh
(gdb) c
Continuing.
[Switching to Thread 1.2]
Thread 2 hit Breakpoint 2, ta::invoke_command (cmd_id=0, params=0x4010ff00) at src/main.rs:50
50 trace_println!("[+] TA invoke command");
```