Compartilhar via


0x1AB de Verificação de Bugs: UNWIND_ON_INVALID_STACK

O marcar de bug UNWIND_ON_INVALID_STACK tem um valor de 0x000001AB. Isso indica que foi feita uma tentativa de acessar a memória fora do intervalo de pilha de kernel válido. Em particular, esse BugCheck indica que o desenrolamento de pilha cruzou em uma pilha de kernel inválida. Isso pode indicar que o ponteiro de pilha do kernel foi corrompido durante a expedição ou desenrolamento de exceção (por exemplo, devido à corrupção de pilha de um ponteiro de quadro) ou que um driver está executando fora de uma pilha que não é uma pilha de kernel legal.

No momento em que o acesso inválido ocorreu, o registro de exceção não estava disponível.

Importante

Este artigo é para programadores. Se você for um cliente que recebeu um código de erro de tela azul ao usar o computador, consulte Solucionar erros de tela azul.

Parâmetros de UNWIND_ON_INVALID_STACK

Parâmetro Descrição

1

Um ponteiro para a pilha atual.

2

O tipo de limite de pilha, como NormalStackLimits (3). Como a pilha é inválida, isso representa a melhor estimativa do kernel quanto ao tipo de pilha de kernel que deve estar ativa dado o estado do computador.

Tipo de limite de pilha:

  • 0x0 – pilha de verificação de bugs (qualquer pilha se os limites de pilha forem calculados durante o tempo de verificação de bugs)
  • 0x1 - Uma pilha DPC do processador
  • 0x2 - Uma pilha KeExpandKernelStackAndCallout(Ex)
  • 0x3 – uma pilha de threads de kernel normal
  • 0x4 – uma pilha de threads de kernel durante a troca de contexto de thread (ambígua qual thread está ativo)
  • 0x5 – uma pilha de texto explicativo de kernel/usuário win32k
  • 0x6 – uma pilha ISR do processador
  • 0x7 – pilha do depurador de kernel (qualquer pilha quando o depurador de kernel está tratando E/S de KD)
  • 0x8 – uma pilha de manipulação de NMI de processador
  • 0x9 – um computador processador marcar a pilha de tratamento
  • 0xA – uma pilha de exceções do processador (usada para expedir determinadas exceções de IRQL geradas)

3

Um ponteiro para o registro de contexto que representa o contexto que estava sendo desenrolado (ou despachado para uma exceção) quando a pilha inválida foi encontrada.

4

ExceptionRecord - Reservado e sempre 0 para UNWIND_ON_INVALID_STACK.

Causa

Ocorreu uma tentativa de acessar uma pilha inválida. Como a pilha de kernel é limitada em tamanho, o desenvolvedor precisa ter cuidado ao rastreá-la, por exemplo, ao usá-la para copiar blocos de memória de vídeo. Para obter informações sobre a pilha do Kernel do Windows, consulte Usando a pilha de kernel.

Resolução

Usando um despejo de kernel completo ou um depurador anexado, os comandos a seguir podem ser úteis para coletar informações e rastrear o código que está acessando incorretamente a memória.

Primeiro, use o comando !analyze para coletar informações, em particular os parâmetros de marcar de bug. Examine também a linha de origem com falha e o nome do módulo, se disponível.

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

Use o link de comando .trap fornecido na saída !analyze para definir o contexto como o quadro de interceptação.

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

Use o comando !thread para coletar informações sobre o que está em execução. Neste exemplo, parece que um thread de trabalho do agendador de vídeo está em execução.

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
...

Em seguida, use kb (Exibir Backtrace de Pilha) com a opção f para exibir a pilha e o uso de memória para ver se há um usuário de memória grande.

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
...

Se uma parte específica do código parecer suspeita, use o comando u, ub, uu (Unassemble) para examinar o código de linguagem assemble associado.

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]

Use o comando .cxr (Registro de Contexto de Exibição) para exibir o registro de contexto, usando o valor do parâmetro 3 fornecido por !analyze.

.cxr fffff607893436c4

Use o comando !vm para examinar o uso de memória, por exemplo, para ver quanto da memória do Kernel Stacks está em uso.

0: kd> !vm

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

...

Kernel Stacks:              13686 (      54744 Kb)

Use o comando !stacks , com o parâmetro 2 para exibir informações sobre pilhas. Esse comando pode levar algum tempo para ser executado. Examine a saída para padrões repetidos de execução bloqueada que podem apontar para a área e para uma investigação mais aprofundada.

Consulte Também

Referência de código de verificação de bugs