'thread'에 해당되는 글 3건

  1. 2009.12.07 Thread Scheduling 유형
  2. 2009.03.27 Thread States
  3. 2009.03.27 Windbg Stack Backtracing 명령어

Windows 운영체제는 thread라는 최소 실행단위에 의해서 프로그램이 실행되는데, 여러 개의 thread가 각각 교대로 CPU에 의해서 매우 빠른 속도로 실행되면서 마치 동시에 여러 응용 프로그램이 함께 실행되는 것과 같은 결과를 보여주고 있습니다. Thread Scheduling이란 이렇게 시스템에서 실행 중인 여러 개의 thread 간에 어떠한 thread를 실행할 지, 그리고 다음에는 어떠한 thread를 실행할 지에 대해서 결정하는 매카니즘입니다. 오늘은 thread scheduling이 발생하는 유형에 대해서 간단히 알아보도록 하겠습니다.

(원래 내용은 Windows Internals 6장의 내용을 바탕으로 작성되었으며 그림은http://www.microsoft.com/mspress/books/sampchap/4354c.aspx에서 발췌하였습니다.)

1. Voluntary Switch (자발적인 교체)

아래 그림처럼 현재 Priority 19로 running 상태에 있던 thread가 스스로 wait 상태로 들어가면서 Priority 17에서 ready 상태에 있던 thread로 교체되는 시나리오를 생각해 볼 수 있습니다. WaitForSingleObject나 WaitForMultipleObjects와 같은 함수를 호출하면서 어떠한 object의 상태가 변경될 때까지 wait 상태로 들어감으로써 다른 thread에게 실행 권한을 넘겨주는 경우입니다.


2. Preemption (선점)

이는 현재 running 상태에 있던 thread가 다른 thread에 의해서 밀려나는 것을 의미합니다. 더 높은 우선순위를 가지고 Wait 상태에 있던 thread가 깨어나거나, 다른 thread의 우선 순위가 오르거나 또는 현재 thread의 우선순위가 낮아짐으로써 다른 thread에게 선점 당하는 경우에 해당합니다.

아래 그림은 Priority 16으로 실행 중이던 thread가 Wait 상태에서 깨어난 Priority 18의 thread에게 실행 제어권을 넘겨주고 다시 waiting queue에 들어가는 경우를 보여주고 있습니다.


3. Quantum End (퀀텀 만료)

Quantum이란 한 thread가 running 상태로 실행될 수 있는 기간으로 일정 시간 동안 CPU에 의해서 실행이 되면 다른 thread가 실행될 수 있도록 스스로 제어권을 물려주게 됩니다.

이 Quantum의 길이는 운영체제마다 다릅니다. 예를 들어 Winodws 2000 Pro와 Windows XP는 기본값으로 2 clock을, Windows Server system에서는 12 clock을 부여합니다. 이는 서버 장비의 경우 Quantum을 조금 더 길게 부여함으로써 실행 중이던 서비스를 처리할 수 있는 시간을 충분히 주고 성능을 높이려는 의도입니다. 대신 일반 사용자 PC의 경우 사용자와 키보드, 마우스를 이용해서 interaction이 많으므로 보다 짧은 quantum을 부여합니다.

4. Termination (종료)

ExitThread가 호출되거나 TerminateThread에 의해서 강제로 종료되는 경우에 해당합니다.

'Programming' 카테고리의 다른 글

Windows policy에서 사용하는 registry 항목  (0) 2010.02.02
XNA 개발 프레임워크  (0) 2010.01.04
Win7의 부팅속도 향상  (0) 2009.11.04
Windows 7의 바탕화면 슬라이드쇼  (0) 2009.10.30
OS Kernel 함수들의 Prefix  (0) 2009.10.14
Posted by noenemy
,

Thread States

Programming 2009. 3. 27. 14:54

현재 운영체제를 사용하면서 여러 가지 응용 프로그램을 동시에 사용하고 있습니다. 문서 작성을 하면서 음악을 듣고 인터넷 서핑을 동시에 진행할 수 있습니다. 하지만 CPU에서는 원래 동시에 하나의 작업만을 진행할 수 있는데, 시스템에서 실행되어야 하는 여러 작업들을 thread라는 최소 실행단위로 나누고 이러한 여러 thread를 매우 빠른 속도로 나눠서 실행하면서 마치 동시에 여러 프로그램이 실행되는 듯한 효과를 얻을 수 있는 것입니다. 따라서 thread는 시스템을 구성하는 여러 요소 중에서도 실행과 관련된 매우 중요한 역할을 담당하고 있습니다.

 

이러한 thread 들은 생성되고 실행된 뒤 소멸될 때까지 Initialized, Ready, Standby, Runnign, Waiting, Transition, Terminated, Deferred Ready(2003 이후)와 같은 여러 상태 값을 가지게 됩니다. System Dispatcher에 의해서 여러 thread 들의 상태 값을 관리하고 실행될 thread를 선택하는 과정이 이루어 지는데 내부적으로 매우 복잡한 알고리즘에 의해서 운영되고 있습니다. 여기서는 thread의 상태 값들에 대한 의미를 정리해보도록 하겠습니다.

 

 

 

각 State에 대한 의미

 

l  Ready

n  Thread가 실행되기를 기다리는 상태. Thread dispatcher는 다음에 실행할 thread를 이러한 ready state에 있는 thread list에서 찾게 된다.

n  Ready list에 있는 thread 중에서 Priority가 높은 thread 부터 먼저 실행될 대상이 된다.

 

l  Standby

n  현재 CPU에 의해서 실행 중인 thread 다음에 바로 실행될 수 있도록 선택된 thread이다. CPU당 하나의 thread standby 상태에 있을 수 있으며, 이는 ready state에 있는 여러 thread 중에서 선택된다.

 

l  Running

n  현재 CPU에 의해서 실행 중인 thread이다. 일단 Standby 상태에 있던 thread가 실행 상태가 되면 해당 thread가 실행 될 수 있도록 주어진 기간을 의미하는 퀀텀(quantum) 동안 또는 보다 높은 우선순위의 다른 thread에 의해서 선점(preempted)되기 전까지는 실행 상태를 계속 유지하게 된다. 실행이 완료되면 Ready List에 다시 들어가게 된다.

 

l  Waiting

n  Ready List에 포함되지 않고 대기 상태에 있는 thread를 의미한다. 특정 kernel object signaled 상태가 될 때까지 대기하기 위해서 WaitForSingleObject WaitForMultipleObject API를 호출하면 해당 thread Waiting 상태에 들어가게 되며 Dispatcher에서 관리하는 thread scheduling의 대상에서 제외된다. , waiting 상태에서 깨어나기 전에서 CPU에 의해서 실행되지 않는다.

 

l  Transition

n  Waiting 상태에 있다가 실행될 수 있는 Ready 상태가 되려고 하지만 해당 thread kernel stack page out 된 경우에 해당한다. Kernel stack 영역이 다시 메모리로 page in 되면 비로소 Ready 상태가 된다.

 

l  Terminated

n  특정 thread의 실행이 종료되면 terminated 상태가 된다.

 

l  Initialized

n  Thread가 생성되어 운영체제 내부적으로 초기화하고 있는 과정에 해당한다.

 

참고로 Windows Server 2003 이후 운영체제에서는  시스템이 thread scheduling을 위해서 시스템 전체 범위의 lock을 최소화해서 성능 향상을 도모하고자 위에서 설명한 state 외에 Deferred Ready라는 상태 값이 하나 더 추가 되었습니다.

 

WinDbg에서 !thread 명령어를 이용하면 특정 thread의 state 값을 아래와 같이 확인이 가능합니다.

1: kd> !thread 86c02020
THREAD 86c02020  Cid 0004.0030  Teb: 00000000 Win32Thread: 00000000
RUNNING on processor 1
IRP List:
    a7834eb8: (0006,0148) Flags: 00000000  Mdl: 00000000
Not impersonating
DeviceMap                 83207d08
Owning Process            0       Image:         <Unknown>
Attached Process          86b97720       Image:         System
Wait Start TickCount      107517         Ticks: 0
Context Switch Count      50347            
UserTime                  00:00:00.000
KernelTime                00:00:05.085
Win32 Start Address nt!ExpWorkerThread (0x82078ea7)
Stack Init 83094000 Current 83093570 Base 83094000 Limit 83091000 Call 0
Priority 13 BasePriority 12 PriorityDecrement 0 IoPriority 2 PagePriority 5

 

1: kd> !thread 89af7030 
THREAD 89af7030  Cid 0004.11e4  Teb: 00000000 Win32Thread: 00000000 WAIT: (Executive) KernelMode Non-Alertable
    820fae94  NotificationEvent
    820fae84  NotificationEvent
    820fae0c  NotificationEvent
    820faeb8  NotificationEvent
Not impersonating
DeviceMap                 83207d08
Owning Process            0       Image:         <Unknown>
Attached Process          86b97720       Image:         System
Wait Start TickCount      107512         Ticks: 5 (0:00:00:00.078)
Context Switch Count      23402            
UserTime                  00:00:00.000
KernelTime                00:00:03.463
Win32 Start Address nt!PfTLoggingWorker (0x821fffaf)
Stack Init 9d085000 Current 9d084c28 Base 9d085000 Limit 9d082000 Call 0
Priority 13 BasePriority 7 PriorityDecrement 6 IoPriority 2 PagePriority 5

 

'Programming' 카테고리의 다른 글

Example I/O request - an overview  (0) 2009.04.21
On-demand 메모리 관리  (0) 2009.04.02
Windbg Stack Backtracing 명령어  (0) 2009.03.27
Intel CPU registers  (0) 2009.03.20
Windbg Remote debugging 설정 방법  (0) 2009.03.20
Posted by noenemy
,

thread별로 로컬 변수나 함수 호출간에 전달할 파라미터 정보를 저장하기 위한 임시 공간으로서 thread stack을 사용할 수 있는데, thread의 특정 시점에 사용 중이던 stack 정보를 역으로 추적해서 현재 실행 중인 함수의 위치까지 실행된 과정을 call stack으로 보여주고, 각 함수에 전달된 파라미터 정보를 확인하는 과정을 Stack backtracing이라고 합니다. 다음에 기회가 되면 이와 관련된 함수 호출 규약(function calling convention) stack 사용 및 해제하는 과정을 다루도록 하겠습니다.

 

어느 debugger를 이용하든지 thread stack backtracing 을 해서 stack frame 정보를 확인하는 것이 live debugging이나 post mortem debugging에 필수 과정이라고 할 수 있습니다. 특히 windbg의 경우 stack backtracing을 위해 k 명령어를 제공하고 있는데 파라미터에 따라서 그 사용법이 매우 다양하기 때문에 어떤 것을 사용해야 되는지 헷갈리는 경우가 많습니다. 제 경우에도 주로 사용하는 몇 개의 명령어만 쓰고 있는데 이번 기회에 세부 사용법을 정리해보도록 하겠습니다. 일단 이것 저것 많이 써보면서 몸으로 익히는 게 중요할 것 같습니다.

 

세부 내용은 WinDbg의 매뉴얼을 참고 했습니다.

 

구문

*유저모드에서

[~Thread] k[b|p|P|v] [n] [f] [L] [FrameCount]
[~Thread] k[b|p|P|v] [n] [f] [L] = BasePtr [FrameCount]
[~Thread] k[b|p|P|v] [n] [f] [L] = BasePtr StackPtr InstructionPtr 
[~Thread] kd [WordCount]

*커널모드에서

[Processor] k[b|p|P|v] [n] [f] [L] [FrameCount]
[Processor] k[b|p|P|v] [n] [f] [L] = BasePtr [FrameCount]
[Processor] k[b|p|P|v] [n] [f] [L] = BasePtr StackPtr InstructionPtr 
[Processor] kd [WordCount]

파라미터

 

b: 각 함수에 전달된 파라미터를 3개씩 보기

p: 함수에 전달된 모든 파라미터 보기

P: 함수에 전달된 모든 파라미터 보기. 줄바꿈을 이용해서 보여준다.

v: FPO(Frame Pointer Omission) 정보 보기

n: frame number 보기

f: frame 사이의 간격(실제 스택상에서 해당 frame bytes ) 보기

L: 소스 상에서의 라인 번호 숨기기

 

실제 예

동일한 thread에서 k 명령어의 사용에 따른 차이점을 아래 예를 통해서 확인할 수 있습니다.

 

1: kd> k

ChildEBP RetAddr 

83093868 8208fbf4 nt!MmAccessFault+0x106 [d:\vista_ldr\base\ntos\mm\mmfault.c @ 251]

83093868 82091f60 nt!_KiTrap0E+0xdc [d:\vista_ldr\base\ntos\ke\i386\trap.asm @ 5651]

830938f0 8fc9dbbb nt!Exfi386InterlockedExchangeUlong [d:\vista_ldr\base\ntos\ex\i386\intrlfst.asm @ 782]

83093904 8204b2e7 C7xUSBV3!powerWaitWakeCallback+0x1b [c:\projects\wibro\usb\xp\miniport.08.06.24_328\power.c @ 399]

8309392c 822cec69 nt!PopRequestCompletion+0x38 [d:\vista_ldr\base\ntos\po\pocall.c @ 349]

83093964 820acc1b nt!IovpLocalCompletionRoutine+0xcc [d:\vista_ldr\base\ntos\io\iomgr\ioverifier.c @ 1028]

8309399c 822ceb53 nt!IopfCompleteRequest+0x11d [d:\vista_ldr\base\ntos\io\iomgr\iosubs.c @ 3848]

83093a0c 8f7431f4 nt!IovCompleteRequest+0x11c [d:\vista_ldr\base\ntos\io\iomgr\ioverifier.c @ 946]

83093a20 8f74a7f6 usbhub!UsbhCompletePdoWakeIrp+0xaf [d:\vistartm\drivers\wdm\usb\hub\usbhub\pdopwr.c @ 1864]

83093a40 8f74a9e0 usbhub!UsbhPdoRemoveCleanup+0x3f [d:\vistartm\drivers\wdm\usb\hub\usbhub\pdo.c @ 1267]

83093a58 8f72e41e usbhub!UsbhPdoPnp_RemoveDevice+0x41 [d:\vistartm\drivers\wdm\usb\hub\usbhub\pdo.c @ 2152]

83093a74 8f726c92 usbhub!UsbhPdoPnp+0x78 [d:\vistartm\drivers\wdm\usb\hub\usbhub\pnp.c @ 1759]

83093a88 822ce681 usbhub!UsbhGenDispatch+0x4a [d:\vistartm\drivers\wdm\usb\hub\usbhub\hub.c @ 1116]

83093aac 82027f1c nt!IovCallDriver+0x252 [d:\vista_ldr\base\ntos\io\iomgr\ioverifier.c @ 574]

83093ac0 825cfce9 nt!IofCallDriver+0x1b [d:\vista_ldr\base\ntos\io\iomgr\iosubs.c @ 2370]

83093b08 822ce681 ndis!ndisPnPDispatch+0x4a4 [d:\vistartm\net\ndis\sys\ndispnp.c @ 1426]

83093b2c 82027f1c nt!IovCallDriver+0x252 [d:\vista_ldr\base\ntos\io\iomgr\ioverifier.c @ 574]

83093b40 821af73b nt!IofCallDriver+0x1b [d:\vista_ldr\base\ntos\io\iomgr\iosubs.c @ 2370]

83093b74 821af9a3 nt!IopSynchronousCall+0xce [d:\vista_ldr\base\ntos\io\pnpmgr\irp.c @ 215]

83093bd0 82006592 nt!IopRemoveDevice+0xd5 [d:\vista_ldr\base\ntos\io\pnpmgr\irp.c @ 663]

 

1: kd> kd 5

83093868  83093880

8309386c  8208fbf4 nt!_KiTrap0E+0xdc [d:\vista_ldr\base\ntos\ke\i386\trap.asm @ 5651]

83093870  00000001

83093874  9112ee50

83093878  00000000

 

1: kd> kbL

ChildEBP RetAddr  Args to Child             

83093868 8208fbf4 00000001 9112ee50 00000000 nt!MmAccessFault+0x106

83093868 82091f60 00000001 9112ee50 00000000 nt!_KiTrap0E+0xdc

830938f0 8fc9dbbb a78aae90 898b30b0 a78aaf00 nt!Exfi386InterlockedExchangeUlong

83093904 8204b2e7 89683700 898b3000 00000004 C7xUSBV3!powerWaitWakeCallback+0x1b

8309392c 822cec69 00000000 a78aae90 898b3000 nt!PopRequestCompletion+0x38

83093964 820acc1b 00000000 a78aae90 830939d4 nt!IovpLocalCompletionRoutine+0xcc

8309399c 822ceb53 a78aae90 896837b8 c0000120 nt!IopfCompleteRequest+0x11d

83093a0c 8f7431f4 c0000120 896837b8 89683700 nt!IovCompleteRequest+0x11c

83093a20 8f74a7f6 89522028 89683700 c0000120 usbhub!UsbhCompletePdoWakeIrp+0xaf

83093a40 8f74a9e0 89683700 a7834eb8 a7834fdc usbhub!UsbhPdoRemoveCleanup+0x3f

83093a58 8f72e41e 89683700 a7834eb8 a7834eb8 usbhub!UsbhPdoPnp_RemoveDevice+0x41

83093a74 8f726c92 89683700 a7834eb8 89683700 usbhub!UsbhPdoPnp+0x78

83093a88 822ce681 89683700 a7834eb8 a7834eb8 usbhub!UsbhGenDispatch+0x4a

83093aac 82027f1c 825cfce9 00000000 89683700 nt!IovCallDriver+0x252

83093ac0 825cfce9 a7834eb8 892f6030 875fce30 nt!IofCallDriver+0x1b

83093b08 822ce681 892f6030 00000002 a7835000 ndis!ndisPnPDispatch+0x4a4

83093b2c 82027f1c 821af73b 83093bcc 892f6030 nt!IovCallDriver+0x252

83093b40 821af73b 89683700 89301ea8 89683700 nt!IofCallDriver+0x1b

83093b74 821af9a3 89683700 83093ba8 00000000 nt!IopSynchronousCall+0xce

83093bd0 82006592 89683700 00000002 9f7d2510 nt!IopRemoveDevice+0xd5

 

1: kd> kvL

ChildEBP RetAddr  Args to Child             

83093868 8208fbf4 00000001 9112ee50 00000000 nt!MmAccessFault+0x106 (CONV: stdcall)

83093868 82091f60 00000001 9112ee50 00000000 nt!_KiTrap0E+0xdc (FPO: [0,0] TrapFrame @ 83093880) (CONV: cdecl)

830938f0 8fc9dbbb a78aae90 898b30b0 a78aaf00 nt!Exfi386InterlockedExchangeUlong (FPO: [0,0,0])

83093904 8204b2e7 89683700 898b3000 00000004 C7xUSBV3!powerWaitWakeCallback+0x1b (FPO: [Non-Fpo]) (CONV: stdcall)

8309392c 822cec69 00000000 a78aae90 898b3000 nt!PopRequestCompletion+0x38 (CONV: stdcall)

83093964 820acc1b 00000000 a78aae90 830939d4 nt!IovpLocalCompletionRoutine+0xcc (CONV: stdcall)

8309399c 822ceb53 a78aae90 896837b8 c0000120 nt!IopfCompleteRequest+0x11d (CONV: fastcall)

83093a0c 8f7431f4 c0000120 896837b8 89683700 nt!IovCompleteRequest+0x11c (CONV: fastcall)

83093a20 8f74a7f6 89522028 89683700 c0000120 usbhub!UsbhCompletePdoWakeIrp+0xaf (FPO: [Non-Fpo]) (CONV: stdcall)

83093a40 8f74a9e0 89683700 a7834eb8 a7834fdc usbhub!UsbhPdoRemoveCleanup+0x3f (FPO: [Non-Fpo]) (CONV: stdcall)

83093a58 8f72e41e 89683700 a7834eb8 a7834eb8 usbhub!UsbhPdoPnp_RemoveDevice+0x41 (FPO: [Non-Fpo]) (CONV: stdcall)

83093a74 8f726c92 89683700 a7834eb8 89683700 usbhub!UsbhPdoPnp+0x78 (FPO: [Non-Fpo]) (CONV: stdcall)

83093a88 822ce681 89683700 a7834eb8 a7834eb8 usbhub!UsbhGenDispatch+0x4a (FPO: [Non-Fpo]) (CONV: stdcall)

83093aac 82027f1c 825cfce9 00000000 89683700 nt!IovCallDriver+0x252 (CONV: fastcall)

83093ac0 825cfce9 a7834eb8 892f6030 875fce30 nt!IofCallDriver+0x1b (CONV: fastcall)

83093b08 822ce681 892f6030 00000002 a7835000 ndis!ndisPnPDispatch+0x4a4 (FPO: [Non-Fpo]) (CONV: stdcall)

83093b2c 82027f1c 821af73b 83093bcc 892f6030 nt!IovCallDriver+0x252 (CONV: fastcall)

83093b40 821af73b 89683700 89301ea8 89683700 nt!IofCallDriver+0x1b (CONV: fastcall)

83093b74 821af9a3 89683700 83093ba8 00000000 nt!IopSynchronousCall+0xce (CONV: stdcall)

83093bd0 82006592 89683700 00000002 9f7d2510 nt!IopRemoveDevice+0xd5 (CONV: stdcall)

 

1: kd> kpL

ChildEBP RetAddr 

83093868 8208fbf4 nt!MmAccessFault(unsigned long FaultStatus = 1, void * VirtualAddress = 0x9112ee50, char PreviousMode = 0 '', void * TrapInformation = 0x83093880)+0x106

83093868 82091f60 nt!_KiTrap0E(void)+0xdc

830938f0 8fc9dbbb nt!Exfi386InterlockedExchangeUlong(void)

83093904 8204b2e7 C7xUSBV3!powerWaitWakeCallback(struct _DEVICE_OBJECT * Object = 0x89683700, unsigned char MinorFunction = 0x00 '', union _POWER_STATE PowerState = union _POWER_STATE, struct _MINIPORT_ADAPTER * Adapter = 0x9112eb50, struct _IO_STATUS_BLOCK * IoStatus = 0xa78aaea8)+0x1b

8309392c 822cec69 nt!PopRequestCompletion(struct _DEVICE_OBJECT * DeviceObject = 0x00000000, struct _IRP * Irp = 0xa78aae90, void * Context = 0x898b3000)+0x38

83093964 820acc1b nt!IovpLocalCompletionRoutine(struct _DEVICE_OBJECT * DeviceObject = 0x00000000, struct _IRP * Irp = 0xa78aae90, void * Context = 0x830939d4)+0xcc

8309399c 822ceb53 nt!IopfCompleteRequest(struct _IRP * Irp = 0x9112ee50, char PriorityBoost = 0 '')+0x11d

83093a0c 8f7431f4 nt!IovCompleteRequest(struct _IRP * Irp = 0x9112ee50, char PriorityBoost = 0 '')+0x11c

83093a20 8f74a7f6 usbhub!UsbhCompletePdoWakeIrp(struct _DEVICE_OBJECT * HubFdo = 0x89522028, struct _DEVICE_OBJECT * Pdo = 0x89683700, long NtStatus = -1073741536)+0xaf

83093a40 8f74a9e0 usbhub!UsbhPdoRemoveCleanup(struct _DEVICE_OBJECT * Pdo = 0x89683700)+0x3f

83093a58 8f72e41e usbhub!UsbhPdoPnp_RemoveDevice(struct _DEVICE_OBJECT * Pdo = 0x89683700, struct _IRP * Irp = 0xa7834eb8)+0x41

83093a74 8f726c92 usbhub!UsbhPdoPnp(struct _DEVICE_OBJECT * HubPdo = 0x89683700, struct _IRP * Irp = 0xa7834eb8)+0x78

83093a88 822ce681 usbhub!UsbhGenDispatch(struct _DEVICE_OBJECT * DeviceObject = 0x89683700, struct _IRP * Irp = 0xa7834eb8)+0x4a

83093aac 82027f1c nt!IovCallDriver(struct _DEVICE_OBJECT * DeviceObject = 0x9112ee50, struct _IRP * Irp = 0x00000000, void * ReturnAddress = 0x825cfce9)+0x252

83093ac0 825cfce9 nt!IofCallDriver(struct _DEVICE_OBJECT * DeviceObject = 0x9112ee50, struct _IRP * Irp = 0x00000000)+0x1b

83093b08 822ce681 ndis!ndisPnPDispatch(struct _DEVICE_OBJECT * DeviceObject = 0x892f6030, struct _IRP * Irp = 0x00000002)+0x4a4

83093b2c 82027f1c nt!IovCallDriver(struct _DEVICE_OBJECT * DeviceObject = 0x9112ee50, struct _IRP * Irp = 0x00000000, void * ReturnAddress = 0x821af73b)+0x252

83093b40 821af73b nt!IofCallDriver(struct _DEVICE_OBJECT * DeviceObject = 0x9112ee50, struct _IRP * Irp = 0x00000000)+0x1b

83093b74 821af9a3 nt!IopSynchronousCall(struct _DEVICE_OBJECT * DeviceObject = 0x89683700, struct _IO_STACK_LOCATION * TopStackLocation = 0x83093ba8, long DefaultStatus = -1882596448, unsigned long DefaultInformation = 0x83093bd0, unsigned long * Information = 0x00000000)+0xce

83093bd0 82006592 nt!IopRemoveDevice(struct _DEVICE_OBJECT * TargetDevice = 0x89683700, unsigned long IrpMinorCode = 2)+0xd5

 

1: kd> kPL

ChildEBP RetAddr 

83093868 8208fbf4 nt!MmAccessFault(

                                unsigned long FaultStatus = 1,

                                void * VirtualAddress = 0x9112ee50,

                                char PreviousMode = 0 '',

                                void * TrapInformation = 0x83093880)+0x106

83093868 82091f60 nt!_KiTrap0E(void)+0xdc

830938f0 8fc9dbbb nt!Exfi386InterlockedExchangeUlong(void)

83093904 8204b2e7 C7xUSBV3!powerWaitWakeCallback(

                                struct _DEVICE_OBJECT * Object = 0x89683700,

                                unsigned char MinorFunction = 0x00 '',

                                union _POWER_STATE PowerState = union _POWER_STATE,

                                struct _MINIPORT_ADAPTER * Adapter = 0x9112eb50,

                                struct _IO_STATUS_BLOCK * IoStatus = 0xa78aaea8)+0x1b

8309392c 822cec69 nt!PopRequestCompletion(

                                struct _DEVICE_OBJECT * DeviceObject = 0x00000000,

                                struct _IRP * Irp = 0xa78aae90,

                                void * Context = 0x898b3000)+0x38

83093964 820acc1b nt!IovpLocalCompletionRoutine(

                                struct _DEVICE_OBJECT * DeviceObject = 0x00000000,

                                struct _IRP * Irp = 0xa78aae90,

                                void * Context = 0x830939d4)+0xcc

8309399c 822ceb53 nt!IopfCompleteRequest(

                                struct _IRP * Irp = 0x9112ee50,

                                char PriorityBoost = 0 '')+0x11d

83093a0c 8f7431f4 nt!IovCompleteRequest(

                                struct _IRP * Irp = 0x9112ee50,

                                char PriorityBoost = 0 '')+0x11c

83093a20 8f74a7f6 usbhub!UsbhCompletePdoWakeIrp(

                                struct _DEVICE_OBJECT * HubFdo = 0x89522028,

                                struct _DEVICE_OBJECT * Pdo = 0x89683700,

                                long NtStatus = -1073741536)+0xaf

83093a40 8f74a9e0 usbhub!UsbhPdoRemoveCleanup(

                                struct _DEVICE_OBJECT * Pdo = 0x89683700)+0x3f

83093a58 8f72e41e usbhub!UsbhPdoPnp_RemoveDevice(

                                struct _DEVICE_OBJECT * Pdo = 0x89683700,

                                struct _IRP * Irp = 0xa7834eb8)+0x41

83093a74 8f726c92 usbhub!UsbhPdoPnp(

                                struct _DEVICE_OBJECT * HubPdo = 0x89683700,

                                struct _IRP * Irp = 0xa7834eb8)+0x78

83093a88 822ce681 usbhub!UsbhGenDispatch(

                                struct _DEVICE_OBJECT * DeviceObject = 0x89683700,

                                struct _IRP * Irp = 0xa7834eb8)+0x4a

83093aac 82027f1c nt!IovCallDriver(

                                struct _DEVICE_OBJECT * DeviceObject = 0x9112ee50,

                                struct _IRP * Irp = 0x00000000,

                                void * ReturnAddress = 0x825cfce9)+0x252

83093ac0 825cfce9 nt!IofCallDriver(

                                struct _DEVICE_OBJECT * DeviceObject = 0x9112ee50,

                                struct _IRP * Irp = 0x00000000)+0x1b

83093b08 822ce681 ndis!ndisPnPDispatch(

                                struct _DEVICE_OBJECT * DeviceObject = 0x892f6030,

                                struct _IRP * Irp = 0x00000002)+0x4a4

83093b2c 82027f1c nt!IovCallDriver(

                                struct _DEVICE_OBJECT * DeviceObject = 0x9112ee50,

                                struct _IRP * Irp = 0x00000000,

                                void * ReturnAddress = 0x821af73b)+0x252

83093b40 821af73b nt!IofCallDriver(

                                struct _DEVICE_OBJECT * DeviceObject = 0x9112ee50,

                                struct _IRP * Irp = 0x00000000)+0x1b

83093b74 821af9a3 nt!IopSynchronousCall(

                                struct _DEVICE_OBJECT * DeviceObject = 0x89683700,

                                struct _IO_STACK_LOCATION * TopStackLocation = 0x83093ba8,

                                long DefaultStatus = -1882596448,

                                unsigned long DefaultInformation = 0x83093bd0,

                                unsigned long * Information = 0x00000000)+0xce

83093bd0 82006592 nt!IopRemoveDevice(

                                struct _DEVICE_OBJECT * TargetDevice = 0x89683700,

                                unsigned long IrpMinorCode = 2)+0xd5

 

1: kd> kfL

  Memory  ChildEBP RetAddr 

          83093868 8208fbf4 nt!MmAccessFault+0x106

        0 83093868 82091f60 nt!_KiTrap0E+0xdc

       88 830938f0 8fc9dbbb nt!Exfi386InterlockedExchangeUlong

       14 83093904 8204b2e7 C7xUSBV3!powerWaitWakeCallback+0x1b

       28 8309392c 822cec69 nt!PopRequestCompletion+0x38

       38 83093964 820acc1b nt!IovpLocalCompletionRoutine+0xcc

       38 8309399c 822ceb53 nt!IopfCompleteRequest+0x11d

       70 83093a0c 8f7431f4 nt!IovCompleteRequest+0x11c

       14 83093a20 8f74a7f6 usbhub!UsbhCompletePdoWakeIrp+0xaf

       20 83093a40 8f74a9e0 usbhub!UsbhPdoRemoveCleanup+0x3f

       18 83093a58 8f72e41e usbhub!UsbhPdoPnp_RemoveDevice+0x41

       1c 83093a74 8f726c92 usbhub!UsbhPdoPnp+0x78

       14 83093a88 822ce681 usbhub!UsbhGenDispatch+0x4a

       24 83093aac 82027f1c nt!IovCallDriver+0x252

       14 83093ac0 825cfce9 nt!IofCallDriver+0x1b

       48 83093b08 822ce681 ndis!ndisPnPDispatch+0x4a4

       24 83093b2c 82027f1c nt!IovCallDriver+0x252

       14 83093b40 821af73b nt!IofCallDriver+0x1b

       34 83093b74 821af9a3 nt!IopSynchronousCall+0xce

       5c 83093bd0 82006592 nt!IopRemoveDevice+0xd5

'Programming' 카테고리의 다른 글

On-demand 메모리 관리  (0) 2009.04.02
Thread States  (0) 2009.03.27
Intel CPU registers  (0) 2009.03.20
Windbg Remote debugging 설정 방법  (0) 2009.03.20
Windows Error Reporting(WER)이란  (0) 2009.02.25
Posted by noenemy
,