!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)으로 시작하고 필터의 필터 주소(0xFFAAA768) 및 자식 핀 팩터리 수(2)를 표시합니다.
각 항목 아래에서 각 팩터리는 열거되고 각 핀 인스턴스의 주소(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
그래프를 따르려면 다음 절차를 사용합니다.
이 그래프를 수행하려면 다음을 수행합니다.
관심 있는 핀을 찾아보세요. usbaudio의 출력 핀(팩터리 0)0xFFB1CAF0 고려합니다.
연결된 핀을 찾습니다. 이 예에서 이는 분할자 핀 0xFFA8B008입니다.
연결 방향을 확인하고 필터 이름을 찾는 방식으로 시각적으로 이동합니다. (목록은 토폴로지로 정렬됩니다.) 이 예제에서 오른쪽 화살표는 해당 핀을 찾으려면 목록에서 이 항목 아래를 확인해야 임을 나타냅니다. 분할자 필터 0xFFA0C660 바로 아래에 있습니다.
필터 핀 인스턴스 목록에서 대상 핀 주소를 찾습니다. 이 경우 이 주소는 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!
이러한 출력은 "용의자" 목록을 참조하세요. 이러한 의심 필터는 그래프에서 진행을 결정하는 중요한 경로에 있는 필터입니다. 분석기가 중단을 위해 생성한 이유에 따라 해당 지점에서 디버깅을 시작합니다.
메모 이 기능은 중단된 그래프에서만 사용해야 합니다. 분석기는 그래프가 이 상태에 얼마나 오래 있었는지 알 수 없습니다. 디버거에 진입하고 실행 중인 그래프를 중단된 그래프 상태로 분석하면 여전히 의심 필터가 표시됩니다.