# 配置内核调试器

配置内核调试器允许您在运行中或崩溃后检查和控制 Linux 内核。内核 GNU 调试器 KGDB 和动态跟踪框架等工具支持逐步调试，以识别和解决内核代码中的低级问题。

## 通过 KGDB 调试内核和模块

KGDB 为设备上的内核提供实时调试支持。

可将 KGDB 配置为调试内核和模块问题。KGDB 是与 GDB 配合使用的源代码级调试工具，用于调试 Qualcomm Linux 内核。

有关 KGDB 内核调试的更多信息，请参阅 [Debugging kernel and modules via gdb](https://www.kernel.org/doc/html/v6.14-rc7/process/debugging/gdb-kernel-debugging.html)。

## 使用 KGDB 通过串行 COM 端口调试

在内核配置文件中启用以下内核驱动程序，以支持 KGDB 通过串行 COM 端口调试：

CONFIG_FRAME_POINTER
    CONFIG_KGDB
    CONFIG_KGDB_SERIAL_CONSOLE
    CONFIG_HAVE_ARCH_KGDB
    CONFIG_CONSOLE_POLL
    CONFIG_MAGIC_SYSRQ
    Copy to clipboard

更新用于调试的命令行：

# Append  KERNEL_CMDLINE_EXTRA in meta-qcom-hwe/conf/machine/include/qcom-<SoC>.conf with following string
    "kgdboc=ttyMSM0,115200n8 kgdbwait nokaslr"
    
    # If waiting during the boot of kernel for gdb connection is not desired,
    # the parameter 'kgdbwait' can be skipped.
    Copy to clipboard

**禁用看门狗**

- 在使用 KGDB 调试时禁用看门狗。当看门狗启用时，SoC 会重置。
- 要禁用看门狗，请添加以下内核命令行参数：

echo 1 > /sys/bus/platform/devices/hypervisor:qcom,gh-watchdog/disable
        Copy to clipboard

**进入调试模式的方法**

**方法 1** - 使用 `kgdbwait`：

如果将 `kgdbwait` 作为命令行参数传递，内核将执行以下操作：
1. 在启动过程中暂停执行
2. 进入调试模式
3. 等待远程 GDB 连接，并显示以下消息：

[ 0.239669] printk: console [ttyMSM0] enabled
    [ 1.535669] random: fast init done
    [ 1.541411] KGDB: Registered I/O driver kgdboc
    [ 2.224804] KGDB: Waiting for connection from remote gdb...
    Copy to clipboard

通过配置禁用看门狗。

**方法 2** - 使用 `Magic SysRq`：

要进入调试模式，请在 shell 中运行 `SysRq-G`，并运行以下命令：

`echo g > /proc/sysrq-trigger`

**方法 3** - 每当需要在源代码中触发 KGDB 断点时，在目标驱动文件中添加以下代码片段：

#include <linux/kgdb.h>   (you may need to include this file )
    kgdb_breakpoint(); //call this for adding a break point at compile time
    Copy to clipboard

**方法 4** - 触发 panic：当发生异常时，内核自动进入调试模式。要触发崩溃，请使用 `Magic SysRq` 功能。

`echo c > /proc/sysrq-trigger`

### 使用 GDB 经由 COM 端口连接 Qualcomm SoC

安装 GDB `gdb-multiarch: mingw64\bin\gdb-multiarch.exe`。

- 对于 Windows 版 GDB - 通过 [MSYS2](https://www.msys2.org/) 安装 Mingw-w64。
- 对于 Linux 版 GDB - 使用 [How to Install GDB](https://www.gdbtutorial.com/tutorial/how-install-gdb) 中的方法安装 GDB。
- 当使用 GDB 经由 COM 端口连接 SoC 时，请关闭所有其他串行端口连接。
- 在 Windows 主机上，将 COM 端口号设置为大于 16 的数字。可以从设备管理器中获取端口号。
- 在 Windows 主机上，将 COM 端口作为 `\\.\com<#>` 传递。
- 在以下示例中，从 Windows 主机的串行端口建立连接：使用的串行端口号为 COM17。在重新连接 PuTTY 之前，需要先断开 GDB 与 COM 端口的连接。要附加和解除附加 GDB 命令，请运行以下命令：

gdb-multiarch.exe -b 115200 <path_to_vmlinux>
        (gdb) target remote \\.\com17
           Remote debugging using \\.\com17
           warning: multi-threaded target stopped without sending a thread-id, using first non-exited thread
           [Switching to Thread -2]
           arch_kgdb_breakpoint () at arch/arm64/include/asm/kgdb.h:21
           21      arch/arm64/include/asm/kgdb.h: No such file or directory.
        Copy to clipboard

要设置断点、查看断点或检查 CPU 寄存器，请运行以下命令：

# backtrace:
    > bt
    
    # set a break point:
    break <function_name>
    or
    break <filename>: line no
    
    # View all current break points:
    info break
    
    # View CPU registers:
    info reg
    
    # step over:
    s
    
    # continue execution:
    c
    Copy to clipboard

#### 使用 KGDB 调试内核模块

KGDB 是一个内核补丁，允许使用 GDB 接口对正在运行的 Qualcomm Linux 内核进行源代码级调试。

您必须有 `.ko` 文件和 `.text` 内核模块文件的位置。

若要获取已加载模块 `.text` 部分的地址，可运行以下命令：

# from live device
    # cat /sys/module/<module>/sections/.text
    Copy to clipboard

若要添加模块符号文件，可运行以下命令：

(gdb) add-symbol-file <path_to_.ko> <.text_addr>
    Copy to clipboard

例如，`add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0`。

Last Published: Jul 22, 2025

[Previous Topic
从设备访问内容](https://docs.qualcomm.com/bundle/publicresource/80-70020-3SC/topics/access-content-from-the-device.md) [Next Topic
排查内核问题](https://docs.qualcomm.com/bundle/publicresource/80-70020-3SC/topics/common_troubleshooting.md)