> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 配置调试方法

使用以下方法了解调试内核方式的高层分类，并利用 Qualcomm<sup>®</sup> Linux 内核固有的调试特性报告发现的问题。

有关调试的更多信息，请参阅 [Qualcomm Linux 调试指南](https://dragonwingdocs.qualcomm.com/System/Debug-Subsystem/debug-overview)。

## **使用 printk 调试**

使用 `printk` 技术在 Linux 内核中进行调试，以打印消息和跟踪。

`include/linux/printk.h` 中定义的 printk 封装函数支持为日志语句添加日志级别。例如：

```text theme={null}
pr_emerg("At line %d: Func: %s\n", __LINE__, __func__);
pr_info("At line");
```

## **调试内核模块**

要调试内核模块，请在 kas shell 中执行以下操作：

1. 使用 `devtool modify linux-qcom` 命令克隆内核代码。
2. 内核模块签名默认处于禁用状态。要手动禁用内核模块签名配置 `CONFIG_MODULE_SIG`，请使用 `menuconfig` 命令。有关 `menuconfig` 命令的更多信息，请参阅"配置内核"。

以下命令可帮助您手动禁用内核模块签名配置：

> ```text theme={null}
> CONFIG_MODULE_SIG
> ```
>
> ```text theme={null}
> CONFIG_MODULE_SIG_FORCE
> ```

<Note>这是一次性步骤。</Note>

3. 在内核或模块中进行更改。
4. 使用 `bitbake esp-qcom-image` 命令重新构建内核模块。
5. 请参阅[安装并启动内核](./install-and-boot-the-kernel)以刷写更新后的内核镜像并重启。

有关更多信息，请参阅 [Message logging with printk](https://docs.kernel.org/core-api/printk-basics.html)。

## **使用日志级别调试**

您可以使用 `/linux/printk.h` 中定义的任何其他日志级别打印消息。控制台日志由 printk 中使用的日志级别以及设备上选择的日志级别控制。

请根据您的用例选择日志级别。如果在频繁调用的函数中选择了较低的日志级别，可能会产生大量日志。

以下示例展示了各内核打印级别的日志：

```text theme={null}
pr_info("At func %s\n", __func__);
pr_notice("At func %s\n", __func__);
pr_warn("At func %s\n", __func__);
pr_err("At func %s\n", __func__);
pr_crit("At func %s\n", __func__);
pr_alert("At func %s\n", __func__);
pr_emerg("At func %s\n", __func__);
```

## **启用并挂载 debugfs 文件系统**

Debugfs 是一个允许内核开发人员向用户空间提供内核信息的文件系统。

Debugfs 用于访问内核数据结构和变量、跟踪事件、调试消息和统计信息。

* 确保您的内核配置中设置了 `CONFIG_DEBUG_FS`（默认启用）。
* 如果没有，可以在内核配置中使用 `menuconfig` 启用它。
* 如果 debugfs 未默认挂载，请挂载它。
  ```text theme={null}
  mount -t debugfs none /sys/kernel/debug
  ```

有关 kprobes、ftrace 和 MMIO 跟踪事件，请参阅[内核探针与跟踪](./kernel-probes-and-tracing)。
