Share via


버그 검사 0x1AB: UNWIND_ON_INVALID_STACK

UNWIND_ON_INVALID_STACK 버그 검사 값은 0x000001AB. 유효한 커널 스택 범위를 벗어난 메모리에 액세스하려고 했음을 나타냅니다. 특히 이 BugCheck는 스택 해제가 잘못된 커널 스택으로 교차되었음을 나타냅니다. 이는 예외 디스패치 또는 해제 중에 커널 스택 포인터가 손상되었거나(예: 프레임 포인터의 스택 손상으로 인해) 드라이버가 합법적인 커널 스택이 아닌 스택에서 실행 중임을 나타낼 수 있습니다.

잘못된 액세스가 발생했을 때 예외 레코드를 사용할 수 없습니다.

중요

이 문서는 프로그래머를 위한 것입니다. 컴퓨터를 사용하는 동안 블루 스크린 오류 코드를 받은 고객인 경우 블루 스크린 오류 문제 해결을 참조하세요.

UNWIND_ON_INVALID_STACK 매개 변수

매개 변수 Description

1

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

2

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

스택 제한 유형:

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

3

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

4

ExceptionRecord - 예약되고 UNWIND_ON_INVALID_STACK 대해 항상 0입니다.

원인

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

해결 방법

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

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

Arguments:
Arg1: 89344350fffff607
Arg2: 0000000000000003
Arg3: fffff607893436c4
Arg4: fffff60789343ea8

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

TRAP_FRAME:  fffff60789343f50 -- (.trap 0xfffff60789343f50)
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=fffff607893441e8 rbx=0000000000000000 rcx=0000000010000004
rdx=0000000000000002 rsi=0000000000000000 rdi=0000000000000000
rip=fffff8026dc296cf rsp=fffff607893440e8 rbp=fffff60789344350
 r8=fffff8028e7a08b2  r9=0000000000000008 r10=fffff8029e9c3980
r11=fffff607893440f8 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000

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

2: kd> !thread
THREAD ffff8f8e9af25080  Cid 0004.0378  Teb: 0000000000000000 Win32Thread: 0000000000000000 RUNNING on processor 2
Not impersonating
DeviceMap                 ffffd601dbe63e30
Owning Process            ffff8f8e99ab4040       Image:         System
Attached Process          N/A            Image:         N/A
Wait Start TickCount      14361          Ticks: 0
Context Switch Count      64607          IdealProcessor: 1             
UserTime                  00:00:00.000
KernelTime                00:00:06.046
Win32 Start Address dxgmms2!VidSchiWorkerThread (0xfffff8027a70d100)
Stack Init fffff60789344c70 Current fffff607893445c0
Base fffff60789345000 Limit fffff6078933f000 Call 0000000000000000
Priority 16 BasePriority 16 PriorityDecrement 0 IoPriority 2 PagePriority 5
...

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

2: kd> kf
...
02       198 fffff607`89344460 fffff802`8e6b41d5     amdkmdag+0x2308b2
03       120 fffff607`89344580 fffff802`8e59eb35     amdkmdag+0x1441d5
04        30 fffff607`893445b0 fffff802`8e62b5e8     amdkmdag+0x2eb35
05        c0 fffff607`89344670 fffff802`8e623f6c     amdkmdag+0xbb5e8
...

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

2: kd> u fffff607`893442c8 l10
fffff607`893442c8 d04234          rol     byte ptr [rdx+34h],1
fffff607`893442cb 8907            mov     dword ptr [rdi],eax
fffff607`893442cd f6ff            idiv    bh
fffff607`893442cf ff01            inc     dword ptr [rcx]
fffff607`893442d1 17              ???
fffff607`893442d2 c4              ???
fffff607`893442d3 9f              lahf
fffff607`893442d4 8e8fffff0060    mov     cs,word ptr [rdi+6000FFFFh]
fffff607`893442da 5a              pop     rdx
fffff607`893442db 9f              lahf
fffff607`893442dc 8e8fffff0000    mov     cs,word ptr [rdi+0FFFFh]
fffff607`893442e2 0000            add     byte ptr [rax],al
fffff607`893442e4 0000            add     byte ptr [rax],al
fffff607`893442e6 0000            add     byte ptr [rax],al
fffff607`893442e8 7527            jne     fffff607`89344311
fffff607`893442ea 6e              outs    dx,byte ptr [rsi]

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

.cxr fffff607893436c4

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

0: kd> !vm

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

...

Kernel Stacks:              13686 (      54744 Kb)

2 매개 변수 와 함께 !stacks 명령을 사용하여 스택에 대한 정보를 봅니다. 이 명령을 실행하는 데 다소 시간이 걸릴 수 있습니다. 추가 조사를 위해 및 영역을 가리킬 수 있는 차단된 실행의 반복된 패턴에 대한 출력을 검사합니다.

참고 항목

오류 검사 코드 참조