# Đặt cấu hình phương pháp gỡ lỗi

Sử dụng các phương pháp sau để hiểu cách phân loại tổng quan các phương pháp gỡ lỗi kernel, và báo cáo các vấn đề được phát hiện thông qua các tính năng gỡ lỗi tích hợp sẵn trong kernel Linux của Qualcomm.

Để biết thêm thông tin về gỡ lỗi, hãy xem [Hướng dẫn gỡ lỗi Qualcomm Linux](https://docs.qualcomm.com/doc/80-70020-12/topic/landing_page.html).

## Gỡ lỗi bằng printk

Sử dụng kỹ thuật `printk` để gỡ lỗi trong Linux kernel dùng cho việc hiển thị thông báo và truy vết.

Các wrappers cho printk được định nghĩa trong `include/linux/printk.h` hỗ trợ việc thêm mức độ log vào các câu lệnh log của bạn. Ví dụ:

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

Để biết thêm thông tin, hãy xem phần [Message logging with printk](https://www.kernel.org/doc/html/next/core-api/printk-basics.html).

## Biên dịch device tree

Để gỡ lỗi device tree, hãy thực hiện như sau:

1. Sao chép mã kernel bằng lệnh `devtool modify linux-qcom-custom`.
2. Thực hiện các thay đổi trong device tree.
3. Tạo DTB bằng lệnh `bitbake dtb-qcom-image`.
4. Flash `build-qcom-wayland/tmp-glibc/deploy/images/qcs6490-rb3gen2-vision-kit/dtb-qcom-image-qcs6490-rb3gen2-vision-kit.rootfs.vfat` (tương tự như dtb.bin) vào các phân vùng `dtb_a` và `dtb_b` bằng lệnh `fastboot`.
5. Khởi động lại thiết bị.

## Gỡ lỗi mô-đun kernel

Để gỡ lỗi mô-đun kernel, hãy thực hiện như sau:

1. Sao chép mã kernel bằng lệnh `devtool modify linux-qcom-custom`.
2. Vô hiệu hóa cấu hình ký số cho mô-đun kernel, `CONFIG_MODULE_SIG` bằng các lệnh `menuconfig` sau:

CONFIG_MODULE_SIG
        Copy to clipboard

CONFIG_MODULE_SIG_FORCE
        Copy to clipboard

Ghi chú

Đây là bước thực hiện một lần.
3. Thực hiện các thay đổi trong kernel hoặc mô-đun.
4. Tạo lại mô-đun kernel bằng lệnh `bitbake esp-qcom-image`.
5. Đẩy ảnh kernel `tmp-glibc/deploy/images/qcs6490-rb3gen2-vision-kit/linux-qcs6490-rb3gen2-vision-kit.efi` vào thiết bị tại thư mục `/tmp` và đổi tên thành `vmlinuz` (kernel binary).
6. Cập nhật kernel bằng lệnh `cp /tmp/vmlinuz /boot/ostree/poky-<SHA>/vmlinuz-6.6.52-03343-gdfbbed24a2c5-dirty`.
7. Đẩy mô-đun kernel `build-qcom-wayland/tmp-glibc/deploy/images/qcs6490-rb3gen2-vision-kit/modules--6.6-r0-qcs6490-rb3gen2-vision-kit-<DATE>.tgz` vào thiết bị tại thư mục `/tmp`.
8. Remount rootfs bằng các lệnh `mount -o remount,rw /` và `mount -o remount,rw /usr`.
9. Giải nén bằng lệnh `tar -xzf modules--6.6-r0-qcs6490-rb3gen2-vision-kit-<DATE>.tgz`.
10. Cập nhật mô-đun kernel bằng lệnh `cp -rf /tmp/lib/modules/6.6.65-debug-04076-g029659012248-dirty/ /lib/modules/`.
11. Khởi động lại thiết bị.

## Gỡ lỗi bằng mức độ log

Bạn có thể hiển thị thông báo bằng bất kỳ mức độ log nào khác được định nghĩa trong `/linux/printk.h`. Console log được kiểm soát bằng mức độ log được dùng trong printk và mức độ log được chọn trên thiết bị.

Chọn mức độ log theo use case. Bạn có thể thấy nhiều log nếu chọn mức độ log thấp hơn trong một hàm thường được gọi.

Ví dụ sau đây mô tả các mức độ log ở kernel:

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

## Kích hoạt và mount debugfs

Debugfs là một hệ thống tệp cho phép các nhà phát triển kernel cung cấp thông tin kernel cho không gian người dùng.

Debugfs được dùng để truy cập các biến và cấu trúc dữ liệu kernel, trace events, thông báo gỡ lỗi và số liệu thống kê.

- Đảm bảo rằng cấu hình kernel của bạn đã đặt `CONFIG_DEBUG_FS` (được bật theo mặc định).
- Nếu không, bạn có thể bật nó trong cấu hình kernel bằng cách sử dụng `menuconfig`.
- Mount debugfs nếu nó không được mount theo mặc định.

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

## Gỡ lỗi bằng kernel probes

Kprobes cho phép bạn xâm nhập vào bất kỳ chương trình kernel nào và thu thập thông tin gỡ lỗi cũng như hiệu năng mà không gây gián đoạn.

Địa chỉ mã của kernel được bắt giữ thông qua một hàm xử lý (handler routine) để gọi khi breakpoint bị kích hoạt. Kprobes rất hữu ích trong quá trình gỡ lỗi bộ lập lịch (scheduler), khi bạn tạo các bản trace tại các sự kiện lập lịch khác nhau để phân tích hành vi của hệ thống.

Để biết thêm thông tin, hãy xem [Kernel Probes](https://www.kernel.org/doc/html/next/trace/kprobes.html).

## Cấu hình Ftrace để phân tích hiệu năng và tracing

Ftrace cung cấp các tiện ích theo dõi cho phép tạo cấu hình toàn hệ thống và theo dõi trong runtime.

Để biết thêm thông tin về ftrace, hãy xem [Function trace](https://docs.qualcomm.com/bundle/publicresource/topics/80-70020-12/debugging_linux_kernel.html#function-tracer).

### Bật tính năng trace đầu vào/đầu ra được ánh xạ vào bộ nhớ

Tính năng trace I/O được ánh xạ vào bộ nhớ (MMIO) trong Qualcomm Linux kernel cung cấp thông tin để hiểu cách driver  tương tác với các thiết bị MMIO và trạng thái phần cứng liên quan của chúng.

Tính năng trace MMIO chung sử dụng bộ truy cập `__raw_{read,write}{b,l,w,q}` để đọc/ghi từ/vào các thanh ghi được ánh xạ vào bộ nhớ.

Trong các trường hợp sau, thiết bị bị treo hoặc một số hành vi không xác định dẫn đến lỗi crash thiết bị:

> 
> 
> Bảng: Nguyên nhân gây ra lỗi thiết bị
> 
> 
> | Nguyên nhân | Giải thích |
> | --- | --- |
> | Quyền truy cập bị chặn | Nếu quyền truy cập vào không gian thanh ghi bị chặn, thiết bị sẽ bị lỗi crash. |
> | Không gian thanh ghi được bảo vệ | Nếu không gian thanh ghi được bảo vệ và không được thiết lập để truy cập vào không gian không bảo mật thì sẽ xảy ra lỗi exceptions. Ví dụ: chỉ cho phép truy cập ở mức exception (EL3) và cấm truy cập ở mức EL2/EL1. |
> | Kiểm soát xPU | Các đơn vị bảo vệ bộ nhớ xPU kiểm soát quyền truy cập vào một số vùng bộ nhớ hoặc thanh ghi của các client cụ thể. |

Các tình huống ở trên dẫn đến khởi động lại ngay lập tức, lỗi đồng bộ (SErrors)/sự cố mạng trên chip (NoC) hoặc treo kết nối. `CONFIG_TRACE_MMIO_ACCESS` cung cấp các sự kiện ftrace để ghi lại các lần truy cập thanh ghi MMIO, cung cấp khả năng kích hoạt sớm các sự kiện trace, tính năng lọc và tính năng ghi log ftrace ra console.

Sau đây là mẫu đầu ra từ buffer trace khi tính năng trace MMIO được bật:

# 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
Ghi lại kernel log](https://docs.qualcomm.com/bundle/publicresource/80-70020-3VI/topics/capture-the-kernel-logs.md) [Next Topic
Truy cập nội dung trên thiết bị](https://docs.qualcomm.com/bundle/publicresource/80-70020-3VI/topics/access-content-from-the-device.md)