Diagnosticar erros com assistentes de depuração gerenciada

Assistentes de depuração gerenciada (MDAs) são depuração que funcionam em conjunto com o common language runtime (CLR) para fornecer informações sobre o estado de tempo de execução. Os assistentes geram mensagens informativas sobre eventos de runtime, caso contrário, você não pode aplicar trapping. Você pode usar os MDAs para isolar os bugs de disco rígido para encontrar aplicativos que ocorrem durante a transição entre código gerenciado e. Você pode habilitar ou desabilitar todos os MDAs, adicionando uma chave no registro do Windows ou definindo uma variável de ambiente. Você pode habilitar MDAs específicos usando as configurações do aplicativo. Você pode definir configurações adicionais para algumas MDAs individuais no arquivo de configuração do aplicativo. Porque esses arquivos de configuração são analisados quando o tempo de execução é carregado, você deve habilitar o MDA antes do início do aplicativo gerenciado. Você não pode ativá-lo para aplicativos que já tenham sido iniciadas.

Observação

Quando um MDA é ativado, está ativa mesmo quando seu código não está sendo executada em um depurador.Se um evento MDA é gerado quando um depurador não está presente, a mensagem de evento é apresentada em uma caixa de diálogo de exceção sem tratamento, embora não seja uma exceção não tratada.Para evitar a caixa de diálogo, remova as configurações de habilitação de MDA quando seu código não está em execução em um ambiente de depuração.

Observação

Quando seu código está em execução no ambiente de desenvolvimento integrado (IDE) do Visual Studio, você pode evitar a caixa de diálogo exception aparece para eventos específicos do MDA.Para isso, no Debug menu, clique em exceções.(Se a Debug menu não contém um exceções de comando, clique em Personalizar na Ferramentas menu para adicioná-lo.) No exceções caixa de diálogo caixa, expanda o Managed Debugging Assistants lista e, em seguida, desmarque o Thrown caixa de seleção para o MDA individual.Por exemplo, para evitar a caixa de diálogo de exceção para um contextSwitchDeadlock MDA Limpar o Thrown caixa de seleção ao lado do nome na Managed Debugging Assistants lista.Você também pode usar essa caixa de diálogo para habilitar os MDAs.

A tabela a seguir lista os MDAs que acompanham o.NET Framework.

asynchronousThreadAbort MDA

bindingFailure MDA

callbackOnCollectedDelegate MDA

contextSwitchDeadlock MDA

dangerousThreadingAPI MDA

dateTimeInvalidLocalFormat MDA

dirtyCastAndCallOnInterface MDA

disconnectedContext MDA

dllMainReturnsFalse MDA

exceptionSwallowedOnCallFromCom MDA

failedQI MDA

fatalExecutionEngineError MDA

gcManagedToUnmanaged MDA

gcUnmanagedToManaged MDA

illegalPrepareConstrainedRegion MDA

invalidApartmentStateChange MDA

invalidCERCall MDA

invalidFunctionPointerInDelegate MDA

invalidGCHandleCookie MDA

invalidIUnknown MDA

invalidMemberDeclaration MDA

invalidOverlappedToPinvoke MDA

invalidVariant MDA

jitCompilationStart MDA

loaderLock MDA

loadFromContext MDA

marshalCleanupError MDA

MDA de empacotamento.

memberInfoCacheCreation MDA

moduloObjectHashcode MDA

nonComVisibleBaseClass MDA

notMarshalable MDA

openGenericCERCall MDA

overlappedFreeError MDA

pInvokeLog MDA

pInvokeStackImbalance MDA

raceOnRCWCleanup MDA

reentrância MDA

releaseHandleFailed MDA

reportAvOnComRelease MDA

streamWriterBufferedDataLost MDA

virtualCERCall MDA

Por padrão, o.NET Framework ativa um subconjunto de MDAs para todos os depuradores gerenciados. Você pode exibir o padrão definido em Visual Studio, clicando em exceções na Debug menu e expandindo a Managed Debugging Assistants lista.

Habilitando e desabilitando MDAs

Você pode ativar e desativar os MDAs, usando uma chave do registro, uma variável de ambiente e definições de configuração do aplicativo. Você deve ativar a chave do registro ou a variável de ambiente para usar as definições de configuração do aplicativo.

No Visual Studio de 2005 e versões posteriores, quando o processo de hospedagem está habilitado, é possível desativar MDAs que estão no conjunto de padrão ou habilitar os MDAs são não no padrão definidos. O processo de hospedagem é ativado por padrão, portanto, deve ser explicitamente desativada.

Para desativar o processo de hospedagem Visual Studio, faça o seguinte:

  1. Em Solution Explorer, selecione um projeto.

  2. No menu Project, clique em Properties..

    O Project Designer janela é exibida.

  3. Clique na guia Debug.

  4. No Ativar depuradores seção, limpar o Ativar o processo de hospedagem do Visual Studio caixa de seleção.

No entanto, desativar o processo de hospedagem pode afetar o desempenho. Você pode evitar a necessidade de desativar os MDAs, impedindo que o Visual Studio exibir a caixa de diálogo MDA sempre que uma notificação de MDA é recebida. Para isso, clique em exceções na Debug menu, expanda o Managed Debugging Assistants listar e em seguida, selecione ou desmarque o Thrown caixa de seleção para o MDA individual.

Habilitando e desabilitando MDAs usando uma chave do registro

Você pode habilitar MDAs, adicionando o HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.Subchave de NETFramework\MDA (tipo REG_SZ, o valor 1) no registro do Windows. Copiar o exemplo a seguir em um arquivo de texto chamado MDAEnable.reg e duas vezes no nome do arquivo no Windows Explorer para ativar os MDAs nesse computador.

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"

Para desativar os MDAs, defina a subchave MDA para 0 (zero) usando o Editor do registro do Windows. Como alternativa, você pode copiar o exemplo a seguir em um arquivo de texto chamado MDADisable.reg e duas vezes no nome do arquivo no Windows Explorer.

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="0"

Por padrão, alguns MDAs são ativadas quando você executar um aplicativo que está anexado a um depurador, mesmo sem adicionar a chave do registro. São exemplos de tais assistentes pInvokeStackImbalance MDA e invalidApartmentStateChange MDA. Você pode desativar esses assistentes executando o arquivo MDADisable.reg, conforme descrito anteriormente nesta seção.

Habilitando e desabilitando MDAs usando uma variável de ambiente

Ativação de MDA também pode ser controlada pela variável de ambiente COMPLUS_MDA, que substitui a chave do registro. A seqüência COMPLUS_MDA é uma lista de maiúsculas e minúsculas, delimitados por ponto-e-vírgula dos nomes MDA ou outras seqüências de caracteres de controle especial. Iniciando em um depurador gerenciado ou permite que um conjunto de MDAs por padrão. Isso é feito, implicitamente, antecedendo lista delimitados por ponto-e-vírgula de MDAs habilitado por padrão em debuggers, o valor da chave de registro ou a variável de ambiente. As seqüências de caracteres de controle especiais são as seguintes:

  • 0-Desativa todos os MDAs.

  • 1-Lê as configurações de MDA do ApplicationName. mda.config.

  • managedDebugger-Explicitamente ativa todos os MDAs implicitamente são ativados quando um executável gerenciado é iniciado em um depurador.

  • unmanagedDebugger-Explicitamente ativa todos os MDAs implicitamente são ativados quando um executável não gerenciado é iniciado em um depurador.

Se houver configurações conflitantes, as configurações mais recentes substituem as configurações anteriores:

  • COMPLUS_MDA=0Desabilita todos os MDAs, inclusive aqueles ativada implicitamente em um depurador.

  • COMPLUS_MDA=gcUnmanagedToManagedpermite que gcUnmanagedToManaged com qualquer MDAs implicitamente, que são ativados em um depurador.

  • COMPLUS_MDA=0;gcUnmanagedToManagedpermite que gcUnmanagedToManaged , mas desativa MDAs, que era contrário implicitamente habilitados em um depurador.

Habilitando e desabilitando MDAs usando as definições de configuração específicas do aplicativo

Ativar, desativar e configurar alguns assistentes individualmente no arquivo de configuração MDA para o aplicativo. Para habilitar o uso de um arquivo de configuração do aplicativo para configurar os MDAs, a chave de registro MDA ou de variável de ambiente COMPLUS_MDA deve ser definido. O arquivo de configuração do aplicativo está normalmente localizado no mesmo diretório do arquivo do executável (. exe) do aplicativo. O nome do arquivo assume a forma ApplicationName. mda.config; Por exemplo, notepad.exe.mda.config. Os assistentes estão ativados no arquivo de configuração do aplicativo podem ter atributos ou elementos especificamente projetados para controlar o comportamento do assistente. O exemplo a seguir mostra como habilitar e configurar o MDA de empacotamento..

<mdaConfig>
  <assistants>
    <marshaling>
      <methodFilter>
        <match name="*"/>
      </methodFilter>
      <fieldFilter>
        <match name="*"/>
      </fieldFilter>
    </marshaling>
  </assistants>
</mdaConfig>

O Marshaling MDA emite informações sobre o tipo gerenciado que está sendo empacotado para um tipo não gerenciado para cada transição para-gerenciado no aplicativo. O Marshaling MDA também pode filtrar os nomes do método e fornecido com campos de estrutura de <methodFilter> e <fieldFilter> elementos filho, respectivamente.

O exemplo a seguir mostra como habilitar vários MDAs usando suas configurações padrão.

<mdaConfig>
  <assistants>
    <illegalPrepareConstrainedRegion />
    <invalidCERCall />
    <openGenericCERCall />
    <virtualCERCall />
  </assistants>
</mdaConfig>
Observação importanteImportante

Quando você especificar mais de um assistente em um arquivo de configuração, você deve listá-las em ordem alfabética.Por exemplo, se você deseja ativar ambos o virtualCERCall e o invalidCERCall MDAs, você deve adicionar o <invalidCERCall /> entrada antes de <virtualCERCall /> entrada.Se as entradas não estiverem em ordem alfabética, uma mensagem de exceção não tratada configuração inválida arquivo é exibida.

Saída MDA

Saída MDA é semelhante ao seguinte exemplo mostra a saída a partir de pInvokeStackImbalance MDA.

A call to PInvoke function 'MDATest!MDATest.Program::StdCall' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

Consulte também

Outros recursos

Depuração, rastreamento e criação de perfil