Linux Kernel Debugging

CONFIG_DEBUG_FS

如何在 WSL2 上启用 debugfs

确认下内核是否开启了 debugfs

1
zcat /proc/config.gz | grep CONFIG_DEBUG_FS

要想使用 debugfs,首先要挂载它到 /sys/kernel/debug

1
mount -t debugfs none /sys/kernel/debug/

如果想让挂载在系统重启后自动挂载,在 /etc/fstab 加下面一行

1
debugfs     /sys/kernel/debug       debugfs defaults        0 0

在添加后,执行 mount -a 命令将看到 /sys/kernel/debug 文件系统的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ ls -ld ./* | sort -k 1.2
--w------- 1 root root 0 May 19 17:03 ./clear_warn_once
--w------- 1 root root 0 May 19 17:03 ./split_huge_pages
-r--r--r-- 1 root root 0 May 19 17:03 ./devices_deferred
-r--r--r-- 1 root root 0 May 19 17:03 ./sleep_time
-rw-r--r-- 1 root root 0 May 19 17:03 ./fault_around_bytes
drwx------ 8 root root 0 May 19 17:03 ./tracing
drwxr-xr-x 2 root root 0 May 19 17:03 ./acpi
drwxr-xr-x 2 root root 0 May 19 17:03 ./btt
drwxr-xr-x 2 root root 0 May 19 17:03 ./ceph
drwxr-xr-x 2 root root 0 May 19 17:03 ./clk
drwxr-xr-x 2 root root 0 May 19 17:03 ./device_component
drwxr-xr-x 2 root root 0 May 19 17:03 ./dma_buf
drwxr-xr-x 2 root root 0 May 19 17:03 ./error_injection
drwxr-xr-x 2 root root 0 May 19 17:03 ./extfrag
drwxr-xr-x 2 root root 0 May 19 17:03 ./hid
drwxr-xr-x 2 root root 0 May 19 17:03 ./kprobes
drwxr-xr-x 2 root root 0 May 19 17:03 ./kvm
drwxr-xr-x 2 root root 0 May 19 17:03 ./ramdisk_pages
drwxr-xr-x 2 root root 0 May 19 17:03 ./ras
drwxr-xr-x 2 root root 0 May 19 17:03 ./swiotlb
drwxr-xr-x 2 root root 0 May 19 17:03 ./usb
drwxr-xr-x 2 root root 0 May 19 17:03 ./virtio-ports
drwxr-xr-x 2 root root 0 May 19 17:03 ./x86
drwxr-xr-x 3 root root 0 May 19 17:03 ./dri
drwxr-xr-x 3 root root 0 May 19 17:03 ./sched
drwxr-xr-x 29 root root 0 May 19 17:03 ./block
drwxr-xr-x 35 root root 0 May 19 17:03 ./bdi

/sys/kernel/debug 目录的权限是 700, 只有 root 用户才能进入,sudo 也不行

CONFIG_DEBUG_ATOMIC_SLEEP

dma_fence_wait_timeout() 会睡眠调用进程直到 fence 被 signaled 或者指定定时器超时。该函数中会调用 might_sleep() 来标识 (annotation) 调用进程可能进入睡眠状态,并打印源文件名和行号,帮助调试。 但只有内核配置了 CONFIG_DEBUG_ATOMIC_SLEEP 才有效,否则 __might_sleep() 是一个空函数。

CONFIG_DRM_USE_DYNAMIC_DEBUG

References

[1] https://access.redhat.com/solutions/5914171