Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 |
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 |
Exceção de etapa única |
Interromper |
bpe |
Exceção de ponto de interrupção |
Interromper |
cce |
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. |