通过


使用 !ks.graph

!ks.graph 命令是内核流式处理扩展模块中功能最强大的扩展命令之一。 此命令显示任何给定起点在内核模式下的整个图形的图片。

在运行 !ks.graph 之前,可能需要启用所有能够处于活动状态的库扩展。 为此,请发出 !ks.libexts enableall 命令。 !ks.graph 的输出将是内核模式图的文本说明,按拓扑顺序排序。 以下是示例:

kd> !graph ffa0c6d4 7
Attempting a graph build on ffa0c6d4...  Please be patient...
Graph With Starting Point ffa0c6d4:
"usbaudio" Filter ffaaa768, Child Factories 2
    Output Factory 0:
        Pin ffb1caf0 (File 811deeb8, -> "splitter" ffa8b008) Irps(q/p) = 7, 1

此示例显示一个捕获图,其中两个 Sndrec32.exe 从 Telex USB 麦克风捕获。 在上一节) 中,每条单独的记录都以 usbaudio 的名称 (开头,并显示筛选器上 2) 的子引脚工厂的筛选器地址 ( (0xFFAAA768) 和数量。

在每个条目下,枚举每个工厂,并列出每个引脚实例 (0xFFB1CAF0) 的地址、对应于每个实例的文件对象 (0x811DEEB8) 、连接的方向、该连接的目标以及目标引脚 (0xFFA8B008) 的地址。 还显示每个引脚的排队 (7 个) 和挂起的 IRP (1 个) 。

具有向前方向符号 (>) 的连接指示引脚是输出引脚并连接到输入引脚。 另一方面,具有反向方向符号 (<-) 的连接是输入引脚,并显示连接的起源。 输出将继续,如下所示:

"splitter" Filter ffa0c660, Child Factories 2
    Output Factory 0:
        Pin 81250008 (File ffb10028, -> "kmixer" 8123c000) Irps(q/p) = 3, 0
        Pin 811df9c0 (File ffaaf2f0, -> "kmixer" 81236000) Irps(q/p) = 3, 0
    Input Factory 1:
        Pin ffa8b008 (File ffb26d68, <- "usbaudio" ffb1caf0) Irps(q/p) = 1, 7
"kmixer" Filter ffa65b70, Child Factories 4
    Input Factory 2:
        Pin 81236000 (File ffaaf7d0, <- "splitter" 811df9c0) Irps(q/p) = 0, 0
    Output Factory 3:
        Pin 81252d00 (File 811df1d8) Irps(q/p) = 10, 0
"kmixer" Filter ffb03808, Child Factories 4
    Input Factory 2:
        Pin 8123c000 (File ffb10130, <- "splitter" 81250008) Irps(q/p) = 0, 0
    Output Factory 3:
        Pin ffa1e9c0 (File 81253468) Irps(q/p) = 10, 0

若要遵循图形,请使用以下过程:

若要遵循此图::

  1. 查找感兴趣的图钉。 请考虑0xFFB1CAF0,usbaudio 的输出引脚 (工厂 0) 。

  2. 找到连接的引脚。 在此示例中,这是拆分器引脚0xFFA8B008。

  3. 查看连接方向,然后以可视方式移动,查找筛选器名称。 (请记住,列表按拓扑排序。) 在此示例中,右箭头指示我们需要在列表中查看此条目下方才能找到相应的图钉。 拆分器筛选器0xFFA0C660紧接在下方。

  4. 在筛选器引脚实例列表中查找目标引脚地址。 在本例中,此地址0xFFA8B008。

“遵循此图: ”命令还可用于分析任何给定起点的已停止的图形。 为此,请在 Flags 参数中指定 4:

kd> !graph 812567c0 7 4

Attempting a graph build on 812567c0...  Please be patient...

Graph With Starting Point 812567c0:

"emu10k" Filter ff9ebb98, Child Factories 5
    Output Factory 0:
        Pin 812567c0 (File 811c6630, -> "splitter" 811df960) Irps(q/p) = 8, 0
"splitter" Filter ffb18890, Child Factories 2
    Output Factory 0:
        Pin 811df430 (File ffa55f90) Irps(q/p) = 10, 0
    Input Factory 1:
        Pin 811df960 (File 81187820, <- "emu10k" 812567c0) Irps(q/p) = 0, 8

Analyzing a Hung Graph From 812567c0:

Suspect Filters (For a Hung Graph):
    "emu10k" Filter ff9ebb98 or class "PortCls Wave Cyclic" is suspect.
        Reasons For This Analysis:
            - No critical pin has less than 8 queued Irps
            - Downstream "splitter" pin 811df960 is starved
        Irps to check:
            81255418 811df008 81252008 81255280 81250b30 ffa1fe70 81252e70 ffa01d98

NOTE: The above is based on heuristic analysis.  It is not designed to be a
      replacement for an actual developer looking at this particular hang!  The
      filters listed as suspects may or may not be the actual cause of the
      stall!

对于此类输出,请查看“嫌疑人”列表。 这些可疑筛选器是处于关系图中进度的关键路径中的筛选器。 根据分析器为停止生成的原因从该点开始调试。

注意 此功能只应用于已停止的图形! 分析器无法知道图形处于此状态的时间。 闯入调试器并将正在运行的图形分析为已停止的图形仍会显示可疑筛选器。