Skip to main content
子系统在 Qualcomm® SoC 上其自身的执行环境中独立处理任务。本节介绍针对受影响子系统的工具、示例日志和故障排查方法。了解子系统中的异常以及检查错误的方法,有助于诊断和排查此类异常。 下表列出了 SoC 上的重要子系统。 表:SoC 上的子系统
术语”非 HLOS”是指除应用处理器之外所有子系统的软件。要了解子系统的引导流程,请参阅 Qualcomm Linux 引导指南。
请参阅 Qualcomm® Linux® 支持的硬件 SoC。

调试工作流

首先确定问题最先出现的子系统,因为 Qualcomm SoC 拥有许多子系统。这有助于您调试正确的子系统。 作为主要子系统的应用处理器可以检测到其他子系统的崩溃。例如,如果 aDSP 处理器子系统崩溃,内核日志会捕获子系统重启(SSR)崩溃错误日志。因此,要确定需要调试的子系统,请先检查内核调试消息。 下图显示了识别错误以及需要调试的组件的工作流。
诊断内核 panic、软件 bug 和子系统崩溃问题的工作流。

图:识别受影响子系统的工作流

当内核 dmesg 日志未显示 panic 特征时,请检查 Qualcomm TEE 诊断(diag)日志中的错误,例如非安全看门狗 bite 和片上网络(NoC)错误。以下章节描述了表明内核 panic、bug 和子系统崩溃问题的示例内核消息。

识别内核 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 功能,而不要在开发阶段使用。
有关 SSR 功能的更多信息,请参阅配置远程处理器子系统。 启用 SSR 功能可在子系统重启时生成 SSR 转储。考虑使用 SSR 转储进行调试,因为它的大小比完整内存转储小。但是,调试某些子系统崩溃需要完整的 RAM 转储。 有关如何启用和捕获子系统转储的更多信息,请参阅捕获子系统转储。

强制子系统复位

使用此功能可调试需要重启子系统的用例。
此功能仅面向拥有授权访问权限的许可开发者。
要强制子系统复位,您可以使用 QXDM Professional™ 工具运行 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 相关的硬件问题导致的随机复位

后续步骤