术语”非 HLOS”是指除应用处理器之外所有子系统的软件。要了解子系统的引导流程,请参阅 Qualcomm Linux 引导指南。
请参阅 Qualcomm® Linux® 支持的硬件 SoC。
调试工作流
首先确定问题最先出现的子系统,因为 Qualcomm SoC 拥有许多子系统。这有助于您调试正确的子系统。 作为主要子系统的应用处理器可以检测到其他子系统的崩溃。例如,如果 aDSP 处理器子系统崩溃,内核日志会捕获子系统重启(SSR)崩溃错误日志。因此,要确定需要调试的子系统,请先检查内核调试消息。 下图显示了识别错误以及需要调试的组件的工作流。图:识别受影响子系统的工作流
识别内核 panic 和 bug
您可以从内核 dmesg 日志中判断复位是内核 panic 还是 bug。以下示例日志表明内核 panic 或 bug:- Panic(模式:一般错误) 18.800936: <6> Kernel panic - not syncing: Fatal exception 18.800938: <6> SMP: stopping secondary CPUs 18.800947: <6> CPU0: stopping Kernel panic - not syncing: Apps watchdog Bark received!
- Bug(模式 1:由内存损坏引起的强制崩溃) 12.899532: <6> BUG kmalloc-128 (Not tainted): Redzone overwritten 12.905418: <6> -----------------------------------------------------------------------------
- Bug(模式 2:来自驱动程序的强制崩溃) 320.510769: <6> ------------[ cut here ]------------ 320.510781: <6> kernel BUG at /local/mnt/workspace/lnxbuild/project/trees_in_use/free_tree_platform_manifest_refs_tags/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c:955!
- Bug(模式 3:由锁死问题导致的强制崩溃) [ 180.993861] BUG: spinlock lockup suspected on CPU#0, swapper/0/0 [ 180.993883] lock: stop_lock+0x0/0x18, .magic: dead4ead, .owner: swapper/6/0, .owner_cpu: 6 [ 181.015629] Causing a watchdog bite!
大多数 bug 通常会导致内核 panic。有关调试内核问题的更多信息,请参阅 Qualcomm Linux 内核指南。
识别子系统崩溃问题
您可以检查内核 dmesg 日志,以确定重启是否由子系统崩溃引起。例如,根据sc7280.dtsi(节点:remoteproc_adsp: remoteproc@3700000),以下日志表明 aDSP 子系统崩溃:
0x000000000A27652C | 5198.790423: qcom_q6v5_pas 3700000.remoteproc: fatal error received: err_inject_crash.c:413:Crash injected via Diag
0x000000000A276689 | 5198.801061: remoteproc remoteproc2: crash detected in 3000000.remoteproc: type fatal error
0x000000000A2767A1 | 5198.809602: remoteproc remoteproc2: handling crash #1 in 3000000.remoteproc
0x000000000A27688E | 5198.816837: remoteproc remoteproc2: recovering 3000000.remoteproc
0x000000000A276971 | 5198.823784: qcom_q6v5_pas 8a00000.remoteproc: subsystem event rejected
从 Qualcomm TEE 日志中识别系统问题
此功能仅面向拥有授权访问权限的许可开发者。有关表明 Qualcomm TEE 中错误的示例日志,请参阅 Qualcomm Linux Debug Guide - Addendum。 如果 Qualcomm TEE diag 日志未显示错误,则问题可能是由安全看门狗 bite 引起的。有关看门狗问题的更多信息,请参阅硬件复位。 有关调试 Qualcomm TEE 中问题的更多信息,请参阅 Qualcomm Linux 安全指南。调试方法
以下是两种调试方式:- 在目标设备上调试(On-target debugging) 在目标设备上调试可解决软件问题。此方式允许直接从运行中的设备获取大部分信息。使用 SSH 将 Linux 主机连接到运行中的设备。要设置 SSH,请参阅使用 SSH 登录。 有关各种在目标设备上调试功能的更多信息,请参阅在目标设备上调试功能。
- **离线调试(Off-target debugging)**i 此方式使用日志而不是实际设备,是一种高效的调试方法。您可以使用内存转储或日志工具以及各种类型的日志进行离线调试。虽然 RAM 转储捕获了大部分内存区域,但它仅包含有限的硬件寄存器信息,因此调试与硬件相关的问题可能是一项挑战。 有关各种离线调试功能的更多信息,请参阅离线调试功能。
在目标设备上调试功能
您可以在运行时于设备上使用以下调试功能:Perf 实用工具
Linux 中的 Perf 实用工具便于性能分析和性能剖析。Linux 内核在tools/perf 目录中包含 Perf 实用工具。
您可以使用 Perf 实用工具调试系统行为的各个方面,包括 CPU 性能计数器、tracepoint、kprobe 和 uprobe(用于动态跟踪)。下表列出了 Perf 实用工具的主要功能。
表:Perf 实用工具的主要功能
有关 Perf 实用工具的更多信息,请参阅以下资源:
子系统重启
子系统在崩溃时可以独立重启而无需重启设备,这称为子系统重启(SSR)。SSR 功能使用 Linux 内核中可用的 remoteproc 框架。 要启用完整内存转储以进行调试,请默认禁用 SSR 功能。建议在商用设备上使用 SSR 功能,而不要在开发阶段使用。
强制子系统复位
使用此功能可调试需要重启子系统的用例。此功能仅面向拥有授权访问权限的许可开发者。
diag 命令。有关 QXDM Professional 命令及其用法的更多信息,请参阅 Qualcomm Linux Debug Guide - Addendum。
离线调试功能
您可以使用 RAM 转储或 QXDM Professional 进行离线调试。RAM 转储
RAM 转储是故障发生时整个内存的快照。您可以使用各种工具分析 RAM 转储,包括 Qualcomm® 崩溃分析门户(QCAP)、RAMParser、Lauterbach TRACE32 模拟器和 crash 实用工具。 有关如何收集和解析 RAM 转储的更多信息,请参阅收集并解析 RAM 转储。QXDM Professional
使用 QXDM Professional 调试各种子系统。此工具仅面向拥有授权访问权限的许可开发者。有关 QXDM Professional 命令及其用法的更多信息,请参阅 Qualcomm Linux Debug Guide - Addendum。常见系统问题
您可以将系统问题归入以下类型之一:其他问题
您可能会遇到以下其他问题:- 由软件 bug 导致的设备死机问题
- 与 Linux 应用相关的问题
- 与 PCB 相关的硬件问题导致的随机复位
后续步骤
- 要调试与 Linux 应用相关的问题,请参阅调试 Linux 用户空间问题。
- 要调试与 Linux 内核相关的问题,请参阅调试 Linux 内核空间问题。

