使用 Linux 内核转储测试模块 (LKDTM) 引发崩溃¶
lkdtm 模块提供了一个接口,用于在预定义的代码位置破坏(通常是导致崩溃)内核,以评估内核异常处理的可靠性,并测试使用不同转储解决方案获得的崩溃转储。该模块使用 KPROBEs 对触发位置进行插桩,但也无需 KPROBE 支持,即可通过 debugfs 直接触发内核。
你可以通过在插入模块时传递模块参数,或者通过 debugfs 接口,来选择触发器的位置(“崩溃点名称”)和动作类型(“崩溃点类型”)。
用法
insmod lkdtm.ko [recur_count={>0}] cpoint_name=<> cpoint_type=<>
[cpoint_count={>0}]
- recur_count
栈溢出测试的递归级别。默认情况下,这是根据内核配置动态计算的,目标是刚好足以耗尽内核栈。该值可在 /sys/module/lkdtm/parameters/recur_count 中查看。
- cpoint_name
在内核中的何处触发该动作。它可以是 INT_HARDWARE_ENTRY、INT_HW_IRQ_EN、INT_TASKLET_ENTRY、FS_SUBMIT_BH、MEM_SWAPOUT、TIMERADD、SCSI_QUEUE_RQ 或 DIRECT 之一。
- cpoint_type
指示到达崩溃点时要采取的动作。这些动作有很多,最好直接从 debugfs 查询。一些常见的动作包括 PANIC、BUG、EXCEPTION、LOOP 和 OVERFLOW。有关完整列表,请查看 /sys/kernel/debug/provoke-crash/DIRECT 的内容。
- cpoint_count
指示在触发动作之前需要到达崩溃点的次数。默认值为 10(DIRECT 除外,它总是立即触发)。
你也可以通过挂载 debugfs 并将类型写入 <debugfs>/provoke-crash/<crashpoint> 来引发故障。例如:
mount -t debugfs debugfs /sys/kernel/debug
echo EXCEPTION > /sys/kernel/debug/provoke-crash/INT_HARDWARE_ENTRY
特殊文件 DIRECT 将直接引发该动作,而无需 KPROBE 插桩。当模块是为不支持 KPROBE 的内核构建时,这是唯一可用的模式。
# Instead of having a BUG kill your shell, have it kill "cat":
cat <(echo WRITE_RO) >/sys/kernel/debug/provoke-crash/DIRECT