Поделиться через


Использование !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записывают с USB-микрофона Telex. Каждая отдельная запись начинается с имени (usbaudio, в вышеупомянутом разделе) и отображает адрес фильтра (0xFFAAA768) и количество дочерних фабрик пинов (2) в фильтре.

Под каждой записью каждая фабрика перечисляется и перечисляет адрес каждого экземпляра пин-кода (0xFFB1CAF0), объект файла (0x811DEEB8), соответствующий каждому экземпляру, направление подключения, назначение этого подключения и адрес целевого пин-кода (0xFFA8B008). Также отображается количество очередей (7) и ожидающих irPs (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.

Для выполнения команды следования за графиком можно также использовать команду для анализа приостановленных графов из любой начальной точки. Для этого укажите 4 в параметре Flags :

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!

Для таких выходных данных просмотрите список "подозреваемых". Эти подозрительные фильтры находятся на критическом пути прогресса, происходящего в графе. Начните отладку с этой точки на основе причин, которые анализатор предоставил для задержки.

Примечание Эта функция должна использоваться только на зависших графах! Анализатор не может знать, сколько времени граф был в этом состоянии. Вход в отладчик и анализ запущенного графа, рассматриваемого как зависший, по-прежнему отображает подозрительный фильтр.