Compartilhar via


Controlar exceções e eventos

Você pode capturar e lidar com exceções em aplicativos no modo de usuário e kernel por uma variedade de métodos. Um depurador ativo, um depurador pós-morte 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 de postmortem.

Quando o sistema operacional Microsoft Windows permite que um depurador lide com uma exceção, o aplicativo que gerou a exceção entra no depurador. Ou seja, o aplicativo para e o depurador fica ativo. O depurador pode manipular a exceção de alguma forma ou analisar a situação. Em seguida, o depurador pode 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 não tratada, 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 interrompe a execução no depurador, você pode usar o depurador para examinar o código que está sendo executado e a memória que o aplicativo está usando. Ao alterar determinadas 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 (Go with Exception Handled) ou gn (Go with Exception Not Handled).

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

Exceções de Modo Núcleo

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

Assim como acontece com exceções no modo de usuário, se um depurador no modo kernel estiver anexado ao sistema, o depurador será notificado antes que a tela de verificação de bugs (também conhecida como tela azul) seja exibida. Se nenhum depurador estiver anexado, a tela de verificação de bugs será exibida. Nesse caso, o sistema operacional pode criar um arquivo de despejo de falha.

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 interrupção para cada exceção ou evento:

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

  • O evento pode ser interrompido depois que outros manipuladores de erros tiverem 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 de cada exceção e evento. O depurador pode tratar o evento como uma exceção tratada ou uma exceção não tratada. (Claro, eventos que não são realmente erros não exigem nenhuma manipulação.)

Você pode controlar o status de interrupção e o status de tratamento fazendo um dos seguintes procedimentos:

  • Use o comando SXE, SXD, SXN ou SXI na janela Comando do Depurador.

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

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

  • (Somente WinDbg) Selecione Filtros de Evento 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 Tools.ini sx\* normalmente definem o status de interrupção do evento especificado. Você pode adicionar a opção -h para fazer com que o status de tratamento seja definido.

Há quatro códigos de evento especiais (cc, hc, bpec e ssec) que sempre especificam o status de tratamento em vez de status de interrupção.

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

Controlando o status de interrupção

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

Command Nome do status Description

SXE ou -xe

Break

(Habilitado)

Quando essa exceção ocorre, o destino é imediatamente dividido no depurador. Essa interrupção ocorre antes que outros manipuladores de erros sejam ativados. Esse método é chamado de manipulação de primeira chance.

SXD ou -xd

Pausa de segunda chance

(Desabilitado)

O depurador não entra nesse tipo de exceção de primeira chance (embora uma mensagem seja exibida). Se outros manipuladores de erros não puderem resolver essa exceção, a execução será interrompida e o destino será transferido para o depurador. Esse método é chamado de tratamento de segunda chance.

SXN ou -xn

Saída

(Notificar)

Quando essa exceção ocorre, o aplicativo-alvo não interrompe no depurador. No entanto, uma mensagem é exibida que informa o usuário sobre essa exceção.

SXI ou -xi

Ignorar

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

Se uma exceção não for prevista por uma configuração SX*, o aplicativo de destino será interrompido no depurador na fase de segunda chance. O status padrão para eventos é listado na seção "Definições e Padrões de Eventos" a seguir deste tópico.

Para definir o status de interrupção usando a interface gráfica WinDbg, no menu Depurar selecione Filtros de Eventos, escolha o evento desejado na lista exibida na caixa de diálogo Filtros de Eventos e selecione Habilitado, Desabilitado, Saída ou Ignorar.

Controlando o status de tratamento

Todos os eventos são considerados sem tratamento, a menos que você 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\* junto com a opção -h .

Além disso, as opções SX* podem configurar o estado de tratamento para manipuladores inválidos, instruções de interrupção STATUS_BREAKPOINT e exceções de passo único. (Essa configuração é separada da configuração de interrupção.) Quando você configura o status de interrupção, esses eventos são nomeados ch, bpe e sse, respectivamente. Quando você configura o status de tratamento, esses eventos são nomeados hc, bpec e ssec, respectivamente. (Para obter a listagem completa de eventos, consulte a seguinte seção "Definições de eventos e padrões".)

Você pode configurar o status de manipulação para o evento CTRL+C (cc), mas não seu status de interrupção. Se um aplicativo receber um evento CTRL+C, o aplicativo sempre entrará no depurador.

Quando você usa o comando SX* em eventos cc, hc, bpec e ssec , ou quando você usa o comando SX* junto com a opção -h em uma exceção, as ações a seguir ocorrem.

Command Nome do status Description

SXE

Tratado

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

SXD, SXN, SXI

Não tratado

O evento é considerado como não processado quando a execução é retomada.

Para definir o status de manipulação usando a interface gráfica do WinDbg, selecione Filtros de Evento no menu Depurar , selecione o evento desejado na lista na caixa de diálogo Filtros de Eventos e selecione Manipulado ou Não Manipulado.

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 uma cadeia de caracteres de comando para a quebra de primeira chance e uma cadeia de caracteres de comando para a quebra de segunda chance. Você pode definir essas cadeias de caracteres com o comando SX\* ou Depuração | Filtros de Eventos. Cada cadeia de caracteres de comando pode conter vários comandos separados com ponto e vírgula.

Esses comandos são executados independentemente do status de interrupção. Ou seja, se o status de interrupção for "Ignorar", o comando ainda será executado. Se o status de quebra for "Quebra de segunda chance", o comando de primeira chance será executado assim que a exceção ocorrer pela primeira vez, antes que quaisquer outros manipuladores de exceção sejam envolvidos. A cadeia de caracteres de comando pode terminar com um comando de execução como g (Go), gh (Go with Exception Handled)ou gn (Go with Exception Not Handled).

Definições e padrões de evento

Você pode alterar o status de interrupção ou o status de tratamento das seguintes exceções. O status de interrupção padrão é indicado.

O status de tratamento 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 tratadas e essa configuração ignorará todas as rotinas de tratamento de exceções.

Código de evento Meaning Status de interrupção padrão

asrt

Falha de asserção

Interromper

Av

Violação de acesso

Interromper

decímetro

Dados desalinhados

Interromper

Dz

Divisão de inteiros por zero

Interromper

c000008e

Divisão de ponto flutuante por zero

Interromper

Eh

Exceção EH em C++

Recuperação de segunda chance

Gp

Violação de página de proteção

Interromper

ii

Instrução ilegal

Recuperação de segunda chance

iov

Estouro de número inteiro

Interromper

IP

Erro de E/S na página

Interromper

Isc

Chamada inválida do sistema

Interromper

lsq

Sequência de bloqueio inválida

Interromper

sbo

Estouro de buffer na pilha

Interromper

Sov

Estouro de pilha

Interromper

wkd

Depurador de despertar

Interromper

Aph

Travamento do aplicativo

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

Interromper

3c

Término do aplicativo filho

Recuperação de segunda chance

ch
hc

Identificador inválido

Interromper

Número

Qualquer exceção numerada

Recuperação de segunda chance

Nota Você pode substituir o status de interrupção de asrt de um endereço específico usando o comando ah (Tratamento de Asserção). Os códigos de evento ch e hc referem-se à mesma exceção. Quando você estiver controlando o status de pausa, use sx* ch. Quando você estiver controlando seu status de manipulação, use sx* hc.

Você pode alterar o status de interrupção ou o status de tratamento das seguintes exceções. O status de interrupção padrão é 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, você normalmente não deve alterar seu status para "Não Tratado". Esse status faz com que outros manipuladores de exceção interceptem as exceções caso o depurador opte por ignorá-las.

Um aplicativo pode usar 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 ocorrer.

Código de evento Meaning Status de interrupção padrão

dbce

Exceção de comando especial do depurador

Ignorar

vcpp

Exceção especial do Visual C++

Ignorar

Wos

Exceção de etapa única WOW64

Interromper

wob

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

Interromper

SSE
ssec

Exceção de etapa única

Interromper

bpe
bpec

Exceção de ponto de interrupção

Interromper

cce
Cc

CTRL+C ou CTRL+BREAK

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

Interromper

Nota As três exceções finais na tabela anterior têm dois códigos de evento diferentes. Quando você estiver controlando o status de interrupção, use sse, bpe e cce. Quando você estiver controlando o status de tratamento, use ssec, bpec e cc.

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

Código de evento Meaning Status padrão

Clr

Exceção do Common Language Runtime

Intervalo de segunda chance

Não tratado

clrn

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

Recuperação de segunda chance

Manipulado

Você pode mudar o status de pausa dos eventos a seguir. Como esses eventos não são exceções, seu status de tratamento é irrelevante.

Código de evento Meaning Status de interrupção padrão

ser

Erro do sistema

Ignorar

cpr[:Process]

Criação de processo

Definir o status de interrupção desse evento aplica-se apenas à depuração no modo de usuário. Esse evento não ocorre no modo kernel.

Você só poderá controlar esse evento se tiver ativado a depuração de processos filho no CDB ou no WinDbg, por meio daopção de linha de comando -o ou por meio do comando .childdbg (Depurar Processos Filho).

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 rcp mais recente. Não há suporte para configurações separadas para processos separados. Inclua dois-pontos ou um espaço entre rcp e Processo.

Caso Processo seja omitido, a configuração é aplicada a qualquer criação de processo filho.

Ignorar

epr[:Process]

Saída do processo

Definir o status de interrupção desse evento aplica-se apenas à depuração no modo de usuário. Esse evento não ocorre no modo kernel.

Você só poderá controlar esse evento se tiver ativado a depuração de processos filho no CDB ou no WinDbg, por meio daopção de linha de comando -o ou por meio do comando .childdbg (Depurar Processos Filho).

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 apenas a mais recente configuração 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 o Processo for omitido, a configuração se aplicará a qualquer saída do processo filho.

Ignorar

Ct

Criação de thread

Ignorar

Et

Saída do thread

Ignorar

ld[:Module]

Módulo de carregamento

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

O depurador lembra apenas a 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 Module.

Se Módulo é omitido, o evento é disparado quando qualquer módulo é carregado.

Saída

ud[:Módulo]

Descarregar módulo

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

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

O depurador se lembra apenas da configuração de ud mais recente. Não há suporte para configurações separadas para módulos separados. Inclua dois-pontos (:) ou um espaço entre ud e Module.

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

Saída

out[:Output]

Saída do aplicativo de destino

Se você especificar Saída, a interrupção ocorrerá somente quando a saída que corresponde ao padrão especificado for recebida. A saída pode conter uma variedade de caracteres curinga e especificadores. (Para obter mais informações sobre a sintaxe, consulte A sintaxe curinga da cadeia de caracteres.) No entanto, a saída não pode conter dois-pontos ou espaços. A correspondência 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

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

No modo de usuário: Interromper. 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 Falha e reinicialização do computador de destino.

iml

Carga inicial do módulo

(Modo kernel somente)

Ignorar. Você pode alterar esse status para "Pausa" por diversos métodos. Para obter mais informações sobre como alterar esse status, consulte Falha e reinicialização do computador de destino.