# 配置除錯方法

使用以下方法瞭解核心除錯方式的高階分類，並報告透過 Qualcomm Linux 核心固有的除錯功能發現的問題。

欲深入瞭解除錯，請參閱 [Qualcomm Linux 除錯指南](https://docs.qualcomm.com/doc/80-70020-12/topic/landing_page.html)。

## 使用 printk 進行除錯

使用 `printk` 技術在 Linux 核心中除錯，以列印訊息並進行追蹤。

在 `include/linux/printk.h` 中定義的 printk 包裝函式支援將紀錄層級新增至紀錄陳述式。比如：

pr_emerg("At line %d: Func: %s\n", __LINE__, __func__);
    pr_info("At line");
    Copy to clipboard

如需更多資訊，請參閱 [Message logging with printk](https://www.kernel.org/doc/html/next/core-api/printk-basics.html)。

## 編譯裝置樹

若要對裝置樹進行除錯，請執行以下操作：

1. 使用 `devtool modify linux-qcom-custom` 命令複製核心程式碼。
2. 在裝置樹中進行變更。
3. 使用 `bitbake dtb-qcom-image` 命令建置 DTB。
4. 使用 `fastboot` 命令將 `build-qcom-wayland/tmp-glibc/deploy/images/qcs6490-rb3gen2-vision-kit/dtb-qcom-image-qcs6490-rb3gen2-vision-kit.rootfs.vfat` (與 dtb.bin 相同) 燒錄至 `dtb_a` 和 `dtb_b` 分區。
5. 重新啟動裝置。

## 對核心模組進行除錯

若要對核心模組進行除錯，請執行以下操作：

1. 使用 `devtool modify linux-qcom-custom` 命令複製核心程式碼。
2. 使用以下 `menuconfig` 命令停用核心模組簽署組態 `CONFIG_MODULE_SIG`：

CONFIG_MODULE_SIG
        Copy to clipboard

CONFIG_MODULE_SIG_FORCE
        Copy to clipboard

備註

這是一次性步驟。
3. 在核心或模組中進行變更。
4. 使用 `bitbake esp-qcom-image` 命令重建核心模組。
5. 將 `tmp-glibc/deploy/images/qcs6490-rb3gen2-vision-kit/linux-qcs6490-rb3gen2-vision-kit.efi` 核心映像推送至裝置的 `/tmp` 目錄，並將它重新命名為 `vmlinuz` (核心二進位檔案)。
6. 使用 `cp /tmp/vmlinuz /boot/ostree/poky-<SHA>/vmlinuz-6.6.52-03343-gdfbbed24a2c5-dirty` 命令更新核心。
7. 將 `build-qcom-wayland/tmp-glibc/deploy/images/qcs6490-rb3gen2-vision-kit/modules--6.6-r0-qcs6490-rb3gen2-vision-kit-<DATE>.tgz` 核心模組推送至裝置的 `/tmp` 目錄。
8. 使用 `mount -o remount,rw /` 和 `mount -o remount,rw /usr` 命令重新掛載根。
9. 使用 `tar -xzf modules--6.6-r0-qcs6490-rb3gen2-vision-kit-<DATE>.tgz` 命令進行解壓縮。
10. 使用 `cp -rf /tmp/lib/modules/6.6.65-debug-04076-g029659012248-dirty/ /lib/modules/` 命令更新核心模組。
11. 重新啟動裝置。

## 使用紀錄層級進行除錯

您可以使用在 `/linux/printk.h` 中定義的任何其他紀錄層級來列印訊息。使用在 printk 中使用的紀錄層級以及在裝置上選擇的紀錄層級來控制主控台紀錄。

依據使用案例選擇紀錄層級。如果在經常呼叫的函式中選擇較低的紀錄層級，可能會產生大量紀錄。

以下範例呈現核心列印層級的紀錄：

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__);
    Copy to clipboard

## 啟用並掛載 debugfs 檔案系統

Debugfs 是一種檔案系統，允許核心開發者將核心資訊提供給使用者空間。

Debugfs 用來存取核心資料結構和變數、追蹤事件、除錯訊息以及統計數據。

- 確保核心組態已設定 `CONFIG_DEBUG_FS` (預設為啟用)。
- 若未啟用，您可以使用 `menuconfig` 在核心組態中加以啟用。
- 如果預設未掛載，則掛載 debugfs。

mount -t debugfs none /sys/kernel/debug
        Copy to clipboard

## 使用核心探測器進行除錯

Kprobes 允許你在任何核心函式中插入斷點，並在不中斷系統運作的情況下收集除錯與效能資訊。

當斷點被觸發時，核心程式碼的位址會透過處理函式（handler routine）被攔截，以執行相應的操作。Kprobes 在排程器除錯時非常有用，因為它可以在不同的排程事件中產生追蹤資料，以協助理解系統行為。

如需更多資訊，請參閱 [Kernel Probes](https://www.kernel.org/doc/html/next/trace/kprobes.html)。

## 配置 Ftrace 以進行剖析和追蹤

ftrace 提供追蹤公用程式，支援全系統剖析和執行階段追蹤。

欲深入瞭解 ftrace，請參閱 [函式追蹤](https://docs.qualcomm.com/bundle/publicresource/topics/80-70020-12/debugging_linux_kernel.html#function-tracer)。

### 啟用記憶體映射輸入/輸出追蹤

Qualcomm Linux 核心中的記憶體映射 I/O (MMIO) 追蹤提供資訊，以瞭解驅動程式如何與 MMIO 裝置及其相關硬體狀態互動。

通用 MMIO 追蹤使用 `__raw_{read,write}{b,l,w,q}` 存取器從/向記憶體映射暫存器進行讀取/寫入。

在下列情況下，裝置會停擺，或某些未定義的行為會導致裝置崩潰：

> 
> 
> 表：裝置崩潰的原因
> 
> 
> | 原因 | 說明 |
> | --- | --- |
> | 無時控存取 | 如果對暫存器空間的存取無時控，裝置會崩潰。 |
> | 暫存器空間受保護 | 如果暫存器空間受保護且不允許存取非安全區，則會發生例外。例如，僅允許例外層級 (EL3) 存取，禁止任何 EL2/EL1 存取。 |
> | xPU 控制 | xPU 記憶體保護單元控制特定用戶端對某些記憶體或暫存器區域的存取。 |

上述情況會導致立即重新啟動、同步錯誤 (SError)/單晶片網路 (NoC) 問題或互連停擺。`CONFIG_TRACE_MMIO_ACCESS` 提供 ftrace 追蹤事件以記錄此類 MMIO 暫存器存取，提供追蹤事件的早期啟用、篩選功能，以及在主控台上傾印 ftrace 紀錄的功能。

以下是啟用 MMIO 追蹤時的追蹤緩衝區範例輸出：

# List all rwmmio trace events
      cat /sys/kernel/tracing/available_events | grep rwmmio
    
    # Enable all rwmmio trace events
      cat /sys/kernel/tracing/available_events | grep rwmmio >> /sys/kernel/tracing/set_event
    
    # List all traces
      cat /sys/kernel/tracing/trace
    rwmmio_read: gic_peek_irq+0xd0/0xd8 readl addr=0xffff800010040104
    rwmmio_write: gic_poke_irq+0xe4/0xf0 writel addr=0xffff800010040184
    rwmmio_read: gic_do_wait_for_rwp+0x54/0x90 readl addr=0xffff800010040000
    rwmmio_write: gic_set_affinity+0x1bc/0x1e8 writeq addr=0xffff800010046130
    Copy to clipboard

Last Published: Jan 01, 2026

[Previous Topic
擷取核心紀錄](https://docs.qualcomm.com/bundle/publicresource/80-70020-3TC/topics/capture-the-kernel-logs.md) [Next Topic
從裝置存取內容](https://docs.qualcomm.com/bundle/publicresource/80-70020-3TC/topics/access-content-from-the-device.md)