# Debug overview

A subsystem processes independently within its own execution environment on the Qualcomm^®^ SoC. This section describes the tools, sample logs, and troubleshooting methods for impacted subsystems. Understanding the discrepancies in subsystems and methods for examining errors is useful for diagnosing and troubleshooting such anomalies.

The following table lists the important subsystems on the SoC.

Table: Subsystems on SoC

| Subsystem | Description |
| --- | --- |
| Application processor subsystem (APSS) | This primary subsystem executes the Qualcomm^®^ Linux^®^ kernel as the high-level OS (HLOS). |
| Application digital signal processor (aDSP) | This subsystem, also known as the low-power audio subsystem (LPASS), handles digital signal processing tasks, such as audio encoding/decoding, and voice recognition. |
| Compute digital signal processor (cDSP) | This subsystem performs compute-intensive tasks, such as neural network-related calculations. |
| Qualcomm^®^ Trusted Execution Environment (TEE)/TrustZone (TZ) | This subsystem performs secure operations and leverages the Arm^®^ TrustZone^®^ architecture. For more information, see [Qualcomm Linux Security Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-80022-11/security-home-page.html). |
| Wireless local area network processor subsystem (WPSS) | This subsystem connects to a Wi-Fi network, transmits and receives data packets, handles security protocols, and ensures stable network performance. For more information, see [Qualcomm Linux Wi-Fi Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-80022-14/wifi_landing_page.html). |
| Always-on Processor (AOP) | This subsystem regulates the power for the device. |

Note

The term non-HLOS refers to software for all subsystems other than the application processor.

To understand the boot flow of the subsystems, see [Qualcomm Linux Boot Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-80022-4/landing-page.html).

Note

See [Hardware SoCs](https://docs.qualcomm.com/bundle/publicresource/topics/80-80022-115/soc.html) that are supported on Qualcomm^®^ Linux^®^.

## Debug workflow

Identify the subsystem where the issue first occurs, as the Qualcomm SoC has many subsystems. This helps you debug the correct subsystem.

The application processor, as the primary subsystem, detects when other subsystems crash. For example, if the aDSP processor subsystem crashes, the kernel log captures the subsystem restart (SSR) crash error log. Therefore, to identify the subsystem that needs debugging, first verify the kernel debug messages.

The following figure shows the workflow to identify errors and the components you need to debug.

<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="1059.261337280273438" height="501.282932281494141" viewbox="0 0 1059.261337280273438 501.282932281494141" aria-label="Workflow for diagnosing kernel panics, software bugs, and subsystem crash issues.">
  <defs>
    <style>.svg-1 .cls-1 { stroke: #000 }
.svg-1 .cls-1,.svg-1 .cls-2 { fill: none; stroke-miterlimit: 10 }
.svg-1 .cls-2 { stroke: #fff }
.svg-1 .cls-3 { fill: #d2d7e1 }
.svg-1 .Primary_color_2_Azure { fill: #6280cc }
.svg-1 .cls-4,.svg-1 .cls-5 { font-family: Roboto-Regular, Roboto; font-size: 16.07196044921875px }
.svg-1 .cls-6 { fill: #fafafa }
.svg-1 .cls-5 { fill: #fff }</style>
  </defs>
  <g>
    <rect class="cls-6" x=".499801635742188" y=".499881744384766" width="1058.26171875" height="500.28271484375" rx="7.499999999999972" ry="7.499999999999972"></rect>
    <path class="cls-3" d="M1051.261337280273438,1c3.85986328125,0,7,3.140132904052734,7,7.000001907348633v485.282930374145508c0,3.85986328125-3.14013671875,7-7,7H8c-3.859878540039062,0-7-3.14013671875-7-7V8.000001907348633c0-3.859869003295898,3.140121459960938-7.000001907348633,7-7.000001907348633h1043.261337280273438M1051.261337280273438,0H8C3.58172607421875,0,0,3.581733703613281,0,8.000001907348633v485.282930374145508c0,4.41827392578125,3.58172607421875,8,8,8h1043.261337280273438c4.41827392578125,0,8-3.58172607421875,8-8V8.000001907348633c0-4.418268203735352-3.58172607421875-8.000001907348633-8-8.000001907348633h0Z"></path>
  </g>
  <g>
    <rect class="Primary_color_2_Azure" x="341.529161274448597" y="405.560697121376506" width="134.834910469639908" height="75.632234680853799"></rect>
    <line class="cls-2" x1="355.5267428551997" y1="405.560697121376506" x2="355.5267428551997" y2="481.192931802230305"></line>
    <line class="cls-2" x1="462.970771744088779" y1="405.560697121376506" x2="462.970771744088779" y2="481.192931802230305"></line>
  </g>
  <g>
    <rect class="Primary_color_2_Azure" x="743.616850277394406" y="405.560697121376506" width="134.834910469638999" height="75.632234680853799"></rect>
    <line class="cls-2" x1="757.614431858144599" y1="405.560697121376506" x2="757.614431858144599" y2="481.192931802230305"></line>
    <line class="cls-2" x1="865.058460747033678" y1="405.560697121376506" x2="865.058460747033678" y2="481.192931802230305"></line>
  </g>
  <g>
    <rect class="Primary_color_2_Azure" x="904.336450277398399" y="405.560697121376506" width="134.83491046963718" height="75.632234680853799"></rect>
    <line class="cls-2" x1="918.334031858146773" y1="405.560697121376506" x2="918.334031858146773" y2="481.192931802230305"></line>
    <line class="cls-2" x1="1025.778060747035852" y1="405.560697121376506" x2="1025.778060747035852" y2="481.192931802230305"></line>
  </g>
  <g>
    <rect class="Primary_color_2_Azure" x="20.089961274447887" y="405.560697121376506" width="134.834910469640818" height="75.632234680853799"></rect>
    <line class="cls-2" x1="34.08754285519899" y1="405.560697121376506" x2="34.08754285519899" y2="481.192931802230305"></line>
    <line class="cls-2" x1="141.531571744088978" y1="405.560697121376506" x2="141.531571744088978" y2="481.192931802230305"></line>
  </g>
  <text class="cls-4" transform="translate(704.312301635742188 166.584452718496323)"><tspan x="0" y="0">No</tspan></text>
  <text class="cls-4" transform="translate(331.658493041992188 166.423808187246323)"><tspan x="0" y="0">Yes</tspan></text>
  <text class="cls-4" transform="translate(362.506637573242188 282.395389556884766)"><tspan x="0" y="0">No</tspan></text>
  <text class="cls-4" transform="translate(110.656051635742188 282.395389556884766)"><tspan x="0" y="0">Yes</tspan></text>
  <text class="cls-5" transform="translate(385.972946166992188 428.786991119384766)"><tspan x="0" y="0">Debug</tspan><tspan x="-17.35498046875" y="19.2861328125">Application</tspan><tspan x="-12.8896484375" y="38.57275390625">processor</tspan></text>
  <text class="cls-5" transform="translate(64.533981323242188 428.786991119384766)"><tspan x="0" y="0">Debug</tspan><tspan x="-5.0380859375" y="19.2861328125">specific</tspan><tspan x="-16.12255859375" y="38.57275390625">subsystem</tspan></text>
  <text class="cls-5" transform="translate(931.248825073242188 448.073123931884766)"><tspan x="0" y="0">Debug NoC</tspan></text>
  <text class="cls-5" transform="translate(788.061325073242188 428.786991119384766)"><tspan x="0" y="0">Debug</tspan><tspan x="-13.80859375" y="19.2861328125">Always-on</tspan><tspan x="-12.8896484375" y="38.57275390625">processor</tspan></text>
  <text class="cls-4" transform="translate(929.994918823242188 370.949588775634766)"><tspan x="0" y="0">NoC </tspan><tspan x="1.0673828125" y="19.2861328125">error</tspan></text>
  <text class="cls-4" transform="translate(770.569137573242188 370.949588775634766)"><tspan x="0" y="0">AoP </tspan><tspan x="-.2275390625" y="19.2861328125">error</tspan></text>
  <text class="cls-4" transform="translate(536.327926635742188 332.740116119384766)"><tspan x="0" y="0">Non-secure WD bite</tspan><tspan x="0" y="19.2861328125">AHB timeout</tspan><tspan x="0" y="38.57275390625">XPU error</tspan><tspan x="0" y="57.85888671875">SMMU error</tspan><tspan x="0" y="77.1455078125">No error</tspan></text>
  <polygon class="Primary_color_2_Azure" points="436.932337804999406 174.175061342312802 529.484773770635002 110.464330310850528 622.040524831287257 174.175061342310983 529.484773770636821 237.885792373774166 436.932337804999406 174.175061342312802"></polygon>
  <polygon class="Primary_color_2_Azure" points="155.673037805000604 289.85578224742676 248.225473770636199 226.145051215965395 340.781224831288455 289.85578224742676 248.225473770636199 353.566513278888124 155.673037805000604 289.85578224742676"></polygon>
  <polygon class="Primary_color_2_Azure" points="718.480326807944948 289.855782251755045 811.032762773580544 226.145051220293681 903.588513834232799 289.855782251755954 811.032762773580544 353.566513283218228 718.480326807944948 289.855782251755045"></polygon>
  <g>
    <line class="cls-1" x1="529.486312866210938" y1="56.891130447387695" x2="529.486312866210938" y2="104.723346710205078"></line>
    <polygon points="525.497238159179688 103.556156158447266 529.486312866210938 110.464328765869141 533.475387573242188 103.556156158447266 525.497238159179688 103.556156158447266"></polygon>
  </g>
  <g>
    <line class="cls-1" x1="811.034286499023438" y1="353.566501617431641" x2="811.034286499023438" y2="400.035923004150391"></line>
    <polygon points="807.045211791992188 398.868747711181641 811.034286499023438 405.776920318603516 815.023361206054688 398.868747711181641 807.045211791992188 398.868747711181641"></polygon>
  </g>
  <text class="cls-5" transform="translate(484.233200073242188 170.374881744384766)"><tspan x="0" y="0">Panic or Bug</tspan><tspan x="8.60107421875" y="19.2861328125">in dmesg?</tspan></text>
  <text class="cls-5" transform="translate(208.505661010742188 272.804569244384766)"><tspan x="0" y="0">Subsystem</tspan><tspan x="-5.14404296875" y="19.2861328125">restart log in</tspan><tspan x="-11.64990234375" y="38.57275390625">dmesg exists?</tspan></text>
  <text class="cls-5" transform="translate(785.352340698242188 284.909061431884766)"><tspan x="0" y="0">Error in</tspan><tspan x="-18.37109375" y="19.2861328125">TrustZone*?</tspan></text>
  <g>
    <polyline class="cls-1" points="436.932327270507812 174.175067901611328 248.227020263671875 173.718418121337891 248.227020263671875 220.404071807861328"></polyline>
    <polygon points="244.237953186035156 219.236881256103516 248.227020263671875 226.145053863525391 252.216079711914062 219.236881256103516 244.237953186035156 219.236881256103516"></polygon>
  </g>
  <g>
    <polyline class="cls-1" points="155.673037528991699 289.855777740478516 87.507415771484375 289.855777740478516 87.507415771484375 399.562961578369141"></polyline>
    <polygon points="83.518352508544922 398.395786285400391 87.507415771484375 405.303958892822266 91.496479034423828 398.395786285400391 83.518352508544922 398.395786285400391"></polygon>
  </g>
  <g>
    <polyline class="cls-1" points="340.781219482421875 289.855777740478516 408.946609497070312 289.855777740478516 408.946609497070312 399.819705963134766"></polyline>
    <polygon points="404.957565307617188 398.652530670166016 408.946609497070312 405.560703277587891 412.935684204101562 398.652530670166016 404.957565307617188 398.652530670166016"></polygon>
  </g>
  <g>
    <polyline class="cls-1" points="903.588485717773438 289.855777740478516 971.753890991210938 289.855777740478516 971.753890991210938 399.819705963134766"></polyline>
    <polygon points="967.764816284179688 398.652530670166016 971.753890991210938 405.560703277587891 975.742965698242188 398.652530670166016 967.764816284179688 398.652530670166016"></polygon>
  </g>
  <g>
    <polyline class="cls-1" points="622.040512084960938 174.175067901611328 811.034286499023438 174.175067901611328 811.034286499023438 220.404071807861328"></polyline>
    <polygon points="807.045211791992188 219.236881256103516 811.034286499023438 226.145053863525391 815.023361206054688 219.236881256103516 807.045211791992188 219.236881256103516"></polygon>
  </g>
  <g>
    <polyline class="cls-1" points="718.480331420898438 289.855777740478516 529.486312866210938 289.855777740478516 529.486312866210938 443.376804351806641 482.105056762695312 443.376804351806641"></polyline>
    <polygon points="483.272262573242188 439.387760162353516 476.364059448242188 443.376804351806641 483.272262573242188 447.365879058837891 483.272262573242188 439.387760162353516"></polygon>
  </g>
  <g id="Terminator-2" data-name="Terminator">
    <path class="Primary_color_2_Azure" d="M498.868116512205233,58.037699157472161s-16.901299999999537-2.138699999999517-16.901299999999537-19.245107999999163c0-17.1073920000008,16.901299999999537-19.828092000000652,16.901299999999537-19.828092000000652h61.235400000001391s16.902299999999741,2.137700000000223,16.902299999999741,19.245084000000134c0,17.106416000000536-16.902299999999741,19.828115999999682-16.902299999999741,19.828115999999682h-61.235400000001391Z"></path>
  </g>
  <text class="cls-5" transform="translate(512.37840636074543 43.197876513004303)"><tspan x="0" y="0">Start</tspan></text>
</svg>

**Figure: Workflow to identify the impacted subsystem**

When the kernel dmesg logs show no panic signatures, verify the Qualcomm TEE diagnostic (diag) logs for errors such as nonsecure watchdog bite and network-on-chip (NoC) errors. The following sections describe example kernel messages that indicate kernel panic, bugs, and subsystem crash issues.

### Identify kernel panic and bugs

You can determine from the kernel dmesg logs whether the reset was a kernel panic or a bug. The following example logs indicate a kernel panic or a bug:

- Panic (Pattern: General error)

18.800936: &lt;6&gt; Kernel panic - not syncing: Fatal exception

18.800938: &lt;6&gt; SMP: stopping secondary CPUs

18.800947: &lt;6&gt; CPU0: stopping

Kernel panic - not syncing: Apps watchdog Bark received!
- Bug (Pattern 1: Forced crash caused by memory corruption)

12.899532: &lt;6&gt; BUG kmalloc-128 (Not tainted): Redzone overwritten

12.905418: &lt;6&gt; -----------------------------------------------------------------------------
- Bug (Pattern 2: Forced crash from driver)

320.510769: &lt;6&gt; ------------[ cut here ]------------

320.510781: &lt;6&gt; 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 (Pattern 3: Forced crash due to lockup issue)

[ 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!

Note

Most bugs typically result in a kernel panic. For more information about debugging kernel issues, see [Qualcomm Linux Kernel Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-80022-3/kernel_landing_page.html).

### Identify subsystem crash issues

You can verify the kernel dmesg logs to determine whether the restart was due to a subsystem crash.
For example, the following log indicates that the aDSP subsystem crashed, according to the `sc7280.dtsi` file (node: `remoteproc_adsp: remoteproc@3700000`):

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

### Identify system issues from Qualcomm TEE logs

This feature is available to licensed developers with authorized access. For sample logs that indicate errors in the Qualcomm TEE, see [Qualcomm Linux Debug Guide - Addendum](https://docs.qualcomm.com/bundle/resource/topics/80-80022-12A/identify_subsystem_to_be_debugged.html#identify_and_debug_errors_in_tz).

If the Qualcomm TEE diag logs show no error, the issue may be due to a secure watchdog bite. For more information about watchdog issues, see [Hardware reset](https://docs.qualcomm.com/doc/80-80022-12/topic/reset_hardware.html#reset-hardware).

For more information about the debugging issues in Qualcomm TEE, see [Qualcomm Linux Security Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-80022-11/debug.html).

## Debug methods

The following are the two approaches for debugging:

- **On-target debugging**

    On-target debugging resolves software issues. This approach allows access to most information directly from the live device. Connect the Linux host computer to the live device using SSH. To set up SSH, see [Sign in using SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-80022-254/how_to.html#use-ssh).

    For more information about various on-target debug features, see [On-target debug features](https://docs.qualcomm.com/doc/80-80022-12/topic/on_target_debug_features.html#on-target-debug-features).
- **Off-target debugging**

    This approach uses logs instead of an actual device, making it an efficient method of debugging. You can debug using memory dumps or logging tools and various types of logs for offline debugging. Although the RAM dump captures most of the memory regions, it includes only limited hardware register information, so debugging a hardware-related issue can be a challenge.

    For more information about various off-target debug features, see [Off-target debug features](https://docs.qualcomm.com/doc/80-80022-12/topic/off_target_debug_features.html#off-target-debug-features).

### On-target debug features

You can use the following debug features on the device at runtime:

- [Perf utility](https://docs.qualcomm.com/doc/80-80022-12/topic/on_target_debug_features.html#section-tmb-3v5-41c)
- [Subsystem restart](https://docs.qualcomm.com/doc/80-80022-12/topic/on_target_debug_features.html#section-o5w-vfb-pzb)
- [Force subsystem reset](https://docs.qualcomm.com/doc/80-80022-12/topic/on_target_debug_features.html#section-gdz-gjb-pzb)

#### Perf utility

The Perf utility in Linux facilitates performance analysis and profiling. The Linux kernel includes Perf utility in the `tools/perf` directory.

You can use the Perf utility to debug various aspects of system behavior, including CPU performance counters, tracepoints, kprobes, and uprobes (for dynamic tracing). The following table lists the key features of the Perf utility.

Table: Key features of Perf utility

| Feature | Description |
| --- | --- |
| CPU performance counters | These CPU hardware registers track events, such as executed instructions, cache misses, and branch mispredictions. These events form the basis for profiling applications and identifying performance bottlenecks. |
| Tracepoints | You can place these tracepoints at logical locations in the code, such as system calls, network events, and file system operations. These tracepoints provide information,<br>such as timestamps and stack traces, with minimal overhead. |
| Dynamic tracing | This feature dynamically creates tracepoints using the kprobes and uprobes frameworks, allowing tracing in both kernel space and user space. |

For more information about the Perf utility, see the following resources:

- [Perf main page](https://perf.wiki.kernel.org/index.php/Main_Page)
- [HOWTO](https://github.com/Linaro/OpenCSD/blob/master/HOWTO.md)
- [CoreSight](https://docs.kernel.org/trace/coresight/index.html)
- [CoreSight - Perf](https://docs.kernel.org/trace/coresight/coresight-perf.html)

#### Subsystem restart

Subsystems can restart independently when they crash without requiring a device restart called subsystem restart (SSR). The SSR feature uses the remoteproc framework available in the Linux kernel.

To enable a full memory dump for debugging purposes, disable the SSR feature by default.

Note

It's recommended to use the SSR feature on commercial devices and not during the development phase.

For more information about the SSR feature, see [Configure the remoteprocessor subsystems](https://docs.qualcomm.com/bundle/publicresource/topics/80-80022-3/remoteproc-overview.html).

Enable the SSR feature to generate the SSR dump on a subsystem restart. Consider using the SSR dump for debugging, as its size is smaller than the full memory dump. However, you need the entire RAM dump to debug some subsystem crashes.

For more information about how to enable and capture subsystem dumps, see [Capture the subsystem dumps](https://docs.qualcomm.com/doc/80-80022-12/topic/subsystem_ram_dumps.html#subsystem-ram-dumps).

#### Force subsystem reset

Use this feature to debug use cases that require restarting a subsystem.

Note

This feature is available to licensed developers with authorized access.

To force a subsystem reset, you can run the `diag` command using the QXDM Professional^™^ tool. For more information about QXDM Professional commands and their usage, see [Qualcomm Linux Debug Guide - Addendum](https://docs.qualcomm.com/bundle/resource/topics/80-80022-12A/debug-non-hlos-subsystems.html#qxdm_professional).

### Off-target debug features

You can use RAM dump or QXDM Professional for offline debugging.

#### RAM dump

The RAM dump is a snapshot of the entire memory at the time of failure. You can analyze the RAM dump using various tools, including Qualcomm^®^ Crash Analysis Portal (QCAP), RAMParser, Lauterbach TRACE32 simulator, and crash utility.

For more information about how to collect and parse RAM dumps, see [Collect and parse RAM dump](https://docs.qualcomm.com/doc/80-80022-12/topic/collect_and_parse_ram_dumps.html#collect-and-parse-ram-dumps).

#### QXDM Professional

Use QXDM Professional to debug various subsystems. This tool is available to licensed developers with authorized access. For more information about QXDM Professional commands and their usage, see [Qualcomm Linux Debug Guide - Addendum](https://docs.qualcomm.com/bundle/resource/topics/80-80022-12A/debug-non-hlos-subsystems.html#qxdm_professional).

## Common system issues

You can categorize system issues into one of the following types:

> 
> 
> - [Linux kernel-space issues](https://docs.qualcomm.com/doc/80-80022-12/topic/debugging_linux_kernel.html#debugging-linux-kernel)
> - [System issues](https://docs.qualcomm.com/doc/80-80022-12/topic/general_system_debugging.html#general-system-debugging)
> 
> 
> 
> > 
> > 
> > - [Watchdog issues](https://docs.qualcomm.com/doc/80-80022-12/topic/watchdog_timeout.html#watchdog-timeout)
> >     - [Bus hang and timeout issues](https://docs.qualcomm.com/doc/80-80022-12/topic/general_system_debugging.html#erroneous-transaction-on-bus-error-and-timeout)
> >     - [Hardware reset issues](https://docs.qualcomm.com/doc/80-80022-12/topic/reset_hardware.html#reset-hardware)

## Miscellaneous issues

You may run into the following miscellaneous issues:

- Device-freeze issues due to software bugs
- Linux application-related issues
- Random resets due to hardware issues related to the PCB

## Next steps

> 
> 
> - To debug Linux application-related issues, see [Debug Linux user-space issues](https://docs.qualcomm.com/doc/80-80022-12/topic/using_open_source_debug_tools.html#using-open-source-debug-tools).
> - To debug Linux kernel-related issues, see [Debug Linux kernel-space issues](https://docs.qualcomm.com/doc/80-80022-12/topic/debugging_linux_kernel.html#debugging-linux-kernel).

Last Published: May 14, 2026

[Previous Topic
Debug documentation](https://docs.qualcomm.com/bundle/publicresource/80-80022-12/topics/landing_page.md) [Next Topic
Debug Linux user-space issues](https://docs.qualcomm.com/bundle/publicresource/80-80022-12/topics/using_open_source_debug_tools.md)