如何分析 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%      |
|--------------------------------------------------------|