Application Verifier - Códigos de parada - Noções básicas
Os códigos de parada a seguir estão contidos no conjunto básico de testes.
Detalhes de interrupção de exceções
Tente executar o código na memória não executável (primeira chance).
Causa provávelEssa parada será gerada se o aplicativo estiver tentando executar código de um endereço que não é executável ou é livre. Para depurar a interrupção: $ u parameter2 — para desmontar o código culpado; $ .exr parameter3 — para exibir as informações de exceção; $ .cxr parameter4 seguido por kb — para exibir as informações de contexto de exceção e o rastreamento de pilha quando a exceção foi gerada.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Endereço sendo acessado.
- Parâmetro 2 — Código realizando acesso inválido.
- Parâmetro 3 — Registro de exceção. Use .exr para exibir.
- Parâmetro 4 — Registro de contexto. Use .cxr para exibir.
- Camada de teste: exceções
- ID da interrupção: FIRST_CHANCE_ACCESS_VIOLATION_CODE
- Código de parada: 650NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Detalhes de interrupção de identificadores
Exceção de identificador inválido para rastreamento de pilha atual.
Causa provávelEssa interrupção será gerada se a função na parte superior da pilha transmitir um identificador inválido para rotinas do sistema. Normalmente, um comando kb simples revelará qual é o valor do identificador transmitido (deve ser um dos parâmetros - geralmente o primeiro). Se o valor for nulo, isso está claramente errado. Se o valor parecer ok, você precisará usar a extensão do depurador !htrace para obter um histórico de operações referentes a esse valor de identificador. Na maioria dos casos, o valor do identificador é usado depois de ser fechado.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Código de exceção.
- Parâmetro 2 — Registro de exceção. Use .exr para exibir.
- Parâmetro 3 — Registro de contexto. Use .cxr para exibir.
- Parâmetro 4 — Não usado.
- Camada de teste: identificadores
- ID da interrupção: INVALID_HANDLE
- Código de parada: 300NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Índice TLS inválido usado para rastreamento de pilha atual.
Causa provávelEssa interrupção será gerada se a função na parte superior da pilha transmitir um índice TLS inválido para rotinas do sistema TLS. Normalmente, um comando kb simples revelará o que está errado. O bug típico aqui é assumir um determinado valor para um índice TLS em vez de chamar TlsAlloc. Isso pode acontecer pensando que você sempre obtém o valor N e, portanto, não há necessidade de chamar TlsAlloc ou mais frequentemente devido a uma variável não inicializada.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Índice TLS inválido.
- Parâmetro 2 – Parte inferior esperada do índice.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: identificadores
- ID de interrupção: INVALID_TLS_VALUE
- Código de parada: 300NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Parâmetros inválidos para a chamada WaitForMultipleObjects.
Causa provávelEssa interrupção será gerada se a função na parte superior da pilha chamada WaitForMultipleObjects com NULL como o endereço da matriz de identificadores a serem aguardados ou com zero identificadores. Um comando kb simples revelará a função chamando essa API incorretamente.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço do vetor de identificação do objeto.
- Parâmetro 2 - Número de identificadores.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: identificadores
- ID de interrupção: INCORRECT_WAIT_CALL
- Código de parada: 300NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Identificador NULL transmitido como parâmetro. Um identificador válido deve ser usado.
Causa provávelEssa interrupção será gerada se a função na parte superior da pilha transmitir um identificador NULL para rotinas do sistema.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Não usado.
- Parâmetro 2 — Não usado.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: identificadores
- ID da interrupção: NULL_HANDLE
- Código de parada: 300NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Aguardando em um identificador de thread em DllMain.
Causa provávelEssa interrupção será gerada se o thread atual estiver executando código dentro da função DllMain de uma das DLLs carregadas no processo atual e chamar WaitForSingleObject ou WaitForMultipleObjects para aguardar em um identificador de thread no mesmo processo. Isso provavelmente levaria a um deadlock porque o identificador de thread não será sinalizado, a menos que esse segundo thread esteja saindo. Quando o segundo thread chamar ExitThread, ele tentará adquirir o bloqueio do carregador de DLL e, em seguida, chamará DllMain (DLL_THREAD_DETACH) para todas as DLLs no processo atual. Mas o bloqueio do carregador pertence ao primeiro thread (aquele que está aguardando no identificador do thread) para que os dois threads travem.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Identificador de thread.
- Parâmetro 2 — Não usado.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: identificadores
- ID da interrupção: WAIT_IN_DLLMAIN
- Código de parada: 300NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Tipo de objeto incorreto para identificador.
Causa provávelEssa interrupção será gerada se o thread atual estiver chamando uma API com um identificador para um objeto com um tipo de objeto incorreto. Por exemplo, chamar SetEvent com um identificador de semáforo como parâmetro gerará essa interrupção. Para depurar essa interrupção: $ kb - para exibir o rastreamento de pilha atual. O culpado é provavelmente a DLL que está chamando verifier.dll; $ du parameter2 - para exibir o tipo real do identificador. O valor do identificador é parameter1. No exemplo acima, será exibido: Semaphore. $ du parameter3 - para exibir o tipo de objeto esperado pela API. No exemplo acima, esse nome será: Event. $ !htrace parameter1 pode ser útil porque exibirá o rastreamento de pilha para as operações de abertura/fechamento recentes neste identificador.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Valor do identificador.
- Parâmetro 2 — Nome de tipo de objeto. Use du para exibir
- Parâmetro 3 – Nome do tipo de objeto esperado. Use du para exibir
- Parâmetro 4 — Não usado.
- Camada de teste: identificadores
- ID da interrupção: INCORRECT_OBJECT_TYPE
- Código de parada: 300NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Detalhes da interrupção de heaps
Erro desconhecido.
Causa provávelEssa mensagem poderá acontecer se o erro encontrado não puder ser classificado de outra forma. Não usado agora.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Não usado
- Parâmetro 2 — Não usado
- Parâmetro 3 — Não usado
- Parâmetro 4 — Não usado
- Camada de teste: heaps
- ID da interrupção: UNKNOWN_ERROR
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Exceção de violação de acesso.
Causa provávelEssa é a interrupção de verificador de aplicativo mais comum. Normalmente, ela é causada por um erro de saturação de buffer. O verificador de heap coloca uma página não acessível no final de uma alocação de heap e uma saturação de buffer causará uma exceção tocando nesta página. Para depurar essa interrupção, identifique o endereço de acesso que causou a exceção e use o seguinte comando do depurador: !heap -p -a ACCESS_ADDRESS Esse comando fornecerá detalhes sobre a natureza do erro e qual bloco de heap é saturado. Ele também fornecerá o rastreamento de pilha para a alocação de blocos. Há várias outras causas para essa interrupção. Por exemplo, acessar um bloco de heap depois de ser liberado. O mesmo comando do depurador também será útil para este caso.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Endereço inválido que causa a exceção
- Parâmetro 2 - Endereço de código executando o acesso inválido
- Parâmetro 3 — Registro de exceção
- Parâmetro 4 — Registro de contexto
- Camada de teste: heaps
- ID da interrupção: ACCESS_VIOLATION
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Acesso com vários threads em um heap criado com o sinalizador HEAP_NO_SERIALIZE.
Causa provávelUm heap criado com o sinalizador HEAP_NO_SERIALIZE não deve ser acessado simultaneamente a partir de dois threads. Se tal situação for detectada, você receberá esta mensagem. A maneira típica como essa situação se insinua em um programa é vinculando-se a uma versão de thread único do runtime C. Visual C++ pode, por exemplo, vincular estaticamente tal biblioteca quando sinalizadores adequados são usados. As pessoas esquecem desse detalhe e usam vários threads. O bug é muito difícil de depurar na vida real porque aparecerá como corrupções de dados misteriosos.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Heap no qual a operação acontece.
- Parâmetro 2 - ID do thread do proprietário atual da seção crítica de heap.
- Parâmetro 3 - ID do thread atual tentando entrar no heap.
- Parâmetro 4 — Não usado
- Camada de teste: heaps
- ID da interrupção: UNSYNCHRONIZED_ACCESS
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Solicitação de tamanho extremo.
Causa provávelEssa mensagem será gerada se em uma operação HeapAlloc() ou HeapReAlloc() do tamanho do bloco estiver acima de qualquer valor razoável. Normalmente, esse valor é 0x80000000 em plataformas de 32 bits e significativamente maior em plataformas de 64 bits.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Heap no qual a operação acontece.
- Parâmetro 2 - Tamanho solicitado
- Parâmetro 3 — Não usado
- Parâmetro 4 — Não usado
- Camada de teste: heaps
- ID da interrupção: EXTREME_SIZE_REQUEST
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Identificador de heap com assinatura incorreta.
Causa provávelAs estruturas de heap são marcadas com um valor mágico. Se o identificador de heap usado na chamada para uma interface de heap não tiver esse padrão, essa interrupção será gerada. Esse bug poderá acontecer se, de alguma forma, a estrutura de heap interna for corrompida (corrupção aleatória) ou simplesmente um valor falso for usado como um identificador de heap. Para obter uma lista de valores de identificador de heap válidos, use os seguintes comandos do depurador: !heap -p Se você apenas alternar um identificador de heap válido por outro válido em uma operação de heap, não obterá essa interrupção (o identificador parece válido, afinal). No entanto, o verificador de heap detecta essa situação e a relata com a interrupção SWITCHED_HEAP_HANDLE.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Identificador de heap usado na chamada para uma interface de heap
- Parâmetro 2 — Não usado
- Parâmetro 3 — Não usado
- Parâmetro 4 — Não usado
- Camada de teste: heaps
- ID da interrupção: BAD_HEAP_HANDLE
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Ponteiro de heap corrompido ou usando heap errado.
Causa provávelNormalmente, isso acontece se um bloco é alocado em um heap e liberado em outro. Use o comando !heap -p para obter uma lista de todos os valores válidos do identificador de heap. O exemplo mais comum é uma alocação msvcrt usando malloc() emparelhado com uma desalocação kernel32 usando HeapFree().
Informações exibidas pelo Application Verifier- Parâmetro 1 — Identificador de heap usado na chamada.
- Parâmetro 2 - Bloco de heap envolvido na operação.
- Parâmetro 3 - Tamanho do bloco de heap.
- Parâmetro 4 - Heap onde o bloco foi originalmente alocado.
- Camada de teste: heaps
- ID da interrupção: SWITCHED_HEAP_HANDLE
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Bloco de heap já liberado.
Causa provávelEssa situação acontecerá se o bloco for liberado duas vezes. Os blocos liberados são marcados de uma maneira especial e mantidos por um tempo em uma fila livre atrasada. Se um programa com bugs tentar liberar o bloco novamente, isso será detectado supondo que o bloco não foi retirado da fila livre atrasada e a memória reutilizada para outras alocações. A profundidade da fila sem atraso é da ordem de milhares de blocos e, portanto, há boas chances de que a maioria dos livres duplos seja pega.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Identificador do heap que possui o bloco.
- Parâmetro 2 - Bloco de heap sendo liberado novamente.
- Parâmetro 3 - Tamanho do bloco de heap.
- Parâmetro 4 — Não usado
- Camada de teste: heaps
- ID da interrupção: DOUBLE_FREE
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Bloco de heap corrompido.
Causa provávelEste é um erro genérico emitido se a corrupção no bloco de heap não puder ser colocada em uma categoria mais específica.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Identificador de heap usado na chamada.
- Parâmetro 2 - Bloco de heap envolvido na operação.
- Parâmetro 3 - Tamanho do bloco de heap.
- Parâmetro 4 - Reservado
- Camada de teste: heaps
- ID da interrupção: CORRUPTED_HEAP_BLOCK
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Tentativa de destruir o heap do processo.
Causa provávelÉ um erro tentar destruir o heap de processo padrão (aquele retornado pela interface GetProcessHeap()).
Informações exibidas pelo Application Verifier- Parâmetro 1 — Identificador de heap usado com HeapDestroy.
- Parâmetro 2 — Não usado
- Parâmetro 3 — Não usado
- Parâmetro 4 — Não usado
- Camada de teste: heaps
- ID da interrupção: DESTROY_PROCESS_HEAP
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Exceção inesperada gerada durante a execução do código de gerenciamento de heaps.
Causa provávelEssa interrupção será gerada se, durante a execução do código do gerenciador de heap, uma violação de acesso for gerada em situações ilegítimas. Há muito poucas situações em que isso é ok, por exemplo, ao chamar HeapValidate() ou HeapSize(). As informações do registro de exceção (terceiro parâmetro) podem ser usadas para localizar o contexto exato da exceção. Use os seguintes comandos do depurador para isso: $ .exr STOP-PARAMETER-2 $ .cxr STOP-PARAMETER-3 Normalmente, essa interrupção pode acontecer se houver alguma corrupção aleatória nas estruturas de heap internas.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Heap envolvido na operação.
- Parâmetro 2 — Registro de exceção.
- Parâmetro 3 — Registro de contexto.
- Parâmetro 4 - Código de exceção (C0000005 - violação de acesso)
- Camada de teste: heaps
- ID da interrupção: UNEXPECTED_EXCEPTION
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Exceção gerada durante a verificação do cabeçalho do bloco de heap.
Causa provávelEssa situação acontecerá se não for possível determinar nenhum tipo específico de corrupção para o bloco. Muito provavelmente essa interrupção acontecerá quando o endereço do bloco de heap transmitido para um sem heap apontar para uma área de memória não acessível (ponteiro corrompido, ponteiro não inicializado etc.).
Informações exibidas pelo Application Verifier- Parâmetro 1 - Identificador do heap que possui o bloco.
- Parâmetro 2 - Bloco de heap que está corrompido.
- Parâmetro 3 – Tamanho do bloco ou zero se o tamanho não puder ser determinado.
- Parâmetro 4 — Não usado.
- Camada de teste: heaps
- ID da interrupção: CORRUPTED_HEAP_BLOCK_EXCEPTION_RAISED_FOR_HEADER
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Exceção gerada durante a verificação do bloco de heap.
Causa provávelEssa situação acontecerá se não for possível determinar nenhum tipo específico de corrupção para o bloco. Por exemplo, você obterá isso se, durante uma operação sem heap, transmitir um endereço que aponte para uma área de memória não acessível. Isso também pode acontecer para situações de livre duplo se não encontrarmos o bloco entre blocos de heap de página inteira e o investigarmos como um bloco de heap de página leve.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Identificador de heap usado na chamada.
- Parâmetro 2 - Bloco de heap envolvido na operação.
- Parâmetro 3 - Tamanho do bloco de heap.
- Parâmetro 4 - Reservado.
- Camada de teste: heaps
- ID da interrupção: CORRUPTED_HEAP_BLOCK_EXCEPTION_RAISED_FOR_PROBING
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Bloco de heap corrompido depois de ser liberado.
Causa provávelEssa situação acontecerá se um bloco de memória for gravado depois de ser liberado.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Identificador do heap que possui o bloco.
- Parâmetro 2 - Bloco de heap que está corrompido.
- Parâmetro 3 – Tamanho do bloco ou zero se o tamanho não puder ser determinado.
- Parâmetro 4 — Não usado.
- Camada de teste: heaps
- ID da interrupção: CORRUPTED_HEAP_BLOCK_HEADER
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Padrão infixo corrompido para bloco de heap liberado.
Causa provávelBlocos liberados às vezes são marcados como não acessíveis e um programa tocando neles acessará a violação (interrupção de verificador diferente). Em outros casos (heap de página leve), o bloco é marcado com um padrão mágico e será mantido por um tempo. Eventualmente, de forma FIFO, os blocos são liberados. No momento, o padrão infixo é verificado e, se ele foi modificado, você terá essa quebra. A pilha no momento de quebra não é relevante. Você precisa descobrir a natureza do bloco e revisar o código que pode estar errado.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Identificador do heap que possui o bloco.
- Parâmetro 2 - Bloco de heap sendo liberado.
- Parâmetro 3 - Tamanho do bloco de heap.
- Parâmetro 4 - Reservado.
- Camada de teste: heaps
- ID da interrupção: CORRUPTED_FREED_HEAP_BLOCK
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Padrão de sufixo corrompido para bloco de heap.
Causa provávelNormalmente, isso acontece para erros de saturação de buffer. Às vezes, o verificador de aplicativo coloca páginas não acessíveis no final da alocação e as saturações de buffer causarão uma violação de acesso e, às vezes, o bloco de heap é seguido por um padrão mágico. Se esse padrão for alterado quando o bloco for liberado, você terá essa quebra. Essas quebras podem ser bem difíceis de depurar porque você não tem o momento real em que a corrupção aconteceu. Você só tem acesso ao momento livre (a interrupção aconteceu aqui) e ao rastreamento da pilha de alocação (!heap -p -a HEAP_ADDRESS)
Informações exibidas pelo Application Verifier- Parâmetro 1 — Identificador de heap usado na chamada.
- Parâmetro 2 - Bloco de heap envolvido na operação.
- Parâmetro 3 - Tamanho do bloco de heap.
- Parâmetro 4 - Reservado.
- Camada de teste: heaps
- ID da interrupção: CORRUPTED_HEAP_BLOCK_SUFFIX
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Carimbo de início corrompido para bloco de heap.
Causa provávelIsso acontece para insuficiências de buffer.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Identificador de heap usado na chamada.
- Parâmetro 2 - Bloco de heap envolvido na operação.
- Parâmetro 3 - Tamanho do bloco de heap.
- Parâmetro 4 – Valor de carimbo corrompido.
- Camada de teste: heaps
- ID da interrupção: CORRUPTED_HEAP_BLOCK_START_STAMP
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Carimbo de término corrompido para bloco de heap.
Causa provávelIsso acontece para insuficiências de buffer.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Identificador de heap usado na chamada.
- Parâmetro 2 - Bloco de heap envolvido na operação.
- Parâmetro 3 - Tamanho do bloco de heap.
- Parâmetro 4 – Valor de carimbo corrompido.
- Camada de teste: heaps
- ID da interrupção: CORRUPTED_HEAP_BLOCK_END_STAMP
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Padrão de prefixo corrompido para bloco de heap.
Causa provávelIsso acontece para insuficiências de buffer.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Identificador de heap usado na chamada.
- Parâmetro 2 - Bloco de heap envolvido na operação.
- Parâmetro 3 - Tamanho do bloco de heap.
- Parâmetro 4 - Reservado.
- Camada de teste: heaps
- ID da interrupção: CORRUPTED_HEAP_BLOCK_PREFIX
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Violação de acesso de primeira chance para rastreamento de pilha atual.
Causa provávelEssa é a interrupção de verificador de aplicativo mais comum. Normalmente, ela é causada por um erro de saturação de buffer. O verificador de heap coloca uma página não acessível no final de uma alocação de heap e uma saturação de buffer causará uma exceção tocando nesta página. Para depurar essa interrupção, identifique o endereço de acesso que causou a exceção e use o seguinte comando do depurador: !heap -p -a ACCESS_ADDRESS Esse comando fornecerá detalhes sobre a natureza do erro e qual bloco de heap é saturado. Ele também fornecerá o rastreamento de pilha para a alocação de blocos. Há várias outras causas para essa interrupção. Por exemplo, acessar um bloco de heap depois de ser liberado. O mesmo comando do depurador também será útil para este caso.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Endereço inválido que causa a exceção.
- Parâmetro 2 - Endereço de código executando o acesso inválido.
- Parâmetro 3 — Registro de exceção.
- Parâmetro 4 — Registro de contexto.
- Camada de teste: heaps
- ID da interrupção: FIRST_CHANCE_ACCESS_VIOLATION
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Contagem de lista de heap de processo inválida.
Causa provávelEssa mensagem poderá acontecer se, ao chamar GetProcessHeaps, o gerenciador de heap de página detectar algumas inconsistências internas. Isso pode ser causado por alguma corrupção aleatória no espaço do processo.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Contagem de heap real.
- Parâmetro 2 – Contagem de heap de página.
- Parâmetro 3 — Não usado
- Parâmetro 4 — Não usado
- Camada de teste: heaps
- ID da interrupção: CORRUPTED_HEAP_LIST
- Código de parada: 0NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Detalhes da interrupção de vazamento
Uma alocação de heap foi vazada.
Causa provávelEssa parada será gerada se a dll proprietária da alocação tiver sido descarregada dinamicamente enquanto possuía recursos.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Endereço da alocação vazada. Execute o <endereço> !heap -p -a para obter informações adicionais sobre a alocação.
- Parâmetro 2 - Endereço para o rastreamento da pilha de alocação. Execute o <endereço> dps para exibir a pilha de alocação.
- Parâmetro 3 - Endereço do nome da dll do proprietário. Execute o <endereço> du para ler o nome da dll.
- Parâmetro 4 - Base da dll do proprietário. Execute .reload <dll_name> = <endereço> para recarregar a dll do proprietário. Use "lm" para obter mais informações sobre os módulos carregados e descarregados.
- Camada de teste: vazamento
- ID da interrupção: ALLOCATION
- Código de parada: 900NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Um IDENTIFICADOR foi vazado.
Causa provávelEssa parada será gerada se a dll proprietária do identificador tiver sido descarregada dinamicamente enquanto possuía recursos. Para depurar essa interrupção: execute !htrace parameter1 para obter informações adicionais sobre o identificador.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Valor do identificador vazado. Execute o <identificador> !htrace para obter informações adicionais sobre o identificador se o rastreamento do identificador estiver habilitado.
- Parâmetro 2 - Endereço para o rastreamento da pilha de alocação. Execute o <endereço> dps para exibir a pilha de alocação.
- Parâmetro 3 - Endereço do nome da dll do proprietário. Execute o <endereço> du para ler o nome da dll.
- Parâmetro 4 - Base da dll do proprietário. Execute .reload <dll_name> = <endereço> para recarregar a dll do proprietário. Use "lm" para obter mais informações sobre os módulos carregados e descarregados.
- Camada de teste: vazamento
- ID da interrupção: HANDLE
- Código de parada: 900NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Um HKEY vazou.
Causa provávelEssa parada será gerada se a dll proprietária da chave de registro tiver sido descarregada dinamicamente enquanto possuía recursos.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Valor do HKEY vazado.
- Parâmetro 2 - Endereço para o rastreamento da pilha de alocação. Execute o <endereço> dps para exibir a pilha de alocação.
- Parâmetro 3 - Endereço do nome da dll do proprietário. Execute o <endereço> du para ler o nome da dll.
- Parâmetro 4 - Base da dll do proprietário. Execute .reload <dll_name> = <endereço> para recarregar a dll do proprietário. Use "lm" para obter mais informações sobre os módulos carregados e descarregados.
- Camada de teste: vazamento
- ID da interrupção: REGISTRY
- Código de parada: 900NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Uma reserva virtual vazou.
Causa provávelEssa parada será gerada se a dll proprietária da reserva virtual tiver sido descarregada dinamicamente enquanto possuía recursos.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Endereço de reserva vazado.
- Parâmetro 2 - Endereço para o rastreamento da pilha de alocação. Execute o <endereço> dps para exibir a pilha de alocação.
- Parâmetro 3 - Endereço do nome da dll do proprietário. Execute o <endereço> du para ler o nome da dll.
- Parâmetro 4 - Base da dll do proprietário. Execute .reload <dll_name> = <endereço> para recarregar a dll do proprietário. Use "lm" para obter mais informações sobre os módulos carregados e descarregados.
- Camada de teste: vazamento
- ID da interrupção: VIRTUAL_RESERVATION
- Código de parada: 900NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Um BSTR foi vazado.
Causa provávelEssa parada será gerada se a dll proprietária da SysString tiver sido descarregada dinamicamente enquanto possuía recursos.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Endereço do BSTR vazado. Execute o <endereço> !heap -p -a para obter informações adicionais sobre a alocação.
- Parâmetro 2 - Endereço para o rastreamento da pilha de alocação. Execute o <endereço> dps para exibir a pilha de alocação.
- Parâmetro 3 - Endereço do nome da dll do proprietário. Execute o <endereço> du para ler o nome da dll.
- Parâmetro 4 - Base da dll do proprietário. Execute .reload <dll_name> = <endereço> para recarregar a dll do proprietário. Use "lm" para obter mais informações sobre os módulos carregados e descarregados.
- Camada de teste: vazamento
- ID da interrupção: SYSSTRING
- Código de parada: 900NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Uma notificação de energia não foi cancelada de registro.
Causa provávelEssa interrupção será gerada se a dll estiver registrada para notificação de energia e foi descarregada dinamicamente sem cancelar o registro.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Endereço do registro da notificação de energia.
- Parâmetro 2 - Endereço para o rastreamento da pilha de registro. Execute o <endereço> dps para exibir a pilha de alocação.
- Parâmetro 3 - Endereço do nome da dll do proprietário. Execute o <endereço> du para ler o nome da dll.
- Parâmetro 4 - Base da dll do proprietário. Execute .reload <dll_name> = <endereço> para recarregar a dll do proprietário. Use "lm" para obter mais informações sobre os módulos carregados e descarregados.
- Camada de teste: vazamento
- ID da interrupção: POWER_NOTIFICATION
- Código de parada: 900NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Detalhes da interrupção de bloqueios
O thread não pode possuir uma seção crítica.
Causa provávelEssa interrupção será gerada se um thread (a ID do thread é parameter1) for encerrado, suspenso ou estiver em um estado (o thread de trabalho concluiu um item de trabalho) no qual ele não pode manter uma seção crítica. O thread atual é o culpado. Para depurar essa interrupção, use os seguintes comandos do depurador: $ kb - para obter o rastreamento de pilha atual. Se o thread atual for o proprietário da seção crítica, ele provavelmente está chamando ExitThread. O thread atual deve ter liberado a seção crítica antes de sair. Se o thread atual estiver chamando TerminateThread ou SuspendThread, ele não deverá fazer isso para um thread que contém uma seção crítica. $ !cs -s parameter2 - despeje informações sobre esta seção crítica. $ ln parameter2 - para mostrar símbolos perto do endereço da seção crítica. Isso deve ajudar a identificar a seção crítica vazada. $ dps parameter4 - para despejar o rastreamento de pilha para esta inicialização de seção crítica.
Informações exibidas pelo Application Verifier- Parâmetro 1 - ID do thread.
- Parâmetro 2 - Endereço da seção crítica.
- Parâmetro 3 – Endereço de informações de depuração da seção crítica.
- Parâmetro 4 – Rastreamento de pilha de inicialização de seção crítica.
- Camada de teste: bloqueios
- ID da interrupção: EXIT_THREAD_OWNS_LOCK
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Descarregando DLL que contém uma seção crítica ativa.
Causa provávelEssa interrupção será gerada se uma DLL tiver uma variável global contendo uma seção crítica e a DLL for descarregada, mas a seção crítica não tiver sido excluída. Para depurar essa interrupção, use os seguintes comandos do depurador: $ du parameter3 - para despejar o nome da DLL culpada. $ .reload dllname ou .reload dllname = parameter4 - para recarregar os símbolos dessa DLL. $ !cs -s parameter1 - despeje informações sobre esta seção crítica. $ ln parameter1 - para mostrar símbolos perto do endereço da seção crítica. Isso deve ajudar a identificar a seção crítica vazada. $ dps parameter2 - para despejar o rastreamento de pilha para esta inicialização de seção crítica.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 – Rastreamento de pilha de inicialização de seção crítica.
- Parâmetro 3 — Endereço do nome da DLL.
- Parâmetro 4 — Endereço básico da DLL.
- Camada de teste: bloqueios
- ID da interrupção: LOCK_IN_UNLOADED_DLL
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Liberando bloco de heap que contém uma seção crítica ativa.
Causa provávelEssa interrupção será gerada se uma alocação de heap contiver uma seção crítica, a alocação for liberada e a seção crítica não tiver sido excluída. Para depurar essa interrupção, use os seguintes comandos do depurador: $ !cs -s parameter1 - despeje informações sobre esta seção crítica. $ ln parameter1 - para mostrar símbolos perto do endereço da seção crítica. Isso deve ajudar a identificar a seção crítica vazada. $ dps parameter2 - para despejar o rastreamento de pilha para esta inicialização de seção crítica. $ parameter3 e parameter4 podem ajudar a entender onde esse bloco de heap foi alocado (o tamanho da alocação provavelmente é significativo).
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 – Rastreamento de pilha de inicialização de seção crítica.
- Parâmetro 3 - Endereço do bloco de heap.
- Parâmetro 4 - Tamanho do bloco de heap.
- Camada de teste: bloqueios
- ID da interrupção: LOCK_IN_FREED_HEAP
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Seção crítica duplamente inicializada ou corrompida.
Causa provávelNormalmente, essa interrupção será gerada se uma seção crítica tiver sido inicializada mais de uma vez. Nesse caso, parameter3 e parameter4 são os endereços de rastreamento de pilha para duas dessas inicializações. Algumas outras vezes é possível obter essa interrupção se a seção crítica ou a estrutura de informações de depuração tiver sido corrompida. Neste segundo caso, é possível que parameter3 e parameter4 sejam inválidos e inúteis. Para depurar esta interrupção: $ !cs -s -d parameter2 - despeje informações sobre esta seção crítica. $ ln parameter1 - para mostrar símbolos perto do endereço da seção crítica. Isso pode ajudar a identificar a seção crítica se essa for uma variável global. $ dps parameter3 e dps parameter4 - para identificar os dois caminhos de código para inicializar esta seção crítica.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 - Endereço da estrutura de informações de depuração encontrada na lista ativa.
- Parâmetro 3 — Rastreamento de pilha da primeira inicialização.
- Parâmetro 4 — Rastreamento de pilha da segunda inicialização.
- Camada de teste: bloqueios
- ID da interrupção: LOCK_DOUBLE_INITIALIZE
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Memória livre que contém uma seção crítica ativa.
Causa provávelEssa interrupção será gerada se a memória que contém uma seção crítica foi liberada, mas a seção crítica não foi excluída usando DeleteCriticalSection. Para depurar essa interrupção, use os seguintes comandos do depurador: $ !cs -s -d parameter2 - despeje informações sobre esta seção crítica. $ dps parameter3 - para identificar o caminho do código para inicializar esta seção crítica. Na maioria dos casos, o verificador de bloqueios detecta seções críticas imediatamente vazadas contidas em uma alocação de heap, um intervalo de DLL, uma alocação de memória virtual ou um intervalo de memória mapeado MapViewOfFile e emite interrupções diferentes nesses casos. Portanto, restam pouquíssimos casos para essa interrupção do verificador. O bloqueio deve estar em um intervalo de memória liberado por código de modo kernel ou liberado entre processos por APIs como VirtualFreeEx. Normalmente, essa interrupção será encontrada se uma interrupção anterior (por exemplo, LOCK_IN_FREED_HEAP ou LOCK_IN_UNLOADED_DLL) foi continuada pressionando "g" no console do depurador.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 – Endereço de informações de depuração da seção crítica.
- Parâmetro 3 – Rastreamento de pilha de inicialização de seção crítica.
- Parâmetro 4 — Não usado.
- Camada de teste: bloqueios
- ID da interrupção: LOCK_IN_FREED_MEMORY
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Seção crítica corrompida.
Causa provávelEssa interrupção será gerada se o campo DebugInfo da seção crítica estiver apontando para memória liberada. Normalmente, outra estrutura DebugInfo válida é encontrada na lista de seções críticas ativas. Sem corrupção, os dois ponteiros devem ser idênticos. Para depurar essa interrupção, use os seguintes comandos do depurador: $ !cs -s -d parameter3 - despeje informações sobre esta seção crítica com base no conteúdo atual da estrutura de informações de depuração encontrada na lista ativa (essa estrutura raramente é corrompida, então geralmente essas informações são confiáveis). $ !cs -s parameter1 - despeje informações sobre esta seção crítica com base no conteúdo atual da estrutura da seção crítica (a estrutura já está corrompida, então às vezes essa informação NÃO é confiável). $ dps parameter4 - para identificar o caminho do código para inicializar esta seção crítica. Despeje a seção crítica no parameter1 do endereço e procure o padrão de corrupção. Com bons símbolos para ntdll.dl, você pode usar os seguintes comandos: $ dt ntdll!_RTL_CRITICAL_SECTION LOCK_ADDRESS $ dt ntdll!_RTL_CRITICAL_SECTION_DEBUG DEBUG_ADDRESS
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 – Endereço de informações de depuração inválido desta seção crítica.
- Parâmetro 3 - Endereço das informações de depuração encontradas na lista ativa.
- Parâmetro 4 — Rastreamento de pilha de inicialização.
- Camada de teste: bloqueios
- ID da interrupção: LOCK_CORRUPTED
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Thread de proprietário de seção crítica inválido.
Causa provávelEssa interrupção será gerada se a ID do thread do proprietário for inválido no contexto atual. Para depurar esta interrupção: $ !cs -s parameter1 - despeje informações sobre esta seção crítica. $ ln parameter1 - para mostrar símbolos perto do endereço da seção crítica. Isso deve ajudar a identificar a seção crítica.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 - Thread proprietário.
- Parâmetro 3 – Thread proprietário esperado.
- Parâmetro 4 - Endereço de informações de depuração da seção crítica.
- Camada de teste: bloqueios
- ID da interrupção: LOCK_INVALID_OWNER
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Contagem de recursão de seção crítica inválida.
Causa provávelEssa interrupção será gerada se o campo de contagem de recursão da estrutura de seção crítica for inválido no contexto atual. Para depurar esta interrupção: $ !cs -s parameter1 - despeje informações sobre esta seção crítica. $ ln parameter1 - para mostrar símbolos perto do endereço da seção crítica. Isso deve ajudar a identificar a seção crítica.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 – Contagem de recursão.
- Parâmetro 3 – Contagem de recursão esperada.
- Parâmetro 4 - Endereço de informações de depuração da seção crítica.
- Camada de teste: bloqueios
- ID da interrupção: LOCK_INVALID_RECURSION_COUNT
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Exclusão de seção crítica com contagem de bloqueios inválida.
Causa provávelEssa interrupção será gerada se uma seção crítica for de propriedade de um thread, se for excluída ou se a seção crítica não for inicializada. Para depurar esta interrupção: $ !cs -s parameter1 - despeje informações sobre esta seção crítica. Se o thread proprietário for 0, a seção crítica não foi inicializada. $ ln parameter1 - para mostrar símbolos perto do endereço da seção crítica. Isso deve ajudar a identificar a seção crítica.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 - Contagem de bloqueios.
- Parâmetro 3 – Contagem de bloqueios esperada.
- Parâmetro 4 - Thread proprietário.
- Camada de teste: bloqueios
- ID da interrupção: LOCK_INVALID_LOCK_COUNT
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Seção crítica superliberada ou corrompida.
Causa provávelEssa interrupção será gerada se uma seção crítica for liberada mais vezes do que o thread atual a adquiriu. Para depurar esta interrupção: $ !cs -s parameter1 - despeje informações sobre esta seção crítica. $ !cs -s -d parameter4 - despeje informações sobre esta seção crítica. $ ln parameter1 - para mostrar símbolos perto do endereço da seção crítica. Isso deve ajudar a identificar a seção crítica.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 - Contagem de bloqueios.
- Parâmetro 3 – Contagem de bloqueios esperada.
- Parâmetro 4 - Endereço de informações de depuração da seção crítica.
- Camada de teste: bloqueios
- ID da interrupção: LOCK_OVER_RELEASED
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Seção crítica não inicializada.
Causa provávelEssa interrupção será gerada se uma seção crítica for usada sem ser inicializada ou depois de ter sido excluída. Para depurar essa interrupção: $ ln parameter1 - para mostrar símbolos perto do endereço da seção crítica. Isso deve ajudar a identificar a seção crítica.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 - Endereço de informações de depuração da seção crítica.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: bloqueios
- ID da interrupção: LOCK_NOT_INITIALIZED
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
A seção crítica já foi inicializada.
Causa provávelEssa interrupção será gerada se uma seção crítica for reinicializada pelo thread atual. Para depurar essa interrupção: $ !cs -s parameter1 ou !cs -s -d parameter2 - despeje informações sobre esta seção crítica. $ ln parameter1 - para mostrar símbolos perto do endereço da seção crítica. Isso pode ajudar a identificar a seção crítica se essa for uma variável global. $ dps parameter3 - para identificar o caminho do código para a primeira inicialização desta seção crítica. $ kb - para exibir o rastreamento de pilha atual, que está reinicializando esta seção crítica.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 - Endereço de informações de depuração da seção crítica.
- Parâmetro 3 — Rastreamento de pilha da primeira inicialização. Use dps para despejá-lo se não for NULL
- Parâmetro 4 — Não usado.
- Camada de teste: bloqueios
- ID da interrupção: LOCK_ALREADY_INITIALIZED
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Liberando memória virtual que contém uma seção crítica ativa.
Causa provávelEssa interrupção será gerada se o thread atual estiver chamando VirtualFree em um bloco de memória que contém uma seção crítica ativa. O aplicativo deve chamar DeleteCriticalSection nesta seção crítica antes de liberar essa memória. $ kb - para exibir o rastreamento de pilha atual, que está chamando VirtualFree. O provável culpado é a DLL que chama VirtualFree. $ !cs -s parameter1 - despeje informações sobre esta seção crítica. $ dps parameter2 - para identificar o caminho do código para a inicialização desta seção crítica.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 – Rastreamento de pilha de inicialização de seção crítica.
- Parâmetro 3 – Endereço do bloco de memória.
- Parâmetro 4 – Tamanho do bloco de memória.
- Camada de teste: bloqueios
- ID da interrupção: LOCK_IN_FREED_VMEM
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Desmapeando a região de memória que contém uma seção crítica ativa.
Causa provávelEssa interrupção será gerada se o thread atual estiver chamando UnmapViewOfFile em um bloco de memória que contém uma seção crítica ativa. O aplicativo deve chamar DeleteCriticalSection nesta seção crítica antes de desmapear essa memória. $ kb - para exibir o rastreamento de pilha atual, que está chamando UnmapViewOfFile. O provável culpado é a DLL que chama UnmapViewOfFile. $ !cs -s parameter1 - despeje informações sobre esta seção crítica. $ dps parameter2 - para identificar o caminho do código para a inicialização desta seção crítica.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 – Rastreamento de pilha de inicialização de seção crítica.
- Parâmetro 3 – Endereço do bloco de memória.
- Parâmetro 4 – Tamanho do bloco de memória.
- Camada de teste: bloqueios
- ID da interrupção: LOCK_IN_UNMAPPED_MEM
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
O thread atual não possui nenhuma seção crítica.
Causa provávelEssa interrupção será gerada se o thread atual estiver chamando LeaveCriticalSection, mas, de acordo com a contabilidade interna do verificador, ele não possui nenhuma seção crítica. Se parameter2 for zero, provavelmente este é um bug no thread atual. Ele tenta deixar uma seção crítica que não entrou, ou talvez esteja chamando LeaveCriticalSection mais vezes do que chamou EnterCriticalSection para a mesma seção crítica. Se parameter2 não for zero (é um número inteiro negativo), as estruturas de dados do verificador interno provavelmente estarão corrompidas.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 - Número de seções críticas pertencentes ao thread atual.
- Parâmetro 3 — Não usado
- Parâmetro 4 — Não usado
- Camada de teste: bloqueios
- ID da interrupção: THREAD_NOT_LOCK_OWNER
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Usando a seção crítica que é privada para outra DLL.
Causa provávelEssa interrupção será gerada se o thread atual tenta usar um bloqueio privado que reside dentro de outra DLL. Por exemplo, a.dll tenta inserir uma seção crítica definida dentro de ntdll.dll. Os bloqueios privados não podem ser usados em DLLs.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço da seção crítica.
- Parâmetro 2 — Não usado.
- Parâmetro 3 — Não usado
- Parâmetro 4 — Não usado
- Camada de teste: bloqueios
- ID da interrupção: LOCK_PRIVATE
- Código de parada: 200NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Detalhes da interrupção de bloqueios SRW
O bloqueio SRW não é inicializado.
Causa provávelEssa interrupção será gerada se um thread estiver tentando usar o bloqueio SRW (Param1) que não foi inicializado. $ kb - para obter o rastreamento de pilha atual. É aqui que o bloqueio SRW está sendo usado. O bloqueio SRW deve ser inicializado usando InitializeSRWLock antes de poder ser usado.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Bloqueio SRW.
- Parâmetro 2 — Não usado
- Parâmetro 3 — Não usado
- Parâmetro 4 — Não usado
- Camada de teste: SRWLock
- ID da interrupção: NOT_INITIALIZED
- Código de parada: 250NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
O bloqueio SRW já foi inicializado.
Causa provávelEssa interrupção será gerada se o bloqueio SRW (Param1) estiver sendo reinicializado. Se o bloqueio SRW estiver sendo usado ativamente por outros threads, reinicializar o bloqueio resultará em comportamento imprevisível do aplicativo, incluindo travamentos e falhas. O rastreamento de pilha de inicialização poderá mostrar uma aquisição se o bloqueio SRW tiver sido inicializado estaticamente. $ kb - para obter o rastreamento de pilha atual. É aqui que o bloqueio SRW está sendo reinicializado. $ dps Param3 - para obter o rastreamento da pilha de inicialização de bloqueio SRW. Esse rastreamento de pilha poderá mostrar uma aquisição se o bloqueio tiver sido inicializado estaticamente.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Bloqueio SRW.
- Parâmetro 2 - ThreadId do thread que inicializou o bloqueio SRW.
- Parâmetro 3 — Endereço do rastreamento da pilha da inicialização. Use o <endereço> dps para ver onde o bloqueio SRW foi inicializado.
- Parâmetro 4 — Não usado
- Camada de teste: SRWLock
- ID da interrupção: ALREADY_INITIALIZED
- Código de parada: 250NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Aquisição-liberação incompatível no bloqueio SRW.
Causa provávelEssa interrupção será gerada se o bloqueio SRW (Param1) estiver sendo liberado com uma API de liberação errada. Se o bloqueio SRW foi adquirido para acesso compartilhado e está sendo liberado usando a API de versão exclusiva ou o bloqueio SRW foi adquirido para acesso exclusivo e está sendo liberado usando a API de versão compartilhada. Isso pode resultar em comportamento imprevisível pelo aplicativo, incluindo travamentos e falhas. $ kb - para obter o rastreamento de pilha atual. É aqui que o bloqueio SRW está sendo liberado usando a API errada. $ dps Param3 - para obter o rastreamento da pilha de aquisição de bloqueio SRW.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Bloqueio SRW.
- Parâmetro 2 - ThreadId do thread que adquiriu o bloqueio SRW.
- Parâmetro 3 — Endereço do rastreamento da pilha da aquisição. Use o <endereço> dps para ver onde o bloqueio SRW foi adquirido.
- Parâmetro 4 — Não usado
- Camada de teste: SRWLock
- ID da interrupção: MISMATCHED_ACQUIRE_RELEASE
- Código de parada: 250NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
O bloqueio SRW está sendo adquirido recursivamente pelo mesmo thread.
Causa provávelEssa interrupção será gerada se o bloqueio SRW (Param1) estiver sendo adquirido recursivamente pelo mesmo thread. Isso resultará em um impasse e o thread será bloqueado indefinidamente. A aquisição recursiva de um bloqueio SRW no modo exclusivo causará um impasse. A aquisição recursiva de um bloqueio SRW no modo compartilhado causará um impasse quando houver um thread aguardando acesso exclusivo. Considere o exemplo abaixo: - O Thread A adquire o bloqueio SRW no modo compartilhado - O Thread B tenta adquirir o bloqueio SRW no modo exclusivo e aguarda - O Thread A tenta adquirir o bloqueio SRW no modo compartilhado recursivamente. Isso será bem-sucedido desde que não haja espera exclusiva (neste caso B). Como os bloqueios SRW não têm fome de espera, o thread A espera atrás do thread B. Agora, o Thread B está esperando pelo Thread A que, por sua vez, está esperando pelo Thread B, causando uma espera circular e, portanto, um impasse. $ kb - para obter o rastreamento de pilha atual. É aqui que o bloqueio SRW está sendo adquirido recursivamente. $ dps Param2 - para obter o rastreamento de pilha para a primeira aquisição.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Bloqueio SRW.
- Parâmetro 2 — Endereço do rastreamento da pilha da primeira aquisição. Use o <endereço> dps para ver onde o bloqueio SRW foi adquirido.
- Parâmetro 3 — Não usado
- Parâmetro 4 — Não usado
- Camada de teste: SRWLock
- ID da interrupção: RECURSIVE_ACQUIRE
- Código de parada: 250NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
O thread que está saindo ou sendo encerrado possui um bloqueio SRW.
Causa provávelEssa interrupção será gerada se o thread (Param2) que possui o bloqueio SRW (Param1) estiver saindo ou sendo encerrado. Isso resultará em um bloqueio SRW órfão e os threads que tentarem adquirir esse bloqueio serão bloqueados indefinidamente. $ kb - para obter o rastreamento de pilha atual. É aqui que o thread está saindo ou está sendo encerrado. $ dps Param3 - para obter o rastreamento da pilha de aquisição de bloqueio SRW.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Bloqueio SRW.
- Parâmetro 2 - ThreadId do thread que está saindo ou sendo encerrado.
- Parâmetro 3 — Endereço do rastreamento da pilha da aquisição. Use o <endereço> dps para ver onde o bloqueio SRW foi adquirido.
- Parâmetro 4 — Não usado
- Camada de teste: SRWLock
- ID da interrupção: EXIT_THREAD_OWNS_LOCK
- Código de parada: 250NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
O bloqueio SRW que está sendo liberado não foi adquirido por este thread.
Causa provávelEssa interrupção será gerada se o bloqueio SRW (Param1) estiver sendo liberado pelo thread (Param2) que não adquiriu o bloqueio. Isso representa uma prática de programação ruim que é difícil de acertar e pode levar a um comportamento imprevisível do aplicativo. $ kb - para obter o rastreamento de pilha atual. É aqui que o thread está liberando o bloqueio SRW que ele não adquiriu. $ dps Param4 - para obter o rastreamento da pilha de aquisição de bloqueio SRW.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Bloqueio SRW.
- Parâmetro 2 — ThreadId atual.
- Parâmetro 3 - ThreadId do thread que adquiriu o bloqueio SRW.
- Parâmetro 4 — Endereço do rastreamento da pilha da aquisição. Use o <endereço> dps para ver onde o bloqueio SRW foi adquirido.
- Camada de teste: SRWLock
- ID da interrupção: INVALID_OWNER
- Código de parada: 250NAN
- Severidade: Aviso
- Erro único:
- Relatório de erro: Nenhum
- Registrar no arquivo: sim
- Criar backtrace: sim
A memória que está sendo liberada contém um bloqueio SRW ativo.
Causa provávelEssa interrupção será gerada se o endereço de memória (Param1) que está sendo liberado contiver um bloqueio SRW ativo que ainda esteja em uso. Isso pode resultar em comportamento imprevisível pelo aplicativo, incluindo falhas e travamentos. $ kb - para obter o rastreamento de pilha atual. É aqui que a memória está sendo liberada que contém um bloqueio SRW ativo. $ dps Param4 - para obter o rastreamento da pilha de aquisição de bloqueio SRW.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Bloqueio SRW.
- Parâmetro 2 - Endereço da memória que está sendo liberada.
- Parâmetro 3 - ThreadId do thread que adquiriu o bloqueio SRW.
- Parâmetro 4 — Endereço do rastreamento da pilha da aquisição. Use o <endereço> dps para ver onde o bloqueio SRW foi adquirido.
- Camada de teste: SRWLock
- ID da interrupção: IN_FREED_MEMORY
- Código de parada: 250NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
A DLL que está sendo descarregada contém um bloqueio SRW ativo.
Causa provávelEssa interrupção será gerada se a DLL que está sendo descarregada (Param2) contiver um bloqueio SRW ativo (Param1) que ainda esteja em uso. Isso pode resultar em comportamento imprevisível pelo aplicativo, incluindo falhas e travamentos. $ kb - para obter o rastreamento de pilha atual. É aqui que a DLL está sendo descarregada que contém um bloqueio SRW ativo. $ du Param2 - para encontrar o nome da DLL que está sendo descarregada. $ dps Param4 - para obter o rastreamento da pilha de aquisição de bloqueio SRW.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Bloqueio SRW.
- Parâmetro 2 - Endereço do nome da DLL que está sendo descarregada. Use o <endereço> du para ver o nome.
- Parâmetro 3 - ThreadId do thread que adquiriu o bloqueio SRW.
- Parâmetro 4 — Endereço do rastreamento da pilha da aquisição. Use o <endereço> dps para ver onde o bloqueio SRW foi adquirido.
- Camada de teste: SRWLock
- ID da interrupção: IN_UNLOADED_DLL
- Código de parada: 250NAN
- Severidade: Aviso
- Erro único:
- Relatório de erro: Nenhum
- Registrar no arquivo: sim
- Criar backtrace: sim
Detalhes da interrupção de memória
Liberando bloco de memória virtual com tamanho ou endereço inicial inválidos.
Causa provávelEssa interrupção será gerada se o verificador de aplicativo detectar um VirtualFree ou um descarregamento de DLL com um endereço inicial ou tamanho da alocação de memória inválido. No caso de descarregar a DLL, isso provavelmente significa uma corrupção de memória dentro da lista de DLLs carregada. Para depurar essa interrupção, examine o rastreamento de pilha atual e o endereço e o tamanho da memória que está prestes a ser liberado e tente determinar por que eles são inválidos.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço básico de alocação.
- Parâmetro 2 – Tamanho da região de memória.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: INVALID_FREEMEM
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Chamada de alocação virtual incorreta.
Causa provávelEssa interrupção será gerada se o verificador de aplicativo detectar uma chamada VirtualAlloc com um endereço inicial ou tamanho da alocação de memória inválido. Para depurar essa interrupção, examine o rastreamento de pilha atual (kb) e o endereço e o tamanho da memória que está prestes a ser alocado e tente determinar por que eles são inválidos.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Ponteiro para o endereço básico de alocação.
- Parâmetro 2 - Ponteiro para o tamanho da região de memória.
- Parâmetro 3 — Não usado
- Parâmetro 4 — Não usado
- Camada de teste: memória
- ID da interrupção: INVALID_ALLOCMEM
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Chamada de visualização de mapa incorreta.
Causa provávelEssa interrupção será gerada se o verificador de aplicativo detectar uma chamada MapViewOfFile com um endereço básico ou tamanho do mapeamento inválido. Para depurar essa interrupção, examine o rastreamento de pilha atual (kb) e o endereço e o tamanho da memória que está prestes a ser mapeado e tente determinar por que eles são inválidos.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Ponteiro para mapear o endereço básico.
- Parâmetro 2 - Ponteiro para exibir o tamanho.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: INVALID_MAPVIEW
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Investigando endereço inválido.
Causa provávelEssa interrupção será gerada se o verificador de aplicativo detectar uma chamada IsBadXXXPtr com um endereço inválido (por exemplo, um endereço de modo kernel, em vez de um endereço de modo de usuário normal) para o buffer de memória a ser examinado. Para depurar essa interrupção, examine o rastreamento de pilha atual (kb) e tente determinar por que o chamador da função IsBadXXXPtr acabou com um endereço inválido. Muitas vezes, o endereço é simplesmente falso, por exemplo, um ponteiro não inicializado. A biblioteca MSDN lista alguns motivos pelos quais os aplicativos não devem usar as APIs IsBadXXXPtr: em um ambiente multitarefa preemptivo, é possível que algum outro thread altere o acesso do processo à memória que está sendo testada. O cancelamento da referência de ponteiros possivelmente inválidos pode desativar a expansão de pilha em outros threads. Um thread esgotando a pilha, quando a expansão da pilha foi desativada, resulta no encerramento imediato do processo pai, sem janela de erro pop-up ou informações de diagnóstico. Espera-se que os threads em um processo cooperem de tal forma que um não libere a memória de que o outro precisa. O uso dessa função não nega a necessidade de fazer isso. Se isso não for feito, o aplicativo pode falhar de maneira imprevisível. Por todos esses motivos, recomendamos nunca usar essas APIs.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço inicial.
- Parâmetro 2 – Tamanho do bloco de memória.
- Parâmetro 3 – Endereço inválido.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: PROBE_INVALID_ADDRESS
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Sondando memória livre.
Causa provávelEssa interrupção será gerada se o verificador de aplicativo detectar uma chamada IsBadXXXPtr para uma alocação de memória livre. Isso é muito ruim porque é possível que, em alguns outros casos, essa memória já tenha sido reutilizada para alguma outra alocação. Como o caminho de código atual (kb) não possui essa memória, ele pode acabar corrompendo a memória de outra pessoa, com efeitos desastrosos. Para depurar essa interrupção, examine o rastreamento de pilha atual (kb) e tente determinar por que o chamador da função IsBadXXXPtr acabou sondando a memória livre. O endereço pode ser simplesmente falso (por exemplo, ponteiro não inicializado) ou talvez já liberado memória. Se a memória já foi liberada por uma das APIs VirtualFree ou UnmapViewOfFile, "!avrf -vs -a parameter3" procurará um log de rastreamentos de pilha dos caminhos de código que alocaram/liberaram esse endereço e exibirá esses rastreamentos de pilha se estiverem disponíveis. Isso pode mostrar o rastreamento de pilha que liberou essa memória. Mais frequentemente, a memória é uma alocação de heap já liberada. Para verificar essa possibilidade, "!avrf -hp -a parameter3" procurará um log de rastreamentos de pilha dos caminhos de código que alocaram/liberaram esse endereço de/para o heap e exibirá esses rastreamentos de pilha se estiverem disponíveis. A biblioteca MSDN lista alguns motivos pelos quais os aplicativos não devem usar as APIs IsBadXXXPtr: em um ambiente multitarefa preemptivo, é possível que algum outro thread altere o acesso do processo à memória que está sendo testada. O cancelamento da referência de ponteiros possivelmente inválidos pode desativar a expansão de pilha em outros threads. Um thread esgotando a pilha, quando a expansão da pilha foi desativada, resulta no encerramento imediato do processo pai, sem janela de erro pop-up ou informações de diagnóstico. Espera-se que os threads em um processo cooperem de tal forma que um não libere a memória de que o outro precisa. O uso dessa função não nega a necessidade de fazer isso. Se isso não for feito, o aplicativo pode falhar de maneira imprevisível. Por todos esses motivos, recomendamos nunca usar essas APIs.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço inicial.
- Parâmetro 2 – Tamanho do bloco de memória.
- Parâmetro 3 – Endereço da página de memória livre.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: PROBE_FREE_MEM
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Examinando uma página de proteção.
Causa provávelEssa interrupção será gerada se o verificador de aplicativo detectar uma chamada IsBadXXXPtr para uma alocação de memória que contenha pelo menos um GUARD_PAGE. Isso é muito ruim porque é muito possível que esse GUARD_PAGE seja o fim da pilha atual de um thread. Conforme documentado na biblioteca MSDN: o cancelamento da referência de ponteiros potencialmente inválidos pode desabilitar a expansão de pilha em outros threads. Um thread esgotando a pilha, quando a expansão da pilha foi desativada, resulta no encerramento imediato do processo pai, sem janela de erro pop-up ou informações de diagnóstico. Para depurar essa interrupção, examine o rastreamento de pilha atual (kb) e tente determinar por que o chamador da função IsBadXXXPtr acabou sondando um GUARD_PAGE. A biblioteca MSDN lista alguns motivos pelos quais os aplicativos não devem usar as APIs IsBadXXXPtr: em um ambiente multitarefa preemptivo, é possível que algum outro thread altere o acesso do processo à memória que está sendo testada. O cancelamento da referência de ponteiros possivelmente inválidos pode desativar a expansão de pilha em outros threads. Um thread esgotando a pilha, quando a expansão da pilha foi desativada, resulta no encerramento imediato do processo pai, sem janela de erro pop-up ou informações de diagnóstico. Espera-se que os threads em um processo cooperem de tal forma que um não libere a memória de que o outro precisa. O uso dessa função não nega a necessidade de fazer isso. Se isso não for feito, o aplicativo pode falhar de maneira imprevisível. Por todos esses motivos, recomendamos nunca usar essas APIs.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço inicial.
- Parâmetro 2 – Tamanho do bloco de memória.
- Parâmetro 3 – Endereço da página de proteção.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: PROBE_GUARD_PAGE
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Investigando o endereço NULL.
Causa provávelEssa interrupção será gerada se o verificador de aplicativo detectar uma chamada IsBadXXXPtr com um endereço NULL. Para depurar essa interrupção, examine o rastreamento de pilha atual (kb) e tente determinar por que o chamador da função IsBadXXXPtr acabou com o endereço NULL. Normalmente, esse é o sinal de que alguém não está verificando o valor de retorno de uma das funções de alocação de memória. Por exemplo, o código abaixo está incorreto: int main (void) { PVOID p; p = malloc (1024); Use (p); return 0; } void Use (PVOID p) { if (IsBadReadPtr (p)) { return; } // // p é seguro para ser usado aqui. // } Esse código deve ser reescrito da seguinte forma: int main (void) { PVOID p; p = malloc (1024); if (NULL == p)) { return -1; } Use (p); return 0; } void Use (PVOID p) { // // p é seguro para ser usado aqui. // } A biblioteca MSDN lista alguns motivos pelos quais os aplicativos não devem usar as APIs IsBadXXXPtr: em um ambiente multitarefa preemptivo, é possível que algum outro thread altere o acesso do processo à memória que está sendo testada. O cancelamento da referência de ponteiros possivelmente inválidos pode desativar a expansão de pilha em outros threads. Um thread esgotando a pilha, quando a expansão da pilha foi desativada, resulta no encerramento imediato do processo pai, sem janela de erro pop-up ou informações de diagnóstico. Espera-se que os threads em um processo cooperem de tal forma que um não libere a memória de que o outro precisa. O uso dessa função não nega a necessidade de fazer isso. Se isso não for feito, o aplicativo pode falhar de maneira imprevisível. Por todos esses motivos, recomendamos nunca usar essas APIs.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Não usado.
- Parâmetro 2 — Não usado.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: PROBE_NULL
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Investigando bloco de memória com endereço inicial ou tamanho inválido.
Causa provávelEssa interrupção será gerada se o verificador de aplicativo detectar uma chamada IsBadXXXPtr com um endereço inicial inválido (por exemplo, um endereço de modo kernel, em vez de um endereço de modo de usuário normal) ou tamanho inválido para o buffer de memória a ser examinado. Para depurar essa interrupção, examine o rastreamento de pilha atual (kb) e tente determinar por que o chamador da função IsBadXXXPtr acabou com um endereço ou tamanho inválido. Muitas vezes, o endereço ou o tamanho são simplesmente falsos, por exemplo, uma variável não inicializada. A biblioteca MSDN lista alguns motivos pelos quais os aplicativos não devem usar as APIs IsBadXXXPtr: em um ambiente multitarefa preemptivo, é possível que algum outro thread altere o acesso do processo à memória que está sendo testada. O cancelamento da referência de ponteiros possivelmente inválidos pode desativar a expansão de pilha em outros threads. Um thread esgotando a pilha, quando a expansão da pilha foi desativada, resulta no encerramento imediato do processo pai, sem janela de erro pop-up ou informações de diagnóstico. Espera-se que os threads em um processo cooperem de tal forma que um não libere a memória de que o outro precisa. O uso dessa função não nega a necessidade de fazer isso. Se isso não for feito, o aplicativo pode falhar de maneira imprevisível. Por todos esses motivos, recomendamos nunca usar essas APIs.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço inicial.
- Parâmetro 2 – Tamanho do bloco de memória.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: PROBE_INVALID_START_OR_SIZE
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Descarregando a DLL com tamanho ou endereço inicial inválido.
Causa provávelEssa interrupção será gerada se o verificador de aplicativo detectar um descarregamento de DLL com um endereço inicial ou tamanho inválido do intervalo de memória da DLL. Isso provavelmente significa uma corrupção de memória dentro da lista de DLL interna ntdll.dll carregada.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Endereço básico de memória da DLL.
- Parâmetro 2 – Tamanho do intervalo de memória da DLL.
- Parâmetro 3 — Endereço do nome da DLL. Use du para despejar.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: INVALID_DLL_RANGE
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Liberando o bloco de memória dentro do intervalo de endereços de pilha do thread atual.
Causa provávelEssa interrupção será gerada se o verificador do aplicativo detectar um VirtualFree para um bloco de memória que, na verdade, faz parte da pilha do thread atual (!). Para depurar essa interrupção, observe o rastreamento de pilha atual (kb) e tente entender por que a função chamada VirtualFree pensou que o bloco de memória foi alocado dinamicamente ou mapeado, mas que, na verdade, era memória alocada da pilha.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço básico de alocação.
- Parâmetro 2 – Tamanho da região de memória.
- Parâmetro 3 - Endereço de limite mínimo da pilha.
- Parâmetro 4 - Endereço de limite máximo da pilha.
- Camada de teste: memória
- ID da interrupção: FREE_THREAD_STACK_MEMORY
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Parâmetro FreeType incorreto para a operação VirtualFree.
Causa provávelEssa interrupção será gerada se o verificador do aplicativo detectar um VirtualFree com um valor incorreto para o parâmetro FreeType. Os dois únicos valores aceitáveis para esse parâmetro são MEM_DECOMMIT e MEM_RELEASE. Se VirtualFree for chamado com qualquer outro valor, exceto esses dois, VirtualFree não conseguirá liberar a memória. Para depurar essa interrupção, olhe para o rastreamento de pilha atual (kb): o chamador do VirtualFree é provavelmente o culpado.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Valor incorreto usado pelo aplicativo.
- Parâmetro 2 – Valor correto esperado 1.
- Parâmetro 3 – Valor correto esperado 2.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: INVALID_FREE_TYPE
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Tentando liberar o bloco de memória virtual que já está livre.
Causa provávelEssa interrupção será gerada se o verificador do aplicativo detectar um VirtualFree para um endereço que já é gratuito. Para depurar essa interrupção, examine o rastreamento de pilha atual (kb) e tente determinar por que a memória já está livre, mas o aplicativo está tentando liberá-la novamente. "!avrf -vs -a parameter1" procurará um log de rastreamentos de pilha dos caminhos de código que alocaram/liberaram esse endereço e exibirá esses rastreamentos de pilha se estiverem disponíveis. Isso pode mostrar o rastreamento de pilha que liberou essa memória.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Endereço do bloco de memória.
- Parâmetro 2 — Não usado.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: MEM_ALREADY_FREE
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Parâmetro Size incorreto para a operação VirtualFree (MEM_RELEASE).
Causa provávelEssa interrupção será gerada se o verificador de aplicativo detectar um VirtualFree (MEM_RELEASE) com um valor diferente de zero para o parâmetro dwSize. Ao usar MEM_RELEASE, o único valor aceitável para esse parâmetro é 0. Se VirtualFree for chamado com qualquer outro valor, exceto 0, VirtualFree não conseguirá liberar a memória. Para depurar essa interrupção, olhe para o rastreamento de pilha atual (kb): o chamador do VirtualFree é provavelmente o culpado.
Informações exibidas pelo Application Verifier- Parâmetro 1 – Tamanho incorreto usado pelo aplicativo.
- Parâmetro 2 – Tamanho correto esperado (0).
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: INVALID_FREE_SIZE
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Exceção inesperada gerada na rotina de ponto de entrada da DLL.
Causa provávelEssa interrupção será gerada se a função de ponto de entrada (DllMain) de uma DLL estiver gerando uma exceção. Um exemplo por que isso é ruim é: se DllMain(DLL_PROCESS_ATTACH) está gerando uma exceção, o carregador de DLL do Windows vai: - Capturar e ocultar a exceção; - Descarregar a DLL sem chamar DllMain(DLL_PROCESS_DETACH). Então, em muitos casos, a DLL já alocou alguns recursos, levantou a exceção e não terá a chance de liberar esses recursos no DllMain (DLL_PROCESS_DETACH). Para depurar essa interrupção: $ du parameter1 - para exibir o nome da DLL; $ .exr parameter2 - para exibir as informações de exceção; $ .cxr parameter3 seguido de kb - para exibir as informações de contexto de exceção e o rastreamento de pilha para o momento em que a exceção foi gerada; $ parameter4 é o endereço de uma estrutura interna de verificadores e não tem nenhum significado para a maioria dos usuários verificadores.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Nome da DLL (use du para despejá-lo).
- Parâmetro 2 — Registro de exceção. Use .exr para exibir.
- Parâmetro 3 — Registro de contexto. Use .cxr para exibir.
- Parâmetro 4 - Descritor dll do verificador
- Camada de teste: memória
- ID da interrupção: DLL_UNEXPECTED_EXCEPTION
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Exceção inesperada gerada na função do thread.
Causa provávelEssa interrupção será gerada se uma função de thread estiver gerando uma exceção. Isso é ruim porque todo o processo será eliminado. Para depurar essa interrupção: $ parameter1 pode ser significativo para o tipo de exceção. Por exemplo, um código de exceção C0000005 significa Violação de Acesso; $ .exr parameter2 - para exibir as informações de exceção; $ .cxr parameter3 seguido de kb - para exibir as informações de contexto de exceção;
Informações exibidas pelo Application Verifier- Parâmetro 1 — Código de exceção.
- Parâmetro 2 — Registro de exceção. Use .exr para exibir.
- Parâmetro 3 — Registro de contexto. Use .cxr para exibir.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: THREAD_UNEXPECTED_EXCEPTION
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Exceção inesperada gerada ao sondar a memória.
Causa provávelEssa interrupção será gerada se obtivermos uma exceção durante uma chamada IsBadXXXPtr. Isso significa que o buffer de memória que estamos sondando não tem a proteção assumida pelo chamador, ou que a memória já foi liberada etc. Consulte a discussão acima sobre outro código de parada (PROBE_INVALID_ADDRESS, PROBE_FREE_MEM, PROBE_GUARD_PAGE, PROBE_NULL PROBE_INVALID_START_OR_SIZE) para obter mais exemplos de por que o uso das APIs IsBadXXXPtr não é recomendado. Para depurar essa interrupção: $ parameter1 normalmente será C0000005 e isso significa Violação de Acesso; $ .exr parameter2 - para exibir as informações de exceção; $ .cxr parameter3 seguido de kb - para exibir as informações de contexto de exceção e rastreamento de pilha no momento em que a exceção foi gerada;
Informações exibidas pelo Application Verifier- Parâmetro 1 — Código de exceção.
- Parâmetro 2 — Registro de exceção. Use .exr para exibir.
- Parâmetro 3 — Registro de contexto. Use .cxr para exibir.
- Parâmetro 4 — Não usado
- Camada de teste: memória
- ID da interrupção: PROBE_UNEXPECTED_EXCEPTION
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Tentando redefinir o endereço NULL.
Causa provávelEssa interrupção será gerada se o verificador de aplicativo detectar uma chamada VirtualFree (MEM_RESET) com um primeiro parâmetro NULL. MEM_RESET deve ser usado apenas para memória já alocada, portanto, NULL não é um primeiro parâmetro válido nesse caso.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Não usado.
- Parâmetro 2 — Não usado.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: INVALID_MEM_RESET
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Liberando o bloco de memória heap dentro do intervalo de endereços de pilha do thread atual.
Causa provávelEssa interrupção será gerada se o verificador do aplicativo detectar um HeapFree para um bloco de memória que, na verdade, faz parte da pilha do thread atual (!). Para depurar essa interrupção, observe o rastreamento de pilha atual (kb) e tente entender por que a função chamada HeapFree pensou que o bloco de memória foi alocado dinamicamente ou mapeado, mas que, na verdade, era memória alocada da pilha.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço básico de alocação.
- Parâmetro 2 – Tamanho da região de memória.
- Parâmetro 3 - Endereço de limite mínimo da pilha.
- Parâmetro 4 - Endereço de limite máximo da pilha.
- Camada de teste: memória
- ID da interrupção: FREE_THREAD_STACK_MEMORY_AS_HEAP
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Desmapeando a região de memória dentro do intervalo de endereços de pilha do thread atual.
Causa provávelEssa interrupção será gerada se o verificador do aplicativo detectar um UnmapViewOfFile para um bloco de memória que, na verdade, faz parte da pilha do thread atual (!). Para depurar essa interrupção, observe o rastreamento de pilha atual (kb) e tente entender por que a função chamada UnmapViewOfFile pensou que o bloco de memória foi alocado dinamicamente ou mapeado, mas que, na verdade, era memória alocada da pilha.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço básico de alocação.
- Parâmetro 2 – Tamanho da região de memória.
- Parâmetro 3 - Endereço de limite mínimo da pilha.
- Parâmetro 4 - Endereço de limite máximo da pilha.
- Camada de teste: memória
- ID da interrupção: FREE_THREAD_STACK_MEMORY_AS_MAP
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Endereço RTL_RESOURCE incorreto.
Causa provávelEssa interrupção será gerada se o aplicativo estiver tentando usar NULL ou algum outro endereço incorreto (por exemplo, um endereço de modo kernel) como o endereço de um objeto válido. RtlInitializeResource (NULL) é uma chamada de API incorreta que acionará esse tipo de interrupção do verificador. param1 é o endereço incorreto usado e o culpado está no rastreamento de pilha (exiba-o com kb).
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço.
- Parâmetro 2 — Não usado.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: INVALID_RESOURCE_ADDRESS
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Endereço de seção crítica inválido.
Causa provávelEssa interrupção será gerada se o aplicativo estiver tentando usar NULL ou algum outro endereço incorreto (por exemplo, um endereço de modo kernel) como o endereço de um objeto válido. EnterCriticalSection(NULL) é uma chamada de API incorreta que acionará esse tipo de interrupção do verificador. param1 é o endereço incorreto usado e o culpado está no rastreamento de pilha (exiba-o com kb).
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço.
- Parâmetro 2 — Não usado.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: INVALID_CRITSECT_ADDRESS
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Tente executar o código na memória não executável.
Causa provávelEssa parada será gerada se o aplicativo estiver tentando executar código de um endereço que não é executável ou é livre. Para depurar a interrupção: $ u parameter2 — para desmontar o código culpado; $ .exr parameter3 — para exibir as informações de exceção; $ .cxr parameter4 seguido por kb — para exibir as informações de contexto de exceção e o rastreamento de pilha quando a exceção foi gerada.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Endereço sendo acessado.
- Parâmetro 2 — Código realizando acesso inválido.
- Parâmetro 3 — Registro de exceção. Use .exr para exibir.
- Parâmetro 4 — Registro de contexto. Use .cxr para exibir.
- Camada de teste: memória
- ID da interrupção: THREAD_UNEXPECTED_EXCEPTION_CODE
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Exceção inesperada gerada durante a inicialização do buffer de saída.
Causa provávelEssa interrupção será gerada se obtivermos uma exceção ao inicializar um buffer especificado como parâmetro de saída para uma API Win32 ou CRT. Isso normalmente significa que o tamanho do buffer de saída especificado está incorreto. Para depurar essa interrupção: $ .exr parameter3 - para exibir as informações de exceção; $ .cxr parameter4 seguido de KB - para exibir as informações de contexto de exceção e rastreamento de pilha no momento em que a exceção foi gerada.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço inicial do buffer.
- Parâmetro 2 - Tamanho do buffer.
- Parâmetro 3 — Registro de exceção. Use .exr para exibir.
- Parâmetro 4 — Registro de contexto. Use .cxr para exibir.
- Camada de teste: memória
- ID da interrupção: OUTBUFF_UNEXPECTED_EXCEPTION
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Exceção inesperada ao tentar encontrar o tamanho do bloco de heap.
Causa provávelEssa interrupção será gerada se obtivermos uma exceção ao chamar HeapSize para um bloco de heap que está sendo liberado. Isso normalmente significa que o endereço de bloco de heap especificado está incorreto ou o heap está corrompido. Para depurar essa interrupção: $ .exr parameter3 - para exibir o registro de exceção; $ .cxr parameter4 seguido de KB - para exibir as informações de contexto de exceção e rastreamento de pilha no momento em que a exceção foi gerada.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço do bloco de heap que está sendo liberado.
- Parâmetro 2 — Identificador de heap.
- Parâmetro 3 — Registro de exceção. Use .exr para exibir.
- Parâmetro 4 — Registro de contexto. Use .cxr para exibir.
- Camada de teste: memória
- ID da interrupção: SIZE_HEAP_UNEXPECTED_EXCEPTION
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Liberando o bloco de memória com endereço inicial inválido.
Causa provávelEssa interrupção será gerada se o programa chamar VirtualFree (MEM_RELEASE) com um parâmetro lpAddress que não seja o endereço básico retornado pela função VirtualAlloc ou VirtualAllocEx quando a região das páginas foi reservada. Para depurar essa interrupção: $ kb - para exibir o rastreamento de pilha atual, que está chamando VirtualFree. O provável culpado é a DLL que chama VirtualFree.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço do bloco de memória que está sendo liberado.
- Parâmetro 2 – Endereço de bloco de memória correto esperado.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: INVALID_FREEMEM_START_ADDRESS
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Desmapeando o bloco de memória com endereço inicial inválido.
Causa provávelEssa interrupção será gerada se o programa chamar UnmapViewOfFile com um parâmetro lpBaseAddress que não é idêntico ao valor retornado por uma chamada anterior para a função MapViewOfFile ou MapViewOfFileEx. Para depurar essa interrupção: $ kb - para exibir o rastreamento de pilha atual, que está chamando UnmapViewOfFile. O provável culpado é a DLL que chama UnmapViewOfFile.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço do bloco de memória que está sendo desmapeado.
- Parâmetro 2 – Endereço de bloco de memória correto esperado.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: INVALID_UNMAPVIEW_START_ADDRESS
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
exceção inesperada gerada na função de retorno de chamada threadpool.
Causa provávelEssa interrupção será gerada se uma função de retorno de chamada no thread do threadpool estiver gerando uma exceção. Para depurar essa interrupção: $ parameter1 pode ser significativo para o tipo de exceção. Por exemplo, um código de exceção C0000005 significa Violação de Acesso. $ .exr parameter2 - para exibir as informações de exceção. $ .cxr parameter3 seguido de kb - para exibir as informações de contexto de exceção.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Código de exceção
- Parâmetro 2 — Registro de exceção. Use .exr para exibir
- Parâmetro 3 — Registro de contexto. Use .cxr para exibir
- Parâmetro 4 — Não usado
- Camada de teste: memória
- ID da interrupção: THREADPOOL_UNEXPECTED_EXCEPTION
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
código na memória não executável
Causa provávelEssa parada será gerada se o aplicativo estiver tentando executar código de um endereço que não é executável ou é livre. Para depurar a interrupção: $ u parameter2 — para desmontar o código culpado; $ .exr parameter3 — para exibir as informações de exceção $ .cxr parameter4 seguido por kb — para exibir as informações de contexto de exceção e o rastreamento de pilha quando a exceção foi gerada.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Endereço sendo acessado
- Parâmetro 2 — Código realizando acesso inválido
- Parâmetro 3 — Registro de exceção. Use .exr para exibir.
- Parâmetro 4 — Registro de contexto. Use .cxr para exibir.
- Camada de teste: memória
- ID da interrupção: THREADPOOL_UNEXPECTED_EXCEPTION_CODE
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Criando heap executável.
Causa provávelEssa interrupção será gerada se o aplicativo estiver criando um heap executável. Isso pode ser um risco de segurança.
Informações exibidas pelo Application Verifier- Parâmetro 1 — Não usado.
- Parâmetro 2 — Não usado.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: EXECUTABLE_HEAP
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Alocação de memória executável.
Causa provávelEssa interrupção será gerada se o aplicativo estiver alocando memória executável. Isso pode ser um risco de segurança.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Proteção de página especificada pelo chamador.
- Parâmetro 2 — Não usado.
- Parâmetro 3 — Não usado.
- Parâmetro 4 — Não usado.
- Camada de teste: memória
- ID da interrupção: EXECUTABLE_MEMORY
- Código de parada: 600NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Detalhes da interrupção de TLS
Descarregando a DLL que alocou o índice TLS que não foi liberado.
Causa provávelEssa interrupção será gerada se uma DLL que alocou um índice TLS estiver sendo descarregada antes de liberar esse índice TLS. Para depurar essa interrupção: $ du parameter3 - exibir o nome da DLL culpada; $ .reload xxx.dll=parameter4 - recarregar símbolos para a DLL culpada (se necessário). xxx.dll é o nome da DLL exibida na etapa acima; $ u parameter2 - desmonte o código que alocou o TLS. Isso deve apontar para a função que alocou o TLS, mas esqueceu de liberá-lo antes que a DLL fosse descarregada.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Índice TLS
- Parâmetro 2 - Endereço do código que alocou esse índice TLS.
- Parâmetro 3 — Endereço do nome da DLL. Use du para despejar.
- Parâmetro 4 — Endereço básico da DLL.
- Camada de teste: TLS
- ID da interrupção: TLS_LEAK
- Código de parada: 350NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Estrutura TLS do verificador corrompida.
Causa provávelEssa interrupção será gerada se as estruturas internas do verificador usadas para armazenar o estado dos slots TLS para thread estiverem corrompidas. Muito provavelmente isso se deve a alguma corrupção aleatória no processo.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Endereço TEB.
- Parâmetro 2 - Endereço TEB esperado.
- Parâmetro 3 - ID do thread.
- Parâmetro 4 — ID esperado do thread.
- Camada de teste: TLS
- ID da interrupção: CORRUPTED_TLS
- Código de parada: 350NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Usando um índice TLS inválido.
Causa provávelEssa interrupção será gerada se um índice TLS inválido for usado. Na maioria dos casos, é porque o código ainda está usando esse índice quando TlsFree é chamado. Confira um exemplo do thread threadpool. T1: Dll carrega e TlsAlloc T1: Retorno de chamada de fila T1: Ignorado aguardado/retorno de chamada cancelado T1: TlsFree T2: Retorno de chamada executa e chama TlsSetValue T1: Dll descarrega
Informações exibidas pelo Application Verifier- Parâmetro 1 - Índice TLS
- Parâmetro 2 - Não usado.
- Parâmetro 3 - Não usado.
- Parâmetro 4 - Não usado.
- Camada de teste: TLS
- ID da interrupção: INVALID_TLS_INDEX
- Código de parada: 350NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Detalhes da interrupção de threadpool
A prioridade desse thread threadpool foi alterada.
Causa provávelEssa interrupção será gerada se a prioridade do thread for alterada quando ele for retornado ao threadpool.
Informações exibidas pelo Application Verifier- Formato: - threadpool thread (%x) tendo executado O retorno de chamada (%p) tem uma prioridade de thread alterada (%i -> %i)
- Parâmetro 1 - Função de retorno de chamada.
- Parâmetro 2 - Contexto.
- Parâmetro 3 - Rastreamento de pilha de alocação de objetos threadpool, use dps para despejá-lo.
- Parâmetro 4 – Prioridade atual.
- Camada de teste: Threadpool
- ID da interrupção: INCONSISTENT_PRIORITY
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
A afinidade desse thread threadpool foi alterada.
Causa provávelEssa interrupção será gerada se a afinidade do thread for alterada quando ele for retornado ao threadpool.
Informações exibidas pelo Application Verifier- Formato: - threadpool thread (%x) tendo executado O retorno de chamada (%p) tem uma máscara de afinidade de thread alterada (%p -> %p)
- Parâmetro 1 - Função de retorno de chamada.
- Parâmetro 2 - Contexto.
- Parâmetro 3 - Rastreamento de pilha de alocação de objetos threadpool, use dps para despejá-lo.
- Parâmetro 4 – Afinidade atual.
- Camada de teste: Threadpool
- ID da interrupção: INCONSISTENT_AFFINITY_MASK
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Mensagem não processada no pool de mensagens do thread atual.
Causa provávelEssa interrupção será gerada se qualquer mensagem deixada como não processada quando esse thread threadpool for retornado ao pool. É perigoso, pois será processado em um contexto totalmente diferente. Use !avrf -tp <Param4> para ver as mensagens postadas neste thread.
Informações exibidas pelo Application Verifier- Formato: - threadpool thread (%x) tendo executado O retorno de chamada (%p) tem mensagem de janela pendente (%x: %x)
- Parâmetro 1 - Função de retorno de chamada.
- Parâmetro 2 - Contexto.
- Parâmetro 3 - Rastreamento de pilha de alocação de objetos threadpool, use dps para despejá-lo.
- Parâmetro 4 - ID do thread threadpool. Use !avrf -tp <threadid> para ver as mensagens postadas neste thread.
- Camada de teste: Threadpool
- ID da interrupção: ORPHANED_THREAD_MESSAGE
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
A janela não fechada pertencia ao thread atual.
Causa provávelEssa interrupção será gerada se qualquer janela for mantida ativa quando esse thread threadpool for retornado ao pool.
Informações exibidas pelo Application Verifier- Formato: - thread threadpool (%x) tendo executado O retorno de chamada (%p) tem hwnd válido (%x: %s) que pode receber mensagens
- Parâmetro 1 - Função de retorno de chamada.
- Parâmetro 2 - Contexto.
- Parâmetro 3 - Rastreamento de pilha de alocação de objetos threadpool, use dps para despejá-lo.
- Parâmetro 4 — ID do thread threadpool.
- Camada de teste: Threadpool
- ID da interrupção: ORPHANED_THREAD_WINDOW
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
ExitThread() em um thread threadpool.
Causa provávelEssa interrupção será gerada se ExitThread for chamado em um thread threadpool. É proibido, pois tornará o sistema instável. Ela causará vazamento de recursos, congelamento ou AV.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Função de retorno de chamada.
- Parâmetro 2 - Contexto.
- Parâmetro 3 - Rastreamento de pilha de alocação de objetos threadpool, use dps para despejá-lo.
- Parâmetro 4 - Não usado.
- Camada de teste: Threadpool
- ID da interrupção: ILLEGAL_THREAD_EXIT
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
O thread está no estado de representação quando é retornado a um thread threadpool.
Causa provávelEssa interrupção será gerada se a função de retorno de chamada alterar o token de thread para representar outro usuário e esquecer de redefini-lo antes de retorná-lo de volta ao threadpool.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Função de retorno de chamada.
- Parâmetro 2 - Contexto.
- Parâmetro 3 - Rastreamento de pilha de alocação de objetos threadpool, use dps para despejá-lo.
- Parâmetro 4 - Não usado.
- Camada de teste: Threadpool
- ID da interrupção: THREAD_IN_IMPERSONATION
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Uma função que requer thread persistente é chamada.
Causa provávelAlgumas APIs do Microsoft Windows precisam ser chamadas dentro de um thread dedicado ou persistente. No threadpool, você geralmente deve evitar usar o armazenamento local de thread e enfileirar chamadas assíncronas que exigem um thread persistente, como a função RegNotifyChangeKeyValue. No entanto, essas funções podem ser enfileiradas para um thread de trabalho persistente usando QueueUserWorkItem com a opção WT_EXECUTEINPERSISTENTTHREAD. Um kb no depurador revelará o chamador.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Função de retorno de chamada.
- Parâmetro 2 - Contexto.
- Parâmetro 3 - Rastreamento de pilha de alocação de objetos threadpool, use dps para despejá-lo.
- Parâmetro 4 - Não usado.
- Camada de teste: Threadpool
- ID da interrupção: PERSISTED_THREAD_NEEDED
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
O thread está no estado de transação sujo.
Causa provávelEssa interrupção será gerada se a função de retorno de chamada esquecer de fechar ou redefinir o identificador de transação atual.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Função de retorno de chamada.
- Parâmetro 2 - Contexto.
- Parâmetro 3 - Rastreamento de pilha de alocação de objetos threadpool, use dps para despejá-lo.
- Parâmetro 4 - Identificador de transação.
- Camada de teste: Threadpool
- ID da interrupção: DIRTY_TRANSACTION_CONTEXT
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Esse estado de threadpool tem chamadas CoInit e CoUnInit desbalanceadas.
Causa provávelEssa interrupção será gerada se a função de retorno de chamada chamar CoInit e CoUnInit desbalanceado.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Função de retorno de chamada.
- Parâmetro 2 - Contexto.
- Parâmetro 3 - Rastreamento de pilha de alocação de objetos threadpool, use dps para despejá-lo.
- Parâmetro 4 – Contagem de chamadas balanceadas.
- Camada de teste: Threadpool
- ID da interrupção: DIRTY_COM_STATE
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Os parâmetros do objeto timer são inconsistentes. O período deve ser 0 quando WT_EXECUTEONLYONCE é especificado ao criar o temporizador
Causa provávelEssa interrupção será gerada se o período para sinalizar o temporizador não for zero quando o temporizador estiver configurado para sinalizar apenas uma vez com o sinalizador WT_EXECUTEONLYONCE
Informações exibidas pelo Application Verifier- Parâmetro 1 - Período especificado.
- Parâmetro 2 - Sinalizadores especificados.
- Parâmetro 3 - Não usado.
- Parâmetro 4 - Não usado.
- Camada de teste: Threadpool
- ID da interrupção: INCONSISTENT_TIMER_PARAMS
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
O bloqueio do carregador foi mantido pelo thread threadpool dentro do retorno de chamada.
Causa provávelEssa interrupção será gerada se o bloqueio do carregador for mantido dentro do retorno de chamada e não for liberado quando o thread for retornado ao threadpool.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Função de retorno de chamada.
- Parâmetro 2 - Contexto.
- Parâmetro 3 - Rastreamento de pilha de alocação de objetos threadpool, use dps para despejá-lo.
- Parâmetro 4 - Não usado.
- Camada de teste: Threadpool
- ID da interrupção: LOADER_LOCK_HELD
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
O idioma preferencial é definido pelo thread threadpool dentro do retorno de chamada.
Causa provávelEssa interrupção será gerada se o idioma preferencial estiver definido no retorno de chamada e não for limpo quando o thread for retornado ao threadpool.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Função de retorno de chamada.
- Parâmetro 2 - Contexto.
- Parâmetro 3 - Rastreamento de pilha de alocação de objetos threadpool, use dps para despejá-lo.
- Parâmetro 4 - Não usado.
- Camada de teste: Threadpool
- ID da interrupção: PREFERRED_LANGUAGES_SET
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
A prioridade em segundo plano é definida pelo thread threadpool dentro do retorno de chamada.
Causa provávelEssa interrupção será gerada se a prioridade em segundo plano estiver definida no retorno de chamada e não for desabilitada quando o thread for retornado ao threadpool.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Função de retorno de chamada.
- Parâmetro 2 - Contexto.
- Parâmetro 3 - Rastreamento de pilha de alocação de objetos threadpool, use dps para despejá-lo.
- Parâmetro 4 - Não usado.
- Camada de teste: Threadpool
- ID da interrupção: BACKGROUND_PRIORITY_SET
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
TerminateThread() em um thread threadpool.
Causa provávelEssa interrupção será gerada se TerminateThread for chamado em um thread threadpool. É proibido, pois tornará o sistema instável. Ela causará vazamento de recursos, congelamento ou AV.
Informações exibidas pelo Application Verifier- Parâmetro 1 - Não usado.
- Parâmetro 2 - Não usado.
- Parâmetro 3 - Não usado.
- Parâmetro 4 - Não usado.
- Camada de teste: Threadpool
- ID da interrupção: ILLEGAL_THREAD_TERMINATION
- Código de parada: 700NAN
- Severidade: Erro
- Erro único:
- Relatório de erro: Interrupção
- Registrar no arquivo: sim
- Criar backtrace: sim
Confira também
Application Verifier - Códigos de parada e definições
Application Verifier — Visão geral
Application Verifier - Recursos
Application Verifier - Testando aplicativos
Application Verifier - Testes dentro do Application Verifier
Application Verifier -Depurando paradas do Application Verifier