reentrancy MDA

reentrancyتنشيط مساعد تصحيح الأخطاء التي تتم إدارتها (MDA) عند إجراء محاولة للانتقال من الأصلي إلى تعليمات برمجية تمت إدارتها في الحالات حيث رمز تبديل سابقة من إدارة إلى تعليمة برمجية أصلية لم يتم تنفيذ من خلال انتقال منظم.

الأعراض

كومة الذاكرة المؤقتة لكائن هو معطوب أو تحدث أخطاء خطيرة غير ذلك عند نقل من الأصلي إلى تعليمات برمجية تمت إدارتها.

مؤشرات الترابط التي تقوم بالتبديل بين الأصلي و تعليمات برمجية مُدارة في أي اتجاه يجب القيام انتقال منظم. ومع ذلك، يشير معينة ذات القابلية للتوسعة في نظام تشغيل، مثل معالج الاستثناء vecإلىred، يسمح التبديل من إدارة للتعليمات البرمجية الأصلية بدون إجراء انتقال منظم. تعتبر رموز التبديل هذه في نظام تشغيل عنصر تحكم، بدلاً من ضمن اللغة العامة (CLR) وقت التشغيل التحكم. يجب تجنب أي تعليمة برمجية أصلية داخل هذه النقاط القابلية للتوسعة لتنفيذ استدعاء مرة أخرى إلى تعليمات برمجية مُدارة.

السبب

قد قام بتنشيط نقطة القابلية للتوسعة ذات المستوى منخفض من نظام تشغيل، مثل معالج الاستثناء vectored، أثناء تنفيذ تعليمات برمجية مُدارة. التعليمات البرمجية للتطبيق الذي هو استدعاء إلى تلك النقطة القابلية للتوسعة هو محاولة إعادة الاتصال في تعليمات برمجية تمت إدارتها.

This problem هو دوماً caused بواسطة تطبيق تعليمات برمجية.

الدقة

Examine the مكدس trace for the مؤشر ترابط that has activated this MDA. مؤشر الترابط يحاول الاتصال بشكل غير قانوني في تعليمات برمجية مُدارة. The مكدس trace should reveal the تطبيق تعليمات برمجية using this التوافق مع البرامج الخارجية يؤشر, the operating النظام تعليمات برمجية that provides this التوافق مع البرامج الخارجية يؤشر, و the مدارة تعليمات برمجية that was interrupted بواسطة the التوافق مع البرامج الخارجية يؤشر.

على سبيل المثال، سترى MDA تنشيطه في محاولة للاتصال المدار تعليمات برمجية من داخل معالج استثناء vectored. ستشاهد على المكدس النظام تشغيل معالجة التعليمات البرمجية وبعض الاستثناء إدارة التعليمات البرمجية تشغيل استثناء مثل على DivideByZeroExceptionأو AccessViolationException.

في ترتيب هو المثال، الدقة الصحيحة هو لتنفيذ معالج ‏‏ استثناء vectored الكامل في تعليمات برمجية غير المدارة.

التأثير تشغيل وقت التشغيل

MDA هذا أي تأثير تشغيل CLR.

الإخراج

تقارير MDA ذلك reentrancy غير قانونية هو محاولات. قم بفحص مكدس لمؤشر الترابط لتحديد سبب th هو هو حدوث وكيفية حل المشكلة. يلي هو نموذج الإخراج.

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

التكوين

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

مثال

يلي تعليمات برمجية مثال يؤدي AccessViolationExceptionأن يتم طرح. في إصدارات Windows التي تعتمد vecإلىred معالجة ‏‏ استثناء، سيؤدي هذا معالج ‏‏ استثناء المدار vecإلىred إلى يمكن استدعاء. إذا reentrancyMDA هو ممكناً، سيتم تنشيط MDA أثناء استدعاء حاولت MyHandlerمن النظام التشغيل vectored ‏‏ استثناء معالجة رمز الدعم.

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

راجع أيضًا:

المبادئ

تشخيص الأخطاء مع المساعدين التصحيح مدارة