커널을 디버깅할 때 미리 켜두면 좋은 Kconfig 옵션들을 목적별로 정리한다. 대부분 CONFIG_DEBUG_KERNEL=y가 함께 켜져 있어야 메뉴에 노출되는 옵션들이다.
KASAN
KASAN(Kernel Address SANitizer)은 커널 메모리의 out-of-bounds 접근이나 use-after-free를 런타임에 탐지한다.
CONFIG_KASAN=y
Kernel Lockup Debug
Kernel이 hard / soft lockup을 인지(detect)하기 위한 watchdog을 실행하려면 아래 옵션을 켠다.
CONFIG_SOFTLOCKUP_DETECTOR=y
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=1
CONFIG_DETECT_HUNG_TASK=y
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
CONFIG_BOOTPARAM_HUNG_TASK_PANIC=0
CONFIG_SOFTLOCKUP_DETECTOR는 CPU가 일정 시간 스케줄링되지 못하면 soft lockup으로 판단하는 watchdog을 켠다. CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC을 1로 설정하면 soft lockup 감지 시 경고 출력에 그치지 않고 즉시 panic을 발생시킨다. CONFIG_DETECT_HUNG_TASK와 CONFIG_DEFAULT_HUNG_TASK_TIMEOUT은 프로세스가 D state(uninterruptible sleep)로 지정한 시간(초) 이상 머무르면 hung task로 판단하도록 하고, CONFIG_BOOTPARAM_HUNG_TASK_PANIC을 1로 바꾸면 이 경우에도 panic한다.
spinlock 오용(초기화되지 않은 락 사용, atomic 구간에서 sleep 등)을 잡아내려면 다음을 켠다.
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_ATOMIC_SLEEP=y
mutex 오용을 잡아내려면 다음을 켠다.
CONFIG_DEBUG_MUTEXES=y
Kmemleak
Kmemleak은 할당 후 해제되지 않고 남은(leak) 커널 메모리를 탐지한다.
CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_MEM_POOL_SIZE=4096
CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y
CONFIG_DEBUG_KMEMLEAK_MEM_POOL_SIZE는 kmemleak이 내부적으로 사용하는 메모리 풀 크기를 지정한다(예전 커널에서는 CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE라는 이름이었다). CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF를 켜면 부팅 시 자동으로 스캔하지 않고, 필요할 때 echo scan > /sys/kernel/debug/kmemleak로 수동 실행할 수 있다.
SLUB Debug
SLUB 할당자의 디버그 기능으로, double free나 redzone 오버플로우 같은 힙 손상을 탐지한다.
CONFIG_SLUB_DEBUG=y
CONFIG_SLUB_DEBUG_ON=y
CONFIG_SLUB_DEBUG는 디버그 기능 자체를 커널에 포함하지만 기본은 꺼진 상태이고, 부팅 커맨드라인에 slab_debug= 옵션을 줘야 켜진다. CONFIG_SLUB_DEBUG_ON을 함께 켜면 부팅 옵션 없이도 기본으로 활성화되며, 필요하면 slab_debug=- 부팅 옵션으로 끌 수 있다.
Stack Protector
스택 버퍼 오버플로우(stack smashing)를 탐지하는 스택 프로텍터(canary) 옵션이다.
CONFIG_STACKPROTECTOR=y
CONFIG_STACKPROTECTOR_STRONG=y
함수 지역 변수에 카나리(canary) 값을 심어 두고 함수 종료 시 값이 변조됐는지 검사해 스택 오버플로우를 탐지한다. CONFIG_STACKPROTECTOR_STRONG은 배열이나 지역 변수의 주소를 사용하는 함수까지 더 폭넓게 카나리를 적용한다(커널 4.18 이전에는 CONFIG_CC_STACKPROTECTOR, CONFIG_CC_STACKPROTECTOR_REGULAR/STRONG이라는 이름이었으나, 이후 CC_ 접두사가 빠진 현재 이름으로 통합됐다).
좋은 글이네요. 비슷한 작업에 AI Image Animator() 쓰고 있습니다. AI Image Animator