> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs-staging.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 调试 Qualcomm TEE 和安全设备

<Warning>
  当前版本未启用 TEE 日志。
</Warning>

调试提供了一系列常见的日志记录和调试技术,用于排查 Qualcomm TEE、受信任和客户端应用程序以及安全设备中的问题。

**重要**

在 SELinux Permissive 模式下运行所有 SSH 命令。将来会支持 Enforcing 模式。有关如何连接到设备的说明,请参阅 [Qualcomm Linux 构建指南](https://docs.qualcomm.com/bundle/publicresource/topics/80-80021-254/how_to.html#use-ssh)。

## **调试 Qualcomm TEE**

Qualcomm TEE 内核日志(也称为 TrustZone 诊断日志)可用于调试 Qualcomm TEE 中发生的错误。

TrustZone 诊断日志可在 Linux 内核驱动程序中获取,该驱动程序会重定向日志。

1. 使用 SSH 以 root 身份连接到设备。
2. 使用以下命令捕获 TrustZone 日志:
   ```text theme={null}
   cat /proc/tzdbg/log > tzbsp_log.txt
   ```

`tzbsp_log.txt` 中的错误代码以十六进制编码。您可以运行以下工具将 `tzbsp_log.txt` 从十六进制解码为字符串。

1. 转到 `<TZ.XF.X.X path>/trustzone_images/ssg/bsp/tz/build/tz/A53_64/<BuildFlavor>`
2. 使用 python 3 运行以下命令。
   ```text theme={null}
   python3 print_tz_log.py -l tzbsp_log.txt -e errorCodesDict.txt -t <TZ.XF.X.X path> -o tzbsp_log_decode.txt
   ```
   例如:
   ```text theme={null}
   python3 print_tz_log.py -l tzbsp_log.txt -e errorCodesDict.txt -t //crmhyd/nsid-hyd-05/TZ.XF.5.0-07927-KODIAKAAAAANAAZT-1 -o tzbsp_log_decode.txt
   ```

对于设备日志收集,TrustZone 诊断日志缓冲区是 RAM 转储的一部分,可以使用崩溃转储解析工具中来自 TZ.XF 软件的 `qsee.elf` 进行解析。对于离线或非设备日志收集,TrustZone 诊断日志缓冲区是 RAM 转储的一部分,可以使用崩溃转储解析工具中来自 TZ.XF 软件的 `qsee.elf` `(trustzone\_images/ssg/bsp/qsee/build/\${tz\_bid:EACAANAA})` 进行解析。

### **使用安全崩溃转储进行调试**

您可以使用 RAM 转储调试 Qualcomm TEE。Qualcomm TEE 的执行区域转储是通过安全崩溃转储收集的。

触发第 2 阶段 sec.elf 熔丝的设备称为启用了安全启动的设备。要在这些设备上进行调试,请参阅 [SecTools v2:安全调试用户指南](https://docs.qualcomm.com/bundle/80-NM248-23/resource/80-NM248-23_REV_AA_SecTools_v2__Secure_Debug_User_Guide.pdf)。

**注意**

*SecTools* 指南仅对具有授权访问权限的许可开发者开放。

## **调试受信任和客户端应用程序**

受信任的应用程序日志(也称为 Qualcomm TEE 日志)用于调试受信任应用程序中的错误。要调试客户端应用程序中的错误,使用内核和 journalctl 日志。

对于在线或设备端日志收集,Linux 在运行时收集 Qualcomm TEE/内核日志。您可以使用 SSH 连接到设备并使用以下命令:

* 从 Linux 收集 Qualcomm TEE 日志:
  ```text theme={null}
  cat /proc/tzdbg/qsee_log > qsee_log.txt
  ```
* 对于客户端应用程序,收集内核和 logcat 日志:
  ```text theme={null}
  cat /dev/kmsg > kernel_log.txt
  journalctl > journalctl.txt
  ```
* 对于离线或非设备日志收集,Qualcomm TEE 日志与内核和 journalctl 日志一起可在 RAM 转储中获取。

## **在安全设备上调试**

作为安全启动过程的一部分,熔断调试禁用熔丝将禁用设备上的调试功能。这包括子系统上的 RAM 转储、INV 和 NINV 调试。

调试策略功能允许控制启用了安全启动的设备的调试能力。

调试策略镜像允许在商用安全设备上使用 JTAG 重新启用(INV 调试)、RAM 转储和 TrustZone 日志记录(NINV 调试)等调试功能。

出于安全原因,设备的序列号控制着安全 RAM 转储、Qualcomm TEE 日志和 JTAG 的调试策略。

在 Qualcomm TEE 子系统上启用 JTAG 会禁用有关硬件密钥生成的设备安全性。因此,现有的安全存储(如用户数据、SFS 和 RPMB)将无法访问。有时,设备可能会提示进行出厂数据重置。使用以下命令在安全设备上进行调试:

```text theme={null}
<meta>/common/sectoolsv2/ext/linux/sectools secure-debug --security-profile <meta>/common/sectoolsv2/<chipset>_security_profile.xml --generate --outfile apdp_out.mbn --all-flags --sign --signing-mode LOCAL --oem-id=0x1 --root-certificate=./RSA-OEM-KEYS/qpsa_rootca.cer  --ca-certificate=./RSA-OEM-KEYS/qpsa_attestca.cer --ca-key=./RSA-OEM-KEYS/qpsa_attestca.key --oem-product-id=0xabcd --serial-number=0xabcdabcd
```

确保正确配置 OEM\_ID、PRODUCT\_ID、序列号和密钥以及证书路径。

有关更多信息,请参阅 [SecTools v2:安全调试用户指南](https://docs.qualcomm.com/bundle/80-NM248-23/resource/80-NM248-23_REV_AA_SecTools_v2__Secure_Debug_User_Guide.pdf)。

**注意**

*SecTools* 指南仅对具有授权访问权限的许可开发者开放。

## **在设备上刷写 APDP**

要在设备上刷写 APDP,请运行以下命令:

```text theme={null}
fastboot flash apdp_a <path to apdp.mbn>
```

**表:用于转储收集的调试策略标志**

|  **阶段** |                       **完整转储**                      |            **小型转储**            |                                                                                                                                                |         |
| :-----: | :-------------------------------------------------: | :----------------------------: | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|    阶段   | Applications (DCC 和 scan dump) aDSP/Video/RPM/ SLPI | Modem/Qualcomm TEE/Secure dump | TZDiag                                                                                                                                         | –       |
|   非安全   |                       不需要调试策略                       |             不需要调试策略            | 不需要调试策略                                                                                                                                        | 不需要调试策略 |
| 阶段 1 安全 |                     不需要 APDP 镜像                     |           不需要 APDP 镜像          |                                                                                                                                                |         |
| 阶段 2 安全 |              `--nonsecure-crash-dumps`              |  使用设备序列号的 –offline-crash dumps | QCS6490/QCS5430:使用设备序列号的 "–logs" QCS9075:使用设备序列号的 "–tz-diag-logs" 或使用 `--nonsecure-crash-dumps` 的加密 TZDiag + devcfg 中的 TZDiag 加密公钥/指数可在以下位置配置: |         |

> `/trustzone_images/ssg/securemsm/trustzone /qsee/mink/oem/config<chipset>/oem_config.xml`

| <ul><li>Apps minidump:`--apps-encrypted-mini-dumps`</li><li>Modem 和 WLAN:\* `--mpss-encrypted-mini-dumps` \* `--wlan-encrypted-mini-dumps`</li><li>aDSP minidump:`--adsp-encrypted-mini-dumps`</li><li>cDSP minidump:`--cdsp-encrypted-mini-dumps`</li></ul> |
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

请参阅 KBA-191202045020-1 (ZIP)。有关更多信息,请参阅 [MiniDump 软件用户指南](https://docs.qualcomm.com/bundle/80-P8754-71/resource/80-P8754-71_REV_H_MiniDump_Software_User_Guide.pdf)。

**注意**

*SecTools* 和 *MiniDump* 指南仅对具有授权访问权限的许可用户开放。

## **在安全设备上收集 Qualcomm TEE/TrustZone 诊断日志**

在安全设备上,默认情况下禁用从 Linux 收集的 Qualcomm TEE/TrustZone 日志。Qualcomm 提供了用于日志记录的加密日志功能。请按照以下步骤启用此功能:

1. 使用以下命令生成用于加密的 RSA 密钥:
   ```text theme={null}
   openssl genrsa -out rsa_key 2048
   ```
2. 使用以下命令显示 RSA 密钥信息和模数:
   ```text theme={null}
   openssl rsa -in rsa_key -text
   openssl rsa -in rsa_key -modulus
   Private-key: (2048 bit)
   modulus: 00:a0:48:99:99:83:26:65:57:fc:75:52:25:45:53:
   92:fc:27:29:cb:14:35:94:7c:89:bc:d4:0a:c6:3d:
   0d:6d:8a:7d:72:1d:e3:4f:f0:32:66:41:a9:f6:c1:
   2f:79:aa:58:ea:57:3b:29:6d:cf:40:33:4e:ad:ec:
   bf:78:44:4b:28:52:c8:e3:6e:77:01:e5:a3:c6:25:
   65:8c:8b:cc:32:20:2d:29:58:03:f0:d5:b7:f4:c0:
   d6:09:b2:8e:59:c1:3c:ac:e5:61:04:36:78:e3:da:
   95:b3:e3:b7:71:90:50:ee:a9:70:5a:15:1a:af:d9:
   a5:4f:c2:70:f1:f8:f1:67:d1:78:0e:b8:95:6e:93:
   73:6a:23:f1:31:e1:e2:49:ff:18:54:a3:73:d0:70:
   91:de:7a:92:53:11:aa:cb:b0:f9:d0:e1:83:9f:74:
   67:bc:1a:89:6d:b1:d2:de:4f:ab:3c:1c:63:c9:bc:
   75:f0:c0:80:fc:db:73:d1:8a:e3:f4:60:57:dd:66:
   f1:3a:fa:18:ed:7f:47:72:3e:49:50:94:8e:19:ae:
   6b:69:62:3d:74:ca:44:fb:d4:1c:1d:59:43:30:31:
   0d:fb:ab:70:44:9d:d9:d0:ce:cb:43:f3:2a:98:a4:
   83:e7:76:ae:a8:b8:ea:63:64:e1:11:1b:99:92:b3: 9b:3f
   publicExponent: 65537 (0x10001)
   ```
   **注意**
   模数用于 `oem_config.xml` 文件中的 `pub_mod`。`pub_exp` 指数通常为 65537。0x10001 称为 `publicExponent`。
3. 在 `trustzone_images/ssg/securemsm/trustzone/qsee/mink/oem/config/<chipset>/ oem_config.xml` 文件中设置 RSA 公钥(指数和模数)。
   通过将以下几行添加到 `oem_config.xml` 文件来启用此功能:
   ```text theme={null}
   <driver name="NULL">
   <global_def>
   <var_seq name="pub_mod" type=DALPROP_DATA_TYPE_STRING>
   a048999983266557fc755225455392fc2729cb1435947c89bcd40ac63d0d6d
   8a7d721de34ff0326641a9f6c12f79aa58ea573b296dcf40334eadecbf7844
   4b2852c8e36e7701e5a3c625658c8bcc32202d295803f0d5b7f4c0d609b28e
   59c13cace561043678e3da95b3e3b7719050eea9705a151aafd9a54fc270f1
   f8f167d1780eb8956e93736a23f131e1e249ff1854a373d07091de7a925311
   aacbb0f9d0e1839f7467bc1a896db1d2de4fab3c1c63c9bc75f0c080fcdb73
   d18ae3f46057dd66f13afa18ed7f47723e4950948e19ae6b69623d74ca44fb
   d41c1d594330310dfbab70449dd9d0cecb43f32a98a483e776aea8b8ea6364e1111b9992b39b3f
   </var_seq>
   <var_seq name="pub_exp" type=DALPROP_DATA_TYPE_STRING>
   000000000000000000000000000000000000000000000000000000000000000
   000000000000000000000000000000000000000000000000000000000000000
   000000000000000000000000000000000000000000000000000000000000000
   000000000000000000000000000000000000000000000000000000000000010001
   </var_seq>
   </global_def>
   ```
   **注意**
   更新 `oem_config.xml` 文件中的公钥时,请确保没有由 Notepad 或 Wordpad 编辑器插入的换行符、制表符或空格。
4. 通过 `trustzone_images/ssg/securemsm/trustzone/qsee/mink/oem/config/<chipset>/oem_config.xml` 文件中的以下命令启用加密功能配置标志:
   ```text theme={null}
   < props name="OEM_log_encr_enable" type=DALPROP_ATTR_TYPE_UINT32>
   1
   </props>
   ```
5. 要构建 TrustZone devcfg 镜像,请输入 OEM\_ID 字段值并签名 `devcfg.mbn` 镜像。
6. 使用以下命令刷写已签名的 `devcfg.mbn` 镜像:
   ```text theme={null}
   fastboot flash devcfg_a devcfg.mbn
   ```

**注意**

对 QCS6490 使用 `devcfg.mbn`,对 QCS9100 使用 `devcfg_iot.mbn`。

7. 使用以下命令收集 Qualcomm TEE/TrustZone 日志:
   ```text theme={null}
   cat /proc/tzdbg/qsee_log > qsee_log.txt
   cat /proc/tzdbg/log > tz_log.txt
   ```

## **Qualcomm TEE/TrustZone 诊断日志解密步骤**

1. 从 KBA-200917004544-1 (ZIP) 下载 Python 解密工具 `decrypt_tzdiag_qsee_log_tools.py`。
2. 要安装,请运行以下命令:
   ```text theme={null}
   Python Version 3.x
   pip install pycryptodome
   pip install cryptography
   ```
3. 要解密,请运行以下命令:
   ```text theme={null}
   python decrypt_tzdiag_qsee_log_tools.py -pk <RSA private key file> -a RSA -I <input encrypted qsee/tz diag log collected from device> -o <decrypted qsee/tzdiag log filename>
   ```
4. 解密成功后:
   1. 将 Qualcomm TEE 日志的纯文本导航到可读字符串格式。
   2. 使用以下命令将十六进制编码的错误代码转换为字符串:
      ```text theme={null}
      print_tz_log.py
      ```

## **后续步骤**

* 要了解如何开发和运行受信任和客户端应用程序,请参阅 [开发受信任和客户端应用程序](/zh/System/Security/develop-trusted-and-client-applications)。
* 要配置 Qualcomm TEE 以保护处理敏感数据和运行受信任应用程序的设备,请参阅 [配置安全服务](/zh/System/Security/configure)。
* 要自定义内存和 SEPolicy,请参阅 [自定义安全服务](/zh/System/Security/customize-security-services)。
