系统性资源不足模拟

系统资源不足模拟选项在内核模式驱动程序中注入资源故障。 此选项会渗透到驱动程序错误处理路径中。 从历史上看,测试这些路径非常困难。 系统资源不足模拟选项以可预测的方式注入资源故障,使发现的问题可重现。 由于错误路径易于重现,因此也可以轻松地验证这些问题的修复。

为了帮助你确定错误的根本原因,我们提供了一个调试器扩展,可以确切地告知你已注入哪些故障以及按什么顺序注入。

谨慎 在验证计算机上的所有 (或大量) 驱动程序集合时,此选项不适合使用。 仅当对单个驱动程序或其附加的筛选器驱动程序执行定向测试时,才应使用此选项。 同时对大量驱动程序使用此选项可能会导致不可预知的结果,并且可能会强制与测试) (驱动程序无关的组件崩溃。

注意对于Windows 8.1,WDK 8 中提供的基于堆栈的故障注入功能已集成到驱动程序验证程序中。 在运行Windows 8.1的计算机上,使用系统的低资源模拟选项。

在特定驱动程序上启用系统资源不足模拟选项时,它会截获从该驱动程序到内核的一些调用,并 Ndis.sys。 系统的资源不足模拟将查看调用堆栈,具体而言,查看来自启用调用堆栈的驱动程序的部分。 如果这是它第一次看到该堆栈,它将根据该调用的语义使调用失败。 否则,如果之前已看到该调用,它将通过未受影响传递。 系统的资源不足模拟包含用于处理驱动程序可以多次加载和卸载这一事实的逻辑。 它将识别到调用堆栈是相同的,即使驱动程序重新加载到不同的内存位置。

激活此选项

可以使用驱动程序验证程序管理器或 Verifier.exe 命令行为一个或多个驱动程序激活系统性资源不足模拟功能。 有关详细信息,请参阅 选择驱动程序验证程序选项。 必须重新启动计算机才能激活或停用系统资源不足模拟选项。

  • 在命令行

    Windows 11

    在命令行上,系统性低资源模拟由 验证程序 /rc 19 36验证程序 /dif 19 表示,这两者都包含所需的 DIF 模式。

    该功能将在下一次启动后处于活动状态,或者如果 /now 添加到命令字符串中,则立即处于活动状态。

    Windows 10及以下

    在命令行上,系统性资源不足模拟由 验证程序 /flags 0x040000 (Bit 18) 表示。 若要系统化低资源模拟,请使用0x040000标志值或向标志值添加0x040000。 例如:

    verifier /flags 0x040000 /driver MyDriver.sys
    

    下次启动后,该功能将处于活动状态。

    常规

    启用系统资源不足模拟选项时,可以使用 /faultssystematicOPTION 命令行选项进一步控制系统资源不足模拟。

    OPTION 说明

    enableboottime

    在计算机重启之间启用故障注入。

    disableboottime

    禁用跨计算机重启的错误注入, (这是默认设置) 。

    recordboottime

    如果跨计算机重启,则启用模式中的故障注入。

    resetboottime

    在计算机重新启动时禁用错误注入,并清除堆栈排除列表。

    enableruntime

    动态启用故障注入。

    disableruntime

    动态禁用故障注入。

    recordruntime

    what if 模式下动态启用故障注入。

    resetruntime

    动态禁用故障注入并清除以前出错的堆栈列表。

    querystatistics

    显示当前故障注入统计信息。

    incrementcounter

    递增用于标识何时注入故障的测试通过计数器。

    getstackid COUNTER

    检索指示的注入堆栈标识符。

    excludestack STACKID

    从故障注入中排除堆栈。

  • 使用驱动程序验证程序管理器

    1. 启动驱动程序验证程序管理器。 在命令提示符窗口中键入 验证程序
    2. 选择“ 为代码开发人员) 创建自定义设置 ( ”,然后单击“ 下一步”。
    3. 从完整列表中选择“选择单个设置”。
    4. 选择“ (检查) 系统资源不足模拟”。
    5. 重新启动计算机。

调试系统资源不足模拟导致的 bug 检查

系统资源不足模拟发现的大部分问题都会导致 bug 检查。 为了帮助确定这些代码 bug 的原因, 适用于 Windows 的调试工具 提供了调试器扩展 (kdexts.dll) 和必要的符号。

运行调试器扩展

  • 在调试器命令提示符下,键入以下命令:

    !verifier 0x800
    

这会将信息转储到调试器,显示最近注入的故障的调用堆栈。