如何分析 IRP 覆盖范围数据
注意Windows 10不再需要驱动程序覆盖率工具包,并且安装程序不再包含在 WDK 中。 若要执行Windows 10中所述的任务,请改用驱动程序验证器和IRP 日志记录。
本主题提供指南来帮助你分析 IRP 覆盖率数据。 有关帮助你收集 IRP 覆盖率数据的指南,请参阅 如何收集 IRP 覆盖率数据。
在测试计算机上收集一个或多个设备的 IRP 覆盖率数据后,可以使用 覆盖率测试 (设备基础知识) 根据此数据生成报告。 这些报告显示进入或离开指定设备的驱动程序堆栈的单个 I/O 请求数据包 (IRP) 的计数。 还会报告未进入或离开驱动程序堆栈的 IRP 类型。
在本主题中,我们使用从 IRP 覆盖率数据生成的报表,该数据为测试计算机上的设备节点 (devnode) 启用。 开发节点为 9740,以前通过在测试计算机上运行 启用 IRP 覆盖率数据收集 工具为开发节点启用 IRP 覆盖率。
有关设置 WDK 和 Visual Studio 测试环境的信息,请参阅 如何在运行时使用 Visual Studio 测试驱动程序。 有关选择和配置测试和工具参数的信息,请参阅 如何选择和配置设备基础测试。
收集 IRP 覆盖率数据后,通过在测试计算机上运行 显示收集的 IRP 覆盖率数据 工具,生成此开发节点的 IRP 覆盖率报告。
Drvcov /C 9740
IRP 覆盖率报告包含四个部分:
报表标头
本部分提供有关设备的信息,其 IRP 覆盖率数据显示在报告中。
devnode 9740 的 IRP 覆盖率报告如下所示。
Getting coverage data
Data source
Source Type: Driver
Source Name: \\.\DrvcovControl1
Device
Friendly Name : Disk drive
Class Name : DiskDrive
Device ID : IDE\DISKST9320421AS_____________________________SD13____\5&37E07111&0&0.0.0
Device # : 1
Devnode # : 9740
IRP 主要 (MJ) 和次要 (MN) 覆盖率数据
本部分显示 IRP MJ 及其从属 MN 函数代码的计数器,这些代码由驱动程序在 IRP 覆盖率期间为指定的开发节点进行处理。 驱动程序覆盖率工具包监视和报告 52 个 IRP MJ 和 MJ 函数代码。
本节提供有关以下方面的信息:
驱动程序处理的每个 IRP MJ 和 MN 函数代码的计数器。 这些计数器可用于确定哪些 IRP 具有足够的测试覆盖范围,哪些可能需要更多覆盖范围。
驱动程序未处理的 IRP MJ 和 MN 函数代码的列表。 此信息非常重要,可以提供有关代码覆盖率测试中的缺陷的见解。
注意 决定要测试哪些 IRP 取决于驱动程序和驱动程序支持的 IRP。 IRP MJ 和 MN 覆盖率数据可以帮助你评估驱动程序的代码覆盖率测试的效率。
以下示例显示了 devnode 9740 的 IRP MJ 和 MN 覆盖率数据:
|--------------------------------------------------------|
| MJ & MN Device irp coverage |
|--------------------------------------------------------|
| IRPS covered 19 | # of times |
|--------------------------------------------------------|
| Unknown | 5 |
| PNP\QUERY_RESOURCE_REQUIREMENTS | 3 |
| PNP\FILTER_RESOURCE_REQUIREMENTS | 3 |
| PNP\START_DEVICE | 8 |
| DEVICE_CONTROL | 293 |
| READ | 2543 |
| PNP\QUERY_CAPABILITIES | 3 |
| PNP\QUERY_PNP_DEVICE_STATE | 7 |
| CREATE | 44 |
| CLEANUP | 45 |
| CLOSE | 43 |
| WRITE | 2488 |
| WMI\REGINFO_EX | 5 |
| WMI\REGINFO | 5 |
| FLUSH_BUFFERS | 1491 |
| PNP\QUERY_DEVICE_RELATIONS\Target | 23 |
| WMI\QUERY_ALL_DATA | 6 |
| POWER\QUERY_POWER\SYSTEM | 2 |
| SHUTDOWN | 2 |
|--------------------------------------------------------|
| IRPS NOT covered 33 | |
|--------------------------------------------------------|
| INTERNAL_DEVICE_CONTROL | |
| POWER\WAIT_WAKE | |
| POWER\SET_POWER\SYSTEM | |
| POWER\SET_POWER\DEVICE | |
| POWER\QUERY_POWER\DEVICE | |
| WMI\QUERY_SINGLE_INSTANCE | |
| WMI\CHANGE_SINGLE_INSTANCE | |
| WMI\CHANGE_SINGLE_ITEM | |
| WMI\ENABLE_EVENTS | |
| WMI\DISABLE_EVENTS | |
| WMI\ENABLE_COLLECTION | |
| WMI\DISABLE_COLLECTION | |
| WMI\EXECUTE_METHOD | |
| PNP\QUERY_REMOVE_DEVICE | |
| PNP\REMOVE_DEVICE | |
| PNP\CANCEL_REMOVE_DEVICE | |
| PNP\STOP_DEVICE | |
| PNP\QUERY_STOP_DEVICE | |
| PNP\CANCEL_STOP_DEVICE | |
| PNP\QUERY_DEVICE_RELATIONS\Bus | |
| PNP\QUERY_DEVICE_RELATIONS\Eject | |
| PNP\QUERY_DEVICE_RELATIONS\Removal | |
| PNP\QUERY_INTERFACE | |
| PNP\QUERY_RESOURCES | |
| PNP\QUERY_DEVICE_TEXT | |
| PNP\READ_CONFIG | |
| PNP\WRITE_CONFIG | |
| PNP\EJECT | |
| PNP\SET_LOCK | |
| PNP\QUERY_ID | |
| PNP\QUERY_BUS_INFORMATION | |
| PNP\DEVICE_USAGE_NOTIFICATION | |
| PNP\SURPRISE_REMOVAL | |
|--------------------------------------------------------|
| Stats |
|--------------------------------------------------------|
| Total IRP count : 52 |
| Covered IRP count : 19 |
| NOT Covered IRP count : 33 |
| Covered IRP % : 36.54% |
| NOT Covered IRP % : 63.46% |
|--------------------------------------------------------|
IRP MJ 覆盖率数据
本部分仅显示 IRP MJ 函数代码的计数器,这些代码由驱动程序在 IRP 覆盖率期间为指定开发节点处理。 驱动程序覆盖率工具包监视和报告 13 个 IRP MJ 函数代码。
本节提供有关以下方面的信息:
驱动程序处理的每个 IRP MJ 函数代码的计数器。 可以使用这些计数器来确定哪些 IRP 具有足够的测试覆盖范围,哪些可能需要更多覆盖范围。
驱动程序未处理的 IRP MJ 函数代码的列表。 此信息非常重要,可以提供有关代码覆盖率测试中的缺陷的见解。
与 IRP MJ 和 MN 覆盖率数据一样,本节中的数据可用于分析代码覆盖率测试的效率。 具体而言,此数据显示了每个 IRP MJ 函数代码的驱动程序调度例程的测试程度。
以下示例中显示了 devnode 9740 的 IRP MJ 覆盖率数据:
|--------------------------------------------------------|
| MJ Device irp coverage |
|--------------------------------------------------------|
| IRPS covered 12 | # of times |
|--------------------------------------------------------|
| IRP_MJ_UNKNOWN | 1 |
| IRP_MJ_PNP | 6 |
| IRP_MJ_DEVICE_CONTROL | 1 |
| IRP_MJ_READ | 1 |
| IRP_MJ_CREATE | 1 |
| IRP_MJ_CLEANUP | 1 |
| IRP_MJ_CLOSE | 1 |
| IRP_MJ_WRITE | 1 |
| IRP_MJ_SYSTEM_CONTROL | 3 |
| IRP_MJ_FLUSH_BUFFERS | 1 |
| IRP_MJ_POWER | 1 |
| IRP_MJ_SHUTDOWN | 1 |
|--------------------------------------------------------|
| IRPS NOT covered 1 | |
|--------------------------------------------------------|
| IRP_MJ_INTERNAL_DEVICE_CONTROL | |
|--------------------------------------------------------|
| Stats |
|--------------------------------------------------------|
| Total IRP count : 13 |
| Covered IRP count : 12 |
| NOT Covered IRP count : 1 |
| Covered IRP % : 92.31% |
| NOT Covered IRP % : 7.69% |
|--------------------------------------------------------|
IRP 对覆盖率数据
本部分显示 IRP 覆盖期间,一对 IRP 在开发节点的驱动程序堆栈中并发处于活动状态的次数。 驱动程序覆盖率工具包监视和报告 1099 个不同的 IRP 对。
本部分显示驱动程序并发处理的每个 MJ/MN 函数代码的 IRP MJ 的计数器。 这些计数器可用于确定哪些 IRP 具有足够的测试覆盖范围,哪些可能需要更多覆盖范围。
与其他类型的 IRP 覆盖率数据一样,本部分中的数据可用于分析代码覆盖率测试的效率。 但是,此数据明显不同,因为它显示了驱动程序对并发 IRP 处理的测试程度。
以下示例中显示了 devnode 9740 的 IRP 对覆盖率数据:
|--------------------------------------------------------|
| MJ & MN Device IRP Concurrency pairs. |
|--------------------------------------------------------|
| IRP Pairs covered 25 | # of times |
|--------------------------------------------------------|
| CREATE | |
| READ | 10 |
|--------------------------------------------------------|
| CREATE | |
| WRITE | 5 |
|--------------------------------------------------------|
| CREATE | |
| DEVICE_CONTROL | 4 |
|--------------------------------------------------------|
| CLOSE | |
| READ | 10 |
|--------------------------------------------------------|
| CLOSE | |
| WRITE | 4 |
|--------------------------------------------------------|
| CLOSE | |
| DEVICE_CONTROL | 4 |
|--------------------------------------------------------|
| READ | |
| READ | 1513 |
|--------------------------------------------------------|
| READ | |
| WRITE | 1498 |
|--------------------------------------------------------|
| READ | |
| FLUSH_BUFFERS | 929 |
|--------------------------------------------------------|
| READ | |
| DEVICE_CONTROL | 68 |
|--------------------------------------------------------|
| READ | |
| CLEANUP | 11 |
|--------------------------------------------------------|
| READ | |
| POWER\QUERY_POWER\SYSTEM | 1 |
|--------------------------------------------------------|
| READ | |
| WMI\QUERY_ALL_DATA | 2 |
|--------------------------------------------------------|
| READ | |
| PNP\QUERY_DEVICE_RELATIONS\Target | 7 |
|--------------------------------------------------------|
| READ | |
| PNP\QUERY_PNP_DEVICE_STATE | 1 |
|--------------------------------------------------------|
| WRITE | |
| WRITE | 1448 |
|--------------------------------------------------------|
| WRITE | |
| FLUSH_BUFFERS | 852 |
|--------------------------------------------------------|
| WRITE | |
| DEVICE_CONTROL | 8 |
|--------------------------------------------------------|
| WRITE | |
| CLEANUP | 4 |
|--------------------------------------------------------|
| WRITE | |
| PNP\QUERY_DEVICE_RELATIONS\Target | 1 |
|--------------------------------------------------------|
| WRITE | |
| PNP\QUERY_PNP_DEVICE_STATE | 2 |
|--------------------------------------------------------|
| FLUSH_BUFFERS | |
| FLUSH_BUFFERS | 27 |
|--------------------------------------------------------|
| FLUSH_BUFFERS | |
| DEVICE_CONTROL | 1 |
|--------------------------------------------------------|
| DEVICE_CONTROL | |
| CLEANUP | 7 |
|--------------------------------------------------------|
| DEVICE_CONTROL | |
| PNP\START_DEVICE | 2 |
|--------------------------------------------------------|
|--------------------------------------------------------|
| Stats |
|--------------------------------------------------------|
| Total IRP pairs : 1099 |
| Covered IRP pairs : 25 |
| NOT Covered IRP pairs : 1074 |
| Covered IRP pairs % : 2.27% |
| NOT Covered IRP pairs % : 97.73% |
|--------------------------------------------------------|
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈