借助 Linux debugfs
来检测内核栈使用状态及溢出检测
工具
Linux
内核中有 KASAN
和 kmemcheck
KASAN
只支持 arm64
和 x86
,见内核文档 Documentation/features/debug/KASAN/arch-support.txt
kmemcheck
仅支持 x86
因此在 arm
下使用 debugfs
来跟踪内核栈使用情况
内核配置
debugfs
支持ftrace
支持Kernel hacking -> Tracers -> [*] Trace max stack
使用
# mount -t debugfs nodev /sys/kernel/debug
# echo 1 > /proc/sys/kernel/stack_tracer_enabled
检查以下状态
# cat /sys/kernel/debug/tracing/stack_max_size
# cat /sys/kernel/debug/tracing/stack_trace
# cat /sys/kernel/debug/tracing/stack_max_size
7272
# cat /sys/kernel/debug/tracing/stack_trace
Depth Size Location (61 entries)
----- ---- --------
0) 7080 224 select_task_rq_fair+0x3be/0x980
1) 6856 112 try_to_wake_up+0x14a/0x400
2) 6744 16 wake_up_process+0x15/0x20
3) 6728 16 wakeup_softirqd+0x35/0x40
4) 6712 48 raise_softirq_irqoff+0x4f/0x90
5) 6664 48 __blk_complete_request+0x132/0x140
6) 6616 16 blk_complete_request+0x25/0x30
7) 6600 32 scsi_done+0x2f/0x60
8) 6568 48 megasas_queue_command+0xd1/0x140 [megaraid_sas]
9) 6520 48 scsi_dispatch_cmd+0x1ac/0x340
10) 6472 96 scsi_request_fn+0x415/0x590
11) 6376 32 __generic_unplug_device+0x32/0x40
stack_max_size
内核栈使用的峰值stack_trace
表示此峰值下的callstack
和callstack
中个个函数使用的栈的大小