Dela via


reentrancy MDA

Kommentar

Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.

Den reentrancy hanterade felsökningsassistenten (MDA) aktiveras när ett försök görs att övergå från intern till hanterad kod i fall där en tidigare växling från hanterad till intern kod inte utfördes genom en ordnad övergång.

Symtom

Objekt-heapen är skadad eller andra allvarliga fel uppstår vid övergång från intern till hanterad kod.

Trådar som växlar mellan intern och hanterad kod i båda riktningarna måste utföra en ordnad övergång. Vissa utökningspunkter på låg nivå i operativsystemet, till exempel den vektorerade undantagshanteraren, tillåter dock växlar från hanterad till intern kod utan att utföra en ordnad övergång. Dessa växlar styrs av operativsystemet i stället för under CLR-kontroll (Common Language Runtime). All intern kod som körs i dessa utökningspunkter måste undvika att anropa tillbaka till hanterad kod.

Orsak

En utökningspunkt för operativsystemet på låg nivå, till exempel den vektorerade undantagshanteraren, har aktiverats vid körning av hanterad kod. Programkoden som anropas via den utökningspunkten försöker anropa tillbaka till hanterad kod.

Det här problemet orsakas alltid av programkod.

Åtgärd

Granska stackspårningen för den tråd som har aktiverat denna MDA. Tråden försöker anropa den hanterade koden olagligt. Stackspårningen bör visa programkoden med hjälp av den här utökningspunkten, operativsystemkoden som tillhandahåller den här utökningspunkten och den hanterade kod som avbröts av utökningspunkten.

Du ser till exempel MDA aktiverad i ett försök att anropa hanterad kod inifrån en vektorerad undantagshanterare. I stacken ser du operativsystemets undantagshanteringskod och viss hanterad kod som utlöser ett undantag, till exempel en DivideByZeroException eller en AccessViolationException.

I det här exemplet är rätt lösning att implementera den vektorerade undantagshanteraren helt i ohanterad kod.

Effekt på körningen

Denna MDA har ingen effekt på CLR.

Output

MDA rapporterar att olaglig återaktivering görs. Granska trådens stack för att avgöra varför detta händer och hur du åtgärdar problemet. Följande är exempelutdata.

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'.

Konfiguration

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

Exempel

Följande kodexempel gör att en AccessViolationException genereras. I versioner av Windows som stöder vektorbaserad undantagshantering kommer den hanterade vektorerade undantagshanteraren att anropas. reentrancy Om MDA är aktiverat aktiveras MDA under anropsförsöket till från operativsystemets stödkod för MyHandler vektorbaserad undantagshantering.

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 { }
    }
}

Se även