Compartilhar via


Controlando exceções e eventos

Você pode capturar e lidar com exceções no modo de usuário e aplicativos no modo 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 pós-morte.

Quando o sistema operacional Microsoft Windows permite que um depurador manipule uma exceção, o aplicativo que gerou a exceção é dividido no depurador. Ou seja, o aplicativo é interrompido 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 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 se divide 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. Alterando determinadas quantidades ou saltando para um ponto diferente no aplicativo, você pode ser capaz de 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 no modo kernel

Exceções que ocorrem no código do modo kernel são mais graves do que exceções no modo de usuário. Se exceções no modo kernel não forem tratadas, um bug marcar será emitido e o sistema será interrompido.

Assim como acontece com exceções no modo de usuário, se um depurador do modo kernel estiver anexado ao sistema, o depurador será notificado antes que o bug marcar tela (também conhecido como tela azul) seja exibido. Se nenhum depurador estiver anexado, o bug marcar tela será exibido. Nesse caso, o sistema operacional pode criar um arquivo de despejo de memória.

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 ele ocorrer (a "primeira chance").

  • O evento pode ser interrompido depois que outros manipuladores de erro tiverem a oportunidade de responder (a "segunda chance").

  • O evento também pode enviar uma mensagem ao depurador, mas continuar em execução.

  • 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 tratada ou uma exceção sem tratamento. (É claro que eventos que não são realmente erros não exigem nenhuma manipulação.)

Você pode controlar a status de interrupção e lidar com status 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 o 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 Evento e escolha as opções desejadas.

O comando SX\*, a opção de linha de comando -x\* e o Tools.ini palavra-chave sx\* normalmente definem a quebra status 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, bpec e ssec) que sempre especificam a manipulação status em vez de status de interrupção.

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

Controlando o status de interrupção

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

Comando Nome do status Descrição

SXE ou -xe

Break

(Habilitado)

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

SXD ou -xd

Quebra de segunda chance

(Desabilitado)

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

SXN ou -xn

Saída

(Notificar)

Quando essa exceção ocorre, o aplicativo de destino não é dividido 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 é dividido no depurador e nenhuma mensagem é exibida.

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

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

Controlando o status de manipulação

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 status de tratamento para identificadores inválidos, instruções de interrupção STATUS_BREAKPOINT e exceções de etapa única. (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 tratamento status, 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 tratamento para o evento CTRL+C (cc), mas não o 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 usa o comando SX* junto com a opção -h em uma exceção, as ações a seguir ocorrem.

Comando Nome do status Descrição

SXE

Tratado

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

SXD, SXN, SXI

Não tratado

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

Para definir a manipulação status usando a interface gráfica 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 definir comandos 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 a Depuração | Comando Filtros de Eventos . Cada cadeia de caracteres de comando pode conter vários comandos separados por ponto e vírgula.

Esses comandos são executados independentemente da status de interrupção. Ou seja, se a status de interrupção for "Ignorar", o comando ainda será executado. Se a interrupção status for "Interrupção de segunda chance", o comando de primeira chance será executado quando a exceção ocorrer pela primeira vez, antes que outros manipuladores de exceção estejam 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 lidar com status das exceções a seguir. O status de interrupção padrão é indicado.

O tratamento padrão das exceções a seguir status é 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 Significado Status de interrupção padrão

asrt

falha de asserção

Interromper

av

Violação de acesso

Interromper

Dm

Dados desalinhados

Interromper

Dz

Divisão de inteiros por zero

Interromper

c000008e

Divisão de ponto flutuante por zero

Interromper

eh

Exceção de EH do C++

Quebra de segunda chance

Gp

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

Interromper

Ii

Instrução ilegal

Quebra de segunda chance

iov

Estouro de inteiro

Interromper

Ip

Erro de E/S na página

Interromper

Isc

Chamada de sistema inválida

Interromper

lsq

Sequência de bloqueio inválida

Interromper

sbo

Estouro de buffer da pilha

Interromper

Sov

Estouro de pilha

Interromper

wkd

Depurador de ativação

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

Quebra de segunda chance

chhc

Identificador inválido

Interromper

Número

Qualquer exceção numerada

Quebra de segunda chance

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

Você pode alterar o status de interrupção ou lidar com status das exceções a seguir. O status de interrupção padrão é indicado.

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

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 maneira específica quando essa exceção ocorrer.

Código de evento Significado 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 de 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 for passado 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 as status de interrupção, use sse, bpe e cce. Quando você estiver controlando sua manipulação status, 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 Significado Status padrão

clr

Exceção do Common Language Runtime

Quebra de segunda chance

Não manipulado

clrn

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

Quebra de segunda chance

Manipulado

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

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

ser

Erro de sistema

Ignorar

rcp[:Process]

Criação de processo

Definir a status de interrupção desse evento aplica-se somente à depuração do 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.

Se Process for omitido, a configuração se aplicará a qualquer criação de processo filho.

Ignorar

epr[:Process]

Saída do processo

Definir a status de interrupção desse evento aplica-se somente à depuração do 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 configuração de epr mais recente. Não há suporte para configurações separadas para processos separados. Inclua dois-pontos ou um espaço entre epr e Process.

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

Ignorar

ct

Criação de thread

Ignorar

et

Saída de thread

Ignorar

ld[:Module]

Carregar módulo

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 cadeia de caracteres.)

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 Module for omitido, o evento será disparado quando qualquer módulo for carregado.

Saída

ud[:Module]

Descarregar módulo

Se você especificar 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, Module 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 Module 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 tem informações de nome para eventos de descarregamento e corresponde somente pelo endereço base. Portanto, se Module contiver caracteres curinga, o depurador não poderá executar uma correspondência de nome neste caso de descarregamento específico e será interrompido quando qualquer módulo for 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 Module for omitido, o evento será disparado 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 Sintaxe curinga de 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: Quebrar. 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

Carregamento inicial do módulo

(Somente modo kernel)

Ignorar. Você pode alterar esse status para "Quebrar" 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.