# 调试

Source: [https://docs.qualcomm.com/doc/80-70015-11SC/topic/debug.html](https://docs.qualcomm.com/doc/80-70015-11SC/topic/debug.html)

调试提供了一组常用的日志和调试技术，用于对 Qualcomm TEE、受信任应用程序和客户端应用程序以及安全设备中的问题进行故障排除。

Note: 在 SELinux Permissive 模式下运行所有 SSH 命令。未来将支持 Enforcing 模式。有关如何连接到设备的说明，参见 [Qualcomm Linux 编译指南 ➝ 操作方法 ➝ 使用 SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-254/how_to.html#use-ssh)。

## 调试 Qualcomm TEE

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

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

1. 通过 SSH 以根用户的身份连接到设备。
2. 使用以下命令捕获 TrustZone 日志：

        cat /proc/tzdbg/log > tzbsp_log.txtCopy to clipboard

`tzbsp_log.txt` 中的错误代码以十六进制编码。可以运行以下工具将 tzbsp\_log.txt从十六进制解码为字符串。
1. 进入 &lt;TZ.XF.X.X
                            path&gt;/trustzone\_images/ssg/bsp/tz/build/tz/A53\_64/&lt;BuildFlavor&gt;
2. 使用 python 3 运行以下命令。

        python3 print_tz_log.py -l tzbsp_log.txt -e errorCodesDict.txt -t <TZ.XF.X.X path> -o tzbsp_log_decode.txtCopy to clipboard

    例如：

        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.txtCopy to clipboard

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

**使用安全 crash dump 进行调试**

您可以使用 RAM dump 调试 QualcommTEE。Qualcomm TEE 的执行区域 dump 是通过安全 crash dump 收集的。

使用阶段 2 sec.elf 触发熔丝的设备称为启用了安全启动的设备。要在这些设备上进行调试，参见 [Sectools v2: Secure Debug User Guide](https://docs.qualcomm.com/bundle/80-NM248-23/resource/80-NM248-23_REV_AA_Sectools_v2__Secure_Debug_User_Guide.pdf)。

## 调试 TA 和 CA

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

对于在线或设备上的日志收集，Linux 在运行时收集 Qualcomm TEE/内核日志。您可以通过 SSH 连接到设备并使用以下命令：
- 要从 Linux 收集 Qualcomm TEE 日志，执行以下操作：

        cat /proc/tzdbg/qsee_log > qsee_log.txtCopy to clipboard
- 对于客户端应用程序，要收集内核和 logcat 日志，执行以下操作：

        cat /dev/kmsg > kernel_log.txt
        journalctl > journalctl.txtCopy to clipboard
- 对于离线或设备外日志收集，Qualcomm TEE 日志与内核和 journalctl 日志一起在 RAM dump 中提供。

## 在安全设备上调试

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

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

调试策略镜像支持调试功能，例如商业安全设备上的 JTAG 重新启用（INV 调试）、RAM dump 和 TrustZone 日志（NINV 调试）。

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

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

    <meta>/common/sectoolsv2/ext/<platform>/sectools.exe 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=0xabcdabcdCopy to clipboard

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

更多信息，参见 [Sectools v2：Secure Debug User Guide](https://docs.qualcomm.com/bundle/80-NM248-23/resource/80-NM248-23_REV_AA_Sectools_v2__Secure_Debug_User_Guide.pdf)。

**在设备上刷写 APDP**

要在设备上刷写 APDP，运行以下命令：

    Fastboot flash apdp <path to apdp.mbn>Copy to clipboard

| 阶段 | 完全转储 | 完全转储 | 完全转储 | 迷你转储 |
| --- | --- | --- | --- | --- |
| 阶段 | 应用（DCC 和扫描 dump）<br><br><br>                                <br>aDSP/Video/RPM/ SLPI | Modem/Qualcomm TEE/安全 dump | TZDiag | – |
| 非安全 | 无需调试策略 | 无需调试策略 | 无需调试策略 | 无需调试策略 |
| 安全阶段 1 | 无需 APDP 镜像 | 无需 APDP 镜像 | 无需 APDP 镜像 | 无需 APDP 镜像 |
| 安全阶段 2 | `--nonsecure-crash-dumps` | --offline-crash dump 及设备序列号 | --logs 及设备序列号<br><br><br>                                <br>或<br><br><br>                                <br>加密 TZDiag 及<br><br><br>                                <br>`--nonsecure-crash-dumps`<br><br><br>                                <br>+ devcfg 中用于 TZDiag 加密的公钥/指数值可以在以下位置配置：<br><br><br>                                <br>/trustzone\_images/ssg/securemsm/<br><br><br>                                <br>trustzone/qsee/mink/oem/config&lt;chipset&gt;<br><br><br>                                <br>/oem\_config.xml | <ul class="ul" id="debug__ul_lyz_lty_21c"><br>                                    <li class="li">Apps 迷你 dump：<p class="p"><code class="ph codeph">--apps-encrypted-mini-dumps</code></p><br></li><br><br>                                    <li class="li">Modem 和 WLAN：<ul class="ul" id="debug__ul_ocm_nty_21c"><br>                                            <li class="li"><code class="ph codeph">--mpss-encrypted-mini-dumps</code></li><br><br>                                            <li class="li"><code class="ph codeph">--wlan-encrypted-mini-dumps</code></li><br><br>                                        </ul><br></li><br><br>                                    <li class="li">aDSP 迷你 dump： <code class="ph codeph">--adsp-encrypted-mini-dumps</code></li><br><br>                                    <li class="li">cDSP 迷你 dump： <code class="ph codeph">--cdsp-encrypted-mini-dumps</code></li><br><br>                                </ul><br><br>                                <br>参见 [KBA-191202045020-1 (ZIP)](https://docs.qualcomm.com/bundle/KBA-191202045020-1/resource/KBA-191202045020-1.zip)。更多信息，参见 [MiniDump Software User Guide](https://docs.qualcomm.com/bundle/80-P8754-71/resource/80-P8754-71_REV_H_MiniDump_Software_User_Guide.pdf)。 |

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

在安全设备上，默认情况下，从 Linux 收集的 Qualcomm TEE/TrustZone 日志处于禁用状态。Qualcomm 提供了加密的日志功能来进行记录。按照以下步骤操作以启用此功能：

1. 使用以下命令生成用于加密的 RSA 密钥：

        openssl genrsa -out rsa_key 2048 Copy to clipboard
2. 使用以下命令显示 RSA 
密钥信息和模数：

        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)
        Copy to clipboard

Note: 模数在 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` 文件中：

        <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>
        Copy to clipboard

Note: `oem_config.xml` 文件中的公钥更新时，确保由于使用了记事本或写字板编辑器，中间未插入换行符、制表符或空格。
4. 使用以下命令从 `trustzone_images/ssg/securemsm/trustzone/qsee/mink/oem/config/<chipset>/oem_config.xml` 文件启用加密功能配置标志：

        < props name="OEM_log_encr_enable" type=DALPROP_ATTR_TYPE_UINT32>
        1
        </props>
        Copy to clipboard
5. 要编译 TrustZone devcfg 镜像，输入 OEM ID 字段值并对 `devcfg.mbn` 镜像进行签名。
6. 使用以下命令刷写签名 `devcfg.mbn` 镜像：

        fastboot flash devcfg devcfg.mbnCopy to clipboard
7. 使用以下命令收集 Qualcomm TEE/TrustZone 日志：

        cat /proc/tzdbg/qsee_log > qsee_log.txt
        cat /proc/tzdbg/log > tz_log.txt
        Copy to clipboard

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

1. 从 [KBA-200917004544-1 (ZIP)](https://docs.qualcomm.com/bundle/KBA-200917004544-1/resource/KBA-200917004544-1.zip) 下载 Python 解密工具 `decrypt_tzdiag_qsee_log_tools.py`。
2. 要安装，可运行以下命令：

        Python Version 3.x
        pip install pycryptodome
        pip install cryptography
        Copy to clipboard
3. 要解密，可运行以下命令：

        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>Copy to clipboard
4. 解密成功后：
    1. 将 Qualcomm TEE 日志的纯文本处理成可读字符串格式。
    2. 使用以下命令将十六进制编码的错误代码转换为字符串：

            print_tz_log.pyCopy to clipboard

Last Published: Dec 03, 2024

[Previous Topic
自定义](https://docs.qualcomm.com/bundle/publicresource/80-70015-11SC/topics/customize.md) [Next Topic
示例](https://docs.qualcomm.com/bundle/publicresource/80-70015-11SC/topics/examples-lru.md)