커널스택을 보여주는 명령입니다.
모든 프로세스의 모든 쓰레드를 보여주기 때문에 다음과 같이 명령하면 !process 0 7 과 같은 역할을 합니다.
!stacks 2
뒤의 숫자 2 를 1 이나 0 으로 사용할 수도 있는데 숫자가 작을 수록 더 간단한 정보를 보여줍니다.
!process 0 7 과 비슷한 출력을 보이는 명령어를 구지 설명하는 이유는 !stacks 만의 특출난 기능이 있기 때문인데요.
!stacks 2 FilterString
처럼 뒤에 FilerString 을 주면 FilterString 이 포함된 콜스택만 보여줍니다. XP 이상에서만 지원하는 기능이지만 매우 편리한 기능입니다. 예를 들어 시스템이 대드락이나 행에 빠져있을 경우 자신의 드라이버에서 행이 걸려 있는지 간단하게 확인할 수 있습니다. !process 0 7 을 사용하면 모든 쓰레드의 콜스택을 펼쳐놓고 찾아야 하지만 이렇게 하면 콜스택에 드라이버가 존재하는 쓰레드만 보여주기 때문에 출력 내용이 간단하고 찾기가 수월해 집니다.
예제)
NDIS 드라이버가 걸려있는 쓰레드만 찾아 봅니다.
kd> !stacks 2 NDIS
Proc.Thread .Thread Ticks ThreadState Blocker
Max cache size is : 1048576 bytes (0x400 KB)
Total memory in cache : 0 bytes (0 KB)
Number of regions cached: 0
0 full reads broken into 0 partial reads
counts: 0 cached/0 uncached, 0.00% cached
bytes : 0 cached/0 uncached, 0.00% cached
** Prototype PTEs are implicitly decoded
[863a5490 System]
4.00006c 863a75b8 0001015 Blocked nt!KiSwapContext+0x2e
nt!KiSwapThread+0x46
nt!KeRemoveQueue+0x20e
NDIS!ndisWorkerThread+0x30
nt!PspSystemThreadStartup+0x34
nt!KiThreadStartup+0x16
[8613eda0 smss.exe]
[85ff21c0 csrss.exe]
[8611d0a0 winlogon.exe]
[8610a1b8 services.exe]
[85ff91d8 lsass.exe]
[860f37c8 svchost.exe]
...
깔끔하게 NDIS 가 생성해 놓은 WorkerThread 하나만 나왔네요. 현재 다른 쓰레드에서는 NDIS 드라이버의 기능이 호출되지 않고 있다는 것을 알 수 있습니다.
http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=1&s_bulu=&s_key=&no=102