Partilhar via


Controlando exceções e eventos

Você pode capturar e lidar com exceções em aplicativos de modo de usuário e modo kernel por uma variedade de métodos. Um depurador ativo, um depurador postmortem ou uma rotina interna de tratamento de erros são maneiras comuns de lidar com exceções.

Para obter mais informações sobre a ordem de precedência desses vários manipuladores de exceção, consulte Habilitando a depuração Postmortem.

Quando o sistema operacional Microsoft Windows permite que um depurador manipule uma exceção, o aplicativo que gerou a exceção invade o depurador. Ou seja, o aplicativo para e o depurador fica ativo. O depurador pode então lidar com a exceção de alguma forma ou analisar a situação. O depurador pode então encerrar o processo ou deixá-lo retomar a execução.

Se o depurador ignorar a exceção e permitir que o aplicativo continue em execução, o sistema operacional procurará outros manipuladores de exceção como se nenhum depurador estivesse presente. Se a exceção for tratada, o aplicativo continuará em execução. No entanto, se a exceção permanecer sem tratamento, o depurador terá uma segunda oportunidade para lidar com a situação.

Usando o depurador para analisar uma exceção

Quando uma exceção ou evento invade o depurador, você pode usá-lo para examinar o código que está sendo executado e a memória que o aplicativo está usando. Ao alterar certas quantidades ou saltar para um ponto diferente no aplicativo, você poderá remover a causa da exceção.

Você pode retomar a execução emitindo um comando gh (Avançar com Exceção Tratada) ou gn (Avançar com Exceção Não Tratada).

Se você emitir o comando gn na segunda oportunidade do depurador para lidar com a exceção, o aplicativo será encerrado.

Kernel-Mode Exceções

As exceções que ocorrem no código do modo kernel são mais sérias do que as exceções do modo de usuário. Se as exceções do modo kernel não forem tratadas, é emitida uma falha de verificação e o sistema é interrompido.

Tal como acontece com as exceções de modo de utilizador, se um depurador em modo kernel estiver ligado ao sistema, o depurador é notificado antes de o ecrã de verificação de erros aparecer (também conhecido como ecrã azul ). Se não estiver nenhum depurador ligado, o ecrã de erro será exibido. Nesse caso, o sistema operativo pode criar um ficheiro de registo de erro .

Controlando exceções e eventos do depurador

Você pode configurar o depurador para reagir a exceções e eventos especificados de uma maneira específica.

O depurador pode definir o status de quebra para cada exceção ou evento:

  • O evento pode causar uma quebra no depurador assim que ocorrer (a "primeira chance").

  • O evento pode intervir após outros manipuladores de erros terem tido a oportunidade de responder (a "segunda chance").

  • O evento também pode enviar uma mensagem ao depurador, mas continuar executando.

  • O depurador pode ignorar o evento.

O depurador também pode definir o status de tratamento para cada exceção e evento. O depurador pode tratar o evento como uma exceção manipulada ou uma exceção não tratada. (É claro que eventos que não são realmente erros não exigem qualquer manipulação.)

Pode controlar o estado da pausa e o estado de manipulação realizando uma das seguintes ações:

  • Use o comando SXE, comando SXD, comando SXNou comando SXI na janela de comandos do depurador .

  • (CDB e NTSD) Use a opção -x, -xe, -xd, -xnou -xi na linha de comando .

  • (CDB, NTSD e KD) Use o sxe ou a palavra-chave sxd no arquivo Tools.ini.

  • (Apenas WinDBG) Selecione Filtros de Eventos no menu Depurar para abrir a caixa de diálogo Filtros de Eventos e escolha as opções desejadas.

O comando SX\*, a opção de linha de comando -x\* e a palavra-chave sx\* Tools.ini normalmente definem o status de quebra do evento especificado. Você pode adicionar a opção -h para fazer com que o status de manipulação seja definido.

Há quatro códigos de evento especiais (cc, hc, bpece ssec) que sempre especificam o status de manipulação em vez do status de quebra.

Você pode exibir a exceção ou evento mais recente usando o comando .lastevent (Exibir último evento).

Controlando o estado do intervalo

Ao definir o status de quebra de uma exceção ou evento, você pode usar as seguintes opções.

Comando Nome do status Descrição

SXE ou -xe

Intervalo

(Ativado)

Quando essa exceção ocorre, o destino imediatamente entra no depurador. Esta interrupção ocorre antes que qualquer outro manipulador de erro seja ativado. Este método é chamado manipulação de primeira chance.

SXD ou -xd

Intervalo da segunda oportunidade

(Deficientes)

O depurador não entra para esse tipo de exceção de primeira chance (embora uma mensagem seja exibida). Se outros manipuladores de erro não puderem abordar esta exceção, a execução será interrompida e o alvo entrará no depurador. Este método é designado tratamento de segunda oportunidade.

SXN ou -xn

Output

(Notificar)

Quando essa exceção ocorre, a aplicação alvo não entra no depurador. No entanto, é exibida uma mensagem informando o usuário sobre essa exceção.

SXI ou -xi

Ignorar

Quando essa exceção ocorre, o aplicativo de destino não invade o depurador e nenhuma mensagem é exibida.

Se uma exceção não for prevista por uma configuração SX*, o aplicativo de destino será invadido pelo depurador na segunda chance. O status padrão para eventos está listado na seção "Definições e padrões de eventos" deste tópico.

Para definir o status de quebra usando a interface gráfica do WinDbg, Filtros de Eventos no menu Depurar, selecione o evento desejado na lista na caixa de diálogo Filtros de Eventos e selecione Habilitado, Desabilitado, Saídaou Ignorar.

Controlando o status de processamento

Todos os eventos são considerados não tratados, a não ser que se use o comando gh (Go with Exception Handled).

Todas as exceções são consideradas sem tratamento, a menos que você use o comando sx\* juntamente com a opção -h.

Além disso, as opções SX* podem configurar o estado de manipulação para identificadores inválidos, instruções de interrupção STATUS_BREAKPOINT e exceções de passo único. (Esta configuração é separada da configuração de interrupção.) Quando você configura seu status de interrupção, esses eventos são nomeados ch, bpee sse, respectivamente. Quando você configura seu status de manipulação, esses eventos são nomeados hc, bpece ssec, respectivamente. (Para obter a lista completa de eventos, consulte a seção "Definições e padrões de eventos" a seguir.)

Você pode configurar o estado de tratamento para o evento CTRL+C (cc), mas não o seu estado de interrupção. Se uma aplicação receber um evento CTRL+C, a aplicação sempre entra no depurador.

Quando se utiliza o comando SX* em cc, hc, bpece eventos de ssec, ou quando se utiliza o comando SX* junto com a opção -h numa exceção, ocorrem as seguintes ações.

Comando Nome do status Descrição

SXE

Lidados

O evento é considerado tratado quando a execução recomeça.

SXD, SXN, SXI

Não Tratado

Considera-se que o evento não foi tratado quando a execução é retomada.

Para definir o estado de processamento usando a interface gráfica do WinDbg, selecione Filtros de Eventos no menu Depuração, escolha o evento desejado na lista da caixa de diálogo Filtros de Eventos e, em seguida, selecione Tratado ou Não Tratado.

Comandos automáticos

O depurador também permite que você defina comandos que são executados automaticamente se o evento ou exceção causar uma quebra no depurador. Você pode definir um comando para a interrupção de primeira oportunidade e um comando para a interrupção de segunda oportunidade. Você pode definir essas cadeias de caracteres com o comando SX\* ou o Debug | Filtro de Eventos comando. Cada cadeia de caracteres de comando pode conter vários comandos separados por ponto-e-vírgula.

Esses comandos são executados independentemente do status de interrupção. Ou seja, se o status de quebra for "Ignorar", o comando ainda será executado. Se o estado de interrupção for "Interrupção de segunda oportunidade", o comando de primeira oportunidade será executado logo que a exceção ocorrer pela primeira vez, antes de qualquer outro manipulador de exceção intervir. A cadeia de caracteres de comando pode terminar com um comando de execução como g (Vai), gh (Vai com Exceção Tratada)ou gn (Vai com Exceção Não Tratada).

Definições de eventos e predefinições

Você pode modificar o estado de interrupção ou o estado de manipulação das seguintes exceções. O status padrão de intervalo é indicado.

O status de manipulação padrão das exceções a seguir é sempre "Não manipulado". Tenha cuidado ao alterar esse status. Se você alterar esse status para "Manipulado", todas as exceções de primeira e segunda chance desse tipo serão consideradas manipuladas, e essa configuração ignorará todas as rotinas de tratamento de exceções.

Código do evento Significado Status de quebra padrão

asrt

Falha na asserção

Intervalo

av

Violação de acesso

Intervalo

DM

Dados desalinhados

Intervalo

dz

Divisão inteira por zero

Intervalo

C000008E

Divisão de ponto flutuante por zero

Intervalo

eh

Exceção EH em C++

Pausa para uma segunda oportunidade

GP

Violação da página de guarda

Intervalo

ii

Instrução ilegal

Pausa para uma segunda oportunidade

iov

Estouro de número inteiro

Intervalo

ip

Erro de E/S na página

Intervalo

isc

Chamada de sistema inválida

Intervalo

lsq

Sequência de bloqueio inválida

Intervalo

sbo

Estouro de buffer de pilha

Intervalo

sov

Estouro de pilha

Intervalo

wkd

Depurador de despertar

Intervalo

aph

Congelamento da aplicação

Essa exceção é acionada se o sistema operacional Windows concluir que um processo parou de responder (ou seja, está suspenso).

Intervalo

3c

Terminação do pedido de criança

Pausa para uma segunda oportunidade

ch
HC

Identificador inválido

Intervalo

Número

Qualquer exceção numerada

Pausa para uma segunda oportunidade

Observação Você pode substituir o status asrt break para um endereço específico usando o comandoah (Assertion Handling). Os códigos de evento ch e hc referem-se à mesma exceção. Quando estiver a controlar o seu estado de interrupção, use sx* ch. Quando estiver a controlar o seu estado de processamento, use sx* hc.

Você pode modificar o estado de interrupção ou o estado de manipulação das seguintes exceções. O status padrão de intervalo é indicado.

O status de tratamento padrão das exceções a seguir é sempre "Manipulado". Como essas exceções são usadas para se comunicar com o depurador, normalmente você não deve alterar seu status para "Não manipulado". Esse status faz com que outros manipuladores de exceção capturem as exceções se o depurador as ignorar.

Uma aplicação pode utilizar DBG_COMMAND_EXCEPTION (dbce) para se comunicar com o depurador. Essa exceção é semelhante a um ponto de interrupção, mas você pode usar o comando SX* para reagir de uma maneira específica quando essa exceção ocorre.

Código do evento Significado Status de quebra padrão

DBCE

Exceção de comando especial do depurador

Ignorar

vcpp

Exceção especial do Visual C++

Ignorar

wos

Exceção de passo único do WOW64

Intervalo

wob

Exceção de ponto de interrupção de WOW64

Intervalo

SSE
ssec

Exceção em uma única etapa

Intervalo

BPE
BPEC

Exceção de ponto de interrupção

Intervalo

CCE
CC

CTRL+C ou CTRL+BREAK

Essa exceção será acionada se o destino for um aplicativo de console e CTRL+C ou CTRL+BREAK for passado para ele.

Intervalo

Nota As três exceções finais na tabela anterior têm dois códigos de evento diferentes. Ao controlar o estado de interrupção, use sse, bpee cce. Quando estiver a controlar o seu estado de processamento, use ssec, bpece cc.

As exceções a seguir são úteis quando você está depurando código gerenciado.

Código do evento Significado Estado predefinido

clr

Exceção de Ambiente de Execução de Linguagem Comum

Pausa para uma segunda oportunidade

Não tratado

CLRN

Exceção de notificação do Common Language Runtime

Pausa para uma segunda oportunidade

Manuseado

Você pode alterar o status de interrupção dos seguintes eventos. Uma vez que esses eventos não são exceções, o seu estado de processamento é irrelevante.

Código do evento Significado Status de quebra padrão

ser

Erro do sistema

Ignorar

cpr[:Processo]

Criação de processos

A definição do status de interrupção desse evento aplica-se somente à depuração no modo de usuário. Este evento não ocorre no modo kernel.

Você pode controlar este evento apenas se tiver ativado a depuração de processos filho no CDB ou WinDbg, seja por meio da opção de linha de comando -o ou através do comando .childdbg (Debug Child Processes).

O nome do processo pode incluir uma extensão de nome de arquivo opcional e um asterisco () ou ponto de interrogação (?) como caracteres curinga. O depurador se lembra apenas da configuração de cpr mais recente. Não há suporte para configurações separadas para processos separados. Coloque dois pontos ou um espaço entre cpr e Process.

Se o Processo for omitido, a configuração aplica-se a qualquer criação de processo filho.

Ignorar

epr[: Processo]

Saída do processo

A definição do status de interrupção desse evento aplica-se somente à depuração no modo de usuário. Este evento não ocorre no modo kernel.

Você pode controlar este evento apenas se tiver ativado a depuração de processos filho no CDB ou WinDbg, seja por meio da opção de linha de comando -o ou através do comando .childdbg (Debug Child Processes).

O nome do processo pode incluir uma extensão de nome de arquivo opcional e um asterisco () ou ponto de interrogação (?) como caracteres curinga. O depurador lembra-se apenas da configuração mais recente de epr. Não há suporte para configurações separadas para processos separados. Inclua dois pontos ou um espaço entre epr e Process.

Se de processo for omitida, a configuração se aplicará a qualquer saída de processo filho.

Ignorar

ct

Criação de threads

Ignorar

et

Saída de thread

Ignorar

ld[:Módulo]

Módulo de carga

Se você especificar módulo, a quebra ocorrerá quando o módulo com esse nome for carregado. Módulo pode especificar o nome ou o endereço do módulo. Se o nome for usado, Módulo pode conter uma variedade de caracteres curinga e especificadores. (Para obter mais informações sobre a sintaxe, consulte String Wildcard Syntax.)

O depurador se lembra apenas da configuração ld mais recente. Não há suporte para configurações separadas para módulos separados. Inclua dois pontos ou um espaço entre ld e Módulo.

Se o módulo for omitido, o evento será acionado quando qualquer um dos módulos for carregado.

Realização

ud[:Módulo]

Descarregar módulo

Se especificares o módulo , a interrupção ocorrerá quando o módulo com este nome, ou neste endereço base, for descarregado. Módulo pode especificar o nome ou o endereço do módulo. Se o nome for usado, Módulo pode ser um nome exato ou incluir caracteres curinga. Se Módulo for um nome exato, ele será imediatamente resolvido para um endereço base usando a lista de módulos do depurador atual e será armazenado como um endereço. Se Módulo contiver caracteres curinga, a cadeia de caracteres do padrão será mantida para correspondência posterior quando ocorrerem eventos de descarregamento.

Raramente, o depurador não tem informações de nome para descarregar eventos e correspondências apenas pelo endereço base. Portanto, se o módulo contiver caracteres curinga, o depurador não poderá executar uma correspondência de nome nesse caso de descarregamento específico e interrompe quando qualquer módulo é descarregado.

O depurador lembra apenas a configuração mais recente ud. Não há suporte para configurações separadas para módulos separados. Inclua dois pontos ou um espaço entre ud e Módulo .

Se o módulo for omitido, o evento será acionado quando qualquer um dos módulos for carregado.

Realização

[:Saída]

Saída da aplicação de destino

Se você especificar Output, a quebra ocorrerá somente quando a saída que corresponde ao padrão especificado for recebida. de saída pode conter uma variedade de caracteres curinga e especificadores. (Para obter mais informações sobre a sintaxe, consulte String Wildcard Syntax.) No entanto, Saída não pode conter dois pontos ou espaços. A operação de comparação não diferencia maiúsculas de minúsculas. Inclua dois pontos ou espaço entre saída e saída.

Ignorar

ibp

Ponto de interrupção inicial

(Este evento ocorre no início da sessão de depuração e depois de reiniciar o computador de destino.)

No modo de usuário: Break. Você pode alterar esse status para "Ignorar" usando a opção de linha de comando -g.

No modo kernel: Ignorar. Você pode alterar esse status para "Habilitado" por uma variedade de métodos. Para obter mais informações sobre como alterar esse status, consulte Falhando e reinicializando o computador de destino.

iml

Carga inicial do módulo

(Apenas no modo kernel)

Ignorar. Você pode alterar este estado para "Pausa" por uma variedade de métodos. Para obter mais informações sobre como alterar esse status, consulte Falhando e reinicializando o computador de destino.