Partilhar via


reentrância MDA

The reentrancy Assistente de depuração gerenciada (MDA) é ativado quando é feita uma tentativa para fazer a transição de nativo para código gerenciado em casos onde um comutador antes do código gerenciado para nativo não foi executado por meio de uma transição ordenada.

Sintomas

O heap de objeto está corrompido ou outros erros graves ocorrem quando é feita a transição de nativo para código gerenciado.

Segmentos que comutador entre códigos nativo e gerenciado em qualquer direção devem realizar uma transição ordenada.No entanto, determinados pontos de extensibilidade de nível inferior no sistema operacional, sistema autônomo o manipulador de exceção em vetor, que alterna do gerenciado para código nativo sem executar uma transição ordenada.Esses switches são sob controle do sistema operacional, em vez de sob controle de tempo de execução (CLR) de linguagem comum.Qualquer código nativo é executado dentro desses pontos de extensibilidade deve evitar chamar de volta em código gerenciado.

Causa

Um ponto de extensibilidade de sistema operacional de nível inferior, sistema autônomo o manipulador de exceção em vetor, tenha ativado durante a execução de código gerenciado.O código do aplicativo que é chamado através desse ponto de extensibilidade é a tentativa de retorno de telefonar no código gerenciado.

Sempre esse problema é causado pelo código do aplicativo.

Resolução

Examine o rastreamento da pilha para o segmento que ativou este MDA.O thread está tentando ilegalmente telefonar código gerenciado.O rastreamento de pilha deve revelar o código do aplicativo usando este ponto de extensibilidade, o código do sistema operacional que fornece esse ponto de extensibilidade e o código gerenciado que foi interrompido pelo ponto de extensibilidade.

Por exemplo, você verá o MDA ativado em uma tentativa de chamar código gerenciado de dentro de um manipulador de exceção em vetor.Na pilha você verá o algum código gerenciado acionar uma exceção, sistema autônomo um e código de manipulação de exceções do sistema operacionalDivideByZeroException ou um AccessViolationException.

Neste exemplo, a resolução correta é implementar o manipulador de exceção em vetor completamente em código não gerenciado.

Efeito sobre o tempo de execução

Este MDA não tem efeito sobre o CLR.

Saída

O MDA relata que está sendo tentada reentrância ilegal.Examine a pilha do thread para determinar por que isso está acontecendo e como corrigir o problema.A seguir é exemplo de saída.

Additional Information: Attempting to call into managed code without 
transitioning out first.  Do not attempt to run managed code inside 
low-level native extensibility points. Managed Debugging Assistant 
'Reentrancy' has detected a problem in 'D:\ConsoleApplication1\
ConsoleApplication1\bin\Debug\ConsoleApplication1.vshost.exe'.

Configuração

<mdaConfig>
  <assistants>
    <reentrancy />
  </assistants>
</mdaConfig>

Exemplo

O exemplo de código a seguir faz com que um AccessViolationException para ser lançada. Em versões do Windows que oferecem suporte a manipulação de exceção em vetor, isso fará com que o manipulador de exceção em vetor gerenciado a ser chamado.Se o reentrancy MDA estiver ativado, o MDA será ativado durante a tentativa telefonar para MyHandler de suporte ao código de manipulação de exceção em vetor do sistema operacional.

using System;
public delegate int ExceptionHandler(IntPtr ptrExceptionInfo);

public class Reenter 
{
    public static ExceptionHandler keepAlive;

    [System.Runtime.InteropServices.DllImport("kernel32", ExactSpelling=true, 
        CharSet=System.Runtime.InteropServices.CharSet.Auto)]
    public static extern IntPtr AddVectoredExceptionHandler(int bFirst, 
        ExceptionHandler handler);

    static int MyHandler(IntPtr ptrExceptionInfo) 
    {
        // EXCEPTION_CONTINUE_SEARCH
        return 0;
    }
    void Run() {}

    static void Main() 
    {
        keepAlive = new ExceptionHandler(Reenter.MyHandler);
        IntPtr ret = AddVectoredExceptionHandler(1, keepAlive);
        try 
        {
            // Dispatch on null should AV.
            Reenter r = null; 
            r.Run();
        } 
        catch { }
    }
}

Consulte também

Conceitos

Diagnosticar erros com assistentes de depuração gerenciadas