# 디버그 방법 구성

다음 방법을 사용하여 커널을 디버그하는 방법의 전반적인 분류를 이해하고, Qualcomm Linux 커널의 고유한 디버그 기능을 통해 식별된 문제를 보고할 수 있습니다.

디버그에 대한 자세한 내용은 [Qualcomm Linux 디버그 가이드](https://docs.qualcomm.com/doc/80-70020-12/topic/landing_page.html) 를 참조하세요.

## printk를 사용한 디버그

메시지 출력 및 추적을 위한 Linux 커널을 디버깅하려면 `printk` 기술을 사용하세요.

`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를 사용하면 어떤 커널 루틴이든 진입하여 중단 없이 디버깅하고 성능 정보를 수집할 수 있습니다.

커널 코드 주소는 핸들러 루틴을 사용하여 중단점에 도달했을 때 호출되도록 트랩됩니다. 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 메모리 보호 유닛은 특정 클라이언트의 특정 메모리 또는 레지스터 영역에 대한 액세스를 제어합니다. |

이전의 시나리오는 즉각적인 재부팅, 동기화 오류(SErrors)/네트워크온칩(NoC) 문제 또는 상호 연결 중단을 유발합니다. `CONFIG_TRACE_MMIO_ACCESS` 는 이러한 MMIO 레지스터 액세스를 로깅하는 ftrace 추적 이벤트를 제공하여, 추적 이벤트의 조기 활성화, 필터링 기능, 그리고 콘솔에서 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-3KO/topics/capture-the-kernel-logs.md) [Next Topic
기기에서 콘텐츠에 액세스](https://docs.qualcomm.com/bundle/publicresource/80-70020-3KO/topics/access-content-from-the-device.md)