使用 Linux Kernel Dump Test Module (LKDTM) 触发崩溃

lkdtm 模块提供了一个接口,用于在预定义的代码位置中断(通常是崩溃)内核,以评估内核异常处理的可靠性,并测试使用不同转储解决方案获得的崩溃转储。 该模块使用 KPROBEs 来检测触发位置,但也可以通过 debugfs 直接触发内核,而无需 KPROBE 支持。

您可以通过在插入模块时使用模块参数,或者通过 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