다음을 통해 공유


버그 확인 0x1AA: EXCEPTION_ON_INVALID_STACK

EXCEPTION_ON_INVALID_STACK 버그 검사 값은 0x000001AA. 이 BugCheck는 예외 디스패치가 잘못된 커널 스택으로 넘어갔다는 것을 나타냅니다. 이는 예외 디스패치 또는 해제(예: 프레임 포인터의 스택 손상으로 인해) 커널 스택 포인터가 손상되었거나 드라이버가 올바른 커널 스택이 아닌 스택에서 실행 중임을 나타낼 수 있습니다.

Important

이 항목은 프로그래머를 위한 것입니다. 컴퓨터를 사용하는 동안 이 오류 코드를 받은 고객인 경우 파란색 화면 오류 문제 해결을 참조하세요.

EXCEPTION_ON_INVALID_STACK 매개 변수

매개 변수 설명

1

현재 스택에 대한 포인터입니다.

2

NormalStackLimits(3)와 같은 스택 제한의 유형입니다. 스택이 유효하지 않으므로 컴퓨터의 상태를 고려할 때 활성 상태여야 하는 커널 스택 유형에 대한 커널의 최상의 추정을 나타냅니다.

스택 제한 유형:

  • 0x0 - 버그검사 스택(버그검사 시간 동안 스택 제한이 계산되는 경우 모든 스택)
  • 0x1 - 프로세서 DPC 스택
  • 0x2 - KeExpandKernelStackAndCallout(예) 스택
  • 0x3 - 일반 커널 스레드 스택
  • 0x4 - 스레드 컨텍스트 교환 중 커널 스레드 스택(활성 상태인 스레드가 모호함)
  • 0x5 - win32k 커널/사용자 설명선 스택
  • 0x6 - 프로세서 ISR 스택
  • 0x7 - 커널 디버거 스택(커널 디버거가 KD I/O를 처리하는 경우 모든 스택)
  • 0x8 - 프로세서 NMI 처리 스택
  • 0x9 - 프로세서 컴퓨터 검사 처리 스택
  • 0xA - 프로세서 예외 스택(발생한 특정 IRQL 예외를 디스패치하는 데 사용됨)

3

잘못된 스택이 발견되었을 때 해제되었거나 예외에 대해 디스패치된 컨텍스트를 나타내는 컨텍스트 레코드에 대한 포인터입니다.

4

디스패치 중인 활성 예외를 나타내는 예외 레코드를 제공합니다.

원인

잘못된 스택에 액세스하려는 시도가 발생했습니다. 커널 스택의 크기가 제한되므로 개발자는 비디오 메모리 블록을 복사하는 데 사용하는 경우와 같이 제한을 추적하는 데 주의해야 합니다. Windows 커널 스택에 대한 자세한 내용은 커널 스택 사용을 참조하세요.

해결

전체 커널 덤프 또는 연결된 디버거를 사용하면 다음 명령을 사용하여 정보를 수집하고 메모리에 잘못 액세스하는 코드를 추적하는 데 유용할 수 있습니다.

먼저 !analyze 명령을 사용하여 정보, 특히 버그 검사 매개 변수를 수집합니다. 또한 오류가 있는 원본 줄 및 모듈 이름(사용 가능한 경우)을 검사합니다.

Arguments:
Arg1: 00000018940ffbe8
Arg2: 0000000000000003
Arg3: ffffe301c8db2900
Arg4: ffffdc0e9ee665d8

!analyze 출력에서 제공된 .trap 명령 링크를 사용하여 컨텍스트를 트랩 프레임으로 설정합니다.

2: kd> .trap 0xffffdc0e9ee66680
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=003f8b813f20b6e0 rbx=0000000000000000 rcx=ee7defdd9c530000
rdx=ffffcb81660ea078 rsi=0000000000000000 rdi=0000000000000000
rip=fffff8002b7f8933 rsp=ffffdc0e9ee66810 rbp=ffffcb81511c3010
 r8=0000000000000001  r9=0000000000004014 r10=ffffdc0e9ee66910
r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0         nv up ei pl zr na po nc
dxgmms2!RemoveHeadList+0xd [inlined in dxgmms2!VidSchiSignalRegisteredSyncObjects+0x3f]:
fffff800`2b7f8933 48395808        cmp     qword ptr [rax+8],rbx ds:003f8b81`3f20b6e8=????????????????

!vm 명령을 사용하여 메모리 사용량을 검사합니다. 예를 들어 사용 중인 커널 스택 메모리의 양을 확인합니다.

0: kd> !vm

Physical Memory:          1541186 (    6164744 Kb)
Available Pages:           470550 (    1882200 Kb)
ResAvail Pages:           1279680 (    5118720 Kb)

...

Kernel Stacks:              13686 (      54744 Kb)

사용된 이 메모리 양은 이 예제에서 사용할 수 있는 것보다 적습니다.

!thread 명령을 사용하여 실행 중인 내용에 대한 정보를 수집합니다. 이 예제에서는 비디오 스케줄러 작업자 스레드가 실행 중인 것처럼 보입니다.

2: kd> !thread
THREAD ffffcb816348b040  Cid 0c58.4a1c  Teb: 0000000000000000 Win32Thread: 0000000000000000 RUNNING on processor 2
Not impersonating
DeviceMap                 ffff840f38c04170
Owning Process            ffffcb81648980c0       Image:         YourPhone.exe
Attached Process          N/A            Image:         N/A
Wait Start TickCount      34501403       Ticks: 0
Context Switch Count      43             IdealProcessor: 3             
UserTime                  00:00:00.000
KernelTime                00:00:00.015
Win32 Start Address 0x00007fff34656d00
Stack Init ffffdc0e9ee675b0 Current ffffdc0e9ee66610
Base ffffdc0e9ee68000 Limit ffffdc0e9ee61000 Call 0000000000000000
Priority 8 BasePriority 8 PriorityDecrement 0 IoPriority 2 PagePriority 5
...

그런 다음 f 옵션과 함께 kb(스택 백트레이스 표시)를 사용하여 스택 및 메모리 사용량을 표시하여 큰 메모리 사용자가 있는지 확인합니다.

2: kd> kf
...
02        40 ffffdc0e`9ee66850 fffff800`2b7f8801     dxgmms2!VidSchiMarkDeviceAsError+0x4d  
...

코드의 특정 부분이 의심스러운 경우 u, ub, uu(Unassemble) 명령을 사용하여 연결된 어셈블 언어 코드를 검사합니다.

2: kd> u ffffdc0e`9ee66850 l10
ffffdc0e`9ee66850 1030            adc     byte ptr [rax],dh
ffffdc0e`9ee66852 1c51            sbb     al,51h
ffffdc0e`9ee66854 81cbffffc068    or      ebx,68C0FFFFh
ffffdc0e`9ee6685a e69e            out     9Eh,al
ffffdc0e`9ee6685c 0e              ???
ffffdc0e`9ee6685d dcff            fdiv    st(7),st
ffffdc0e`9ee6685f ff00            inc     dword ptr [rax]
ffffdc0e`9ee66861 0000            add     byte ptr [rax],al
ffffdc0e`9ee66863 0000            add     byte ptr [rax],al
ffffdc0e`9ee66865 0000            add     byte ptr [rax],al
ffffdc0e`9ee66867 000e            add     byte ptr [rsi],cl
ffffdc0e`9ee66869 0000            add     byte ptr [rax],al
ffffdc0e`9ee6686b 0000            add     byte ptr [rax],al
ffffdc0e`9ee6686d 0000            add     byte ptr [rax],al
ffffdc0e`9ee6686f 0010            add     byte ptr [rax],dl
ffffdc0e`9ee66871 301c51          xor     byte ptr [rcx+rdx*2],bl

.cxr(컨텍스트 레코드 표시) 명령을 사용하여 !analyze에서 제공하는 매개 변수 3 값을 사용하여 컨텍스트 레코드를 표시합니다.

2: kd> .cxr ffffe301c8db2900
rax=003f8b813f20b6e0 rbx=ffffcb813f607650 rcx=ee7defdd9c530000
rdx=ffffcb81660ea078 rsi=0000000000000000 rdi=ffffcb81511c30a8
rip=fffff8002b7f8933 rsp=ffffdc0e9ee66810 rbp=ffffcb81511c3010
 r8=0000000000000001  r9=0000000000004014 r10=ffffdc0e9ee66910
r11=0000000000000000 r12=ffffdc0e9ee66910 r13=ffffcb814019c000
r14=0000000000000000 r15=ffffdc0e9ee66910
iopl=0         nv up ei pl zr na po nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00050246
dxgmms2!RemoveHeadList+0xd [inlined in dxgmms2!VidSchiSignalRegisteredSyncObjects+0x3f]:
fffff800`2b7f8933 48395808        cmp     qword ptr [rax+8],rbx ds:002b:003f8b81`3f20b6e8=????????????????

.exr(예외 레코드 표시) 명령을 사용하여 !analyze에서 제공하는 매개 변수 4 값을 사용하여 예외 레코드를 표시합니다.

2: kd> .exr ffffdc0e9ee665d8
ExceptionAddress: fffff8002b7f8933 (dxgmms2!RemoveHeadList+0x000000000000000d)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 0000000000000000
   Parameter[1]: ffffffffffffffff
Attempt to read from address ffffffffffffffff

예외 레코드는 더 자세히 조사할 영역인 읽는 시도와 주소를 ffffffffffffffff나타냅니다.

참고 항목

오류 검사 코드 참조