系统性资源不足模拟

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

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

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

注意 ,对于 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
    

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

    常规

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

    OPTION 说明

    enableboottime

    在计算机重新启动时启用故障注入。

    disableboottime

    在计算机重新启动时禁用错误注入(这是默认设置)。

    recordboottime

    在计算机重启模式时启用故障注入

    resetboottime

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

    enableruntime

    动态启用故障注入。

    disableruntime

    动态禁用故障注入。

    recordruntime

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

    resetruntime

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

    querystatistics

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

    incrementcounter

    递增用于确定何时注入错误的测试传递计数器。

    getstackid COUNTER

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

    excludestack STACKID

    从故障注入中排除堆栈。

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

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

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

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

运行调试器扩展

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

    !verifier 0x800
    

这会将信息转储到调试器,其中显示了最近注入的失败中的调用堆栈。