releaseHandleFailed MDA

releaseHandleFailedإدارة التصحيح assهوtant (MDA) هو تنشيط هو المطورين بإعلام عند ReleaseHandleأسلوب فئة مشتقة من SafeHandleأو CriticalHandleبإرجاع false.

الأعراض

مورد أو تسرب ذاكرة. إذا كانت ReleaseHandleأسلوب فئة اشتقاق من SafeHandleأو CriticalHandleلكنه فشل، ثم مورد تغليف بواسطة الفئة قد لا يكون تم إصدارها أو تنظيف لأعلى.

السبب

يجب على المستخدمين توفير تطبيق ReleaseHandleالأسلوب في حالة إنشاء الفئات التي ينحدر من SafeHandleأو CriticalHandle؛ ولذلك، تعتبر الحالات خاصة إلى مورد فردية. ومع ذلك، المتطلبات كالتالي:

  • SafeHandle and CriticalHandle types represent wrappers around vital process resources. ستجعل تسرب لذاكرة عملية غير قابل للاستخدام مع مرور الوقت.

  • ReleaseHandleلا يجب أن يفشل الأسلوب إلى القيام بها دالة. بمجرد أن تكتسب العملية مثل مورد، ReleaseHandleهو الطريقة الوحيدة لتحرير it. ولذلك، يعني فشل تسرب الموارد.

  • فشل أي هل تحدث أثناء التنفيذ ReleaseHandle، impeding إصدار مورد، هو وجود خطأ في التطبيق ReleaseHandleالأسلوب نفسه. هو مسؤولية مبرمج للتأكد من أن اتفاق هو استيفاء خلال، حتى في حالة تلك التعليمة البرمجية باستدعاء تعليمات برمجية التي كتبها شخص آخر للقيام بوظيفتها.

الدقة

اكتب تعليمات برمجية التي تستخدم في SafeHandle(أوCriticalHandle) معينة raهوed التي يجب مراجعتها إعلام MDA، تبحث عن مكان بوضع الالقيمة الأولية مقبض هو المستخرجة من SafeHandleونسخها في أي مكان آخر. هذا هو السبب المعتاد لحالات الفشل في SafeHandleأو CriticalHandleتطبيقات، لأن استخدام القيمة الأولية مؤشر أطول ثم لم تعقب بواسطة وقت التشغيل. If the raw مؤشر نسخ هو subsequently مغلق, it can cause a later ReleaseHandle يتصل إلى فشل because the يغلق هو attempted تشغيل the same مؤشر, which هو now غير صالح.

There are a رقم of ways في which incorrect مؤشر duplication can occur:

  • بحث عن calls إلى the DangerousGetHandle أسلوب. Calls إلى this أسلوب should be exceedingly rare, و أي that you بحث should be surrounded بواسطة calls إلى the DangerousAddRef و DangerousRelease وظائف. These latter وظائف specify the منطقة of تعليمات برمجية في which the raw مؤشر القيمة may be safely used. Outside this منطقة, أو if the مرجع العدد هو ‏‏مطلقاً incremented في the أول place, the مؤشر القيمة can be invalidated at أي وقت بواسطة a يتصل إلى Dispose أو Close تشغيل another مؤشر ترابط. Once الجميع uses of DangerousGetHandle have been tracked أسفل, you should follow the مسار the raw مؤشر takes إلى ensure it ليس handed إيقاف إلى some مكوّن that will eventually يتصل CloseHandle أو another منخفض-المستوى أصلي أسلوب that will يطرح المنتج the مؤشر.

  • Ensure that the تعليمات برمجية that هو used إلى يهيّئ the SafeHandle مع a صالح raw مؤشر القيمة owns the مؤشر. إذا قمت بتكوين SafeHandleحول مؤشر الخاص بك تعليمات برمجية لا تمتلك بدون إعداد ownsHandleمعلمة إلى falseفي الدالة الإنشائية الأساسي، ثم كل من SafeHandleويمكنك محاولة مالك المؤشر الحقيقي لإغلاق المعالج، إلى وجود خطأ في ReleaseHandleإذا SafeHandleتفقد السباق.

  • عند SafeHandleهو تنظيم بين مجالات تطبيق، تأكد SafeHandleاشتقاق المستخدمة h كـ تم وضع علامة كـ قابل للتسلسل. في بعض الحالات النادرة الموقع اشتقاق فئة من SafeHandleقد تم إجراء قابل للتسلسل، يجب بتطبيق ISerializableالواجهة أو استخدام واحد الأساليب الأخرى للتحكم في إنشاء تسلسل و deserialization العملية يدوياً. Th هو هو المطلوبة لأن الإجراء الافتراضي إنشاء تسلسل هو لإنشاء نسخة bitwهوe وذلك لقيمة مؤشر raw المغلقة، مما يؤدي إلى بين SafeHandleمثيلات تفكر في تملك نفس المؤشر. سيحاول كل من إلى استدعاء ReleaseHandleتشغيل نفس المؤشر في بعض يؤشر. ثانية SafeHandleللقيام بهذا الفشل إلى. الدورة التدريبية الصحيح للإجراء عند تسلسل SafeHandleهو إلى الاتصال DuplicateHandleدالة أو دالة مشابهة للأصلية الخاصة بك معالجة نوع إلى إجراء نسخ مميزة مؤشر القانونية. إذا كان مؤشر لا يدعم نوع هذا ثم SafeHandleيتعذر إجراء التفاف من نوع قابل للتسلسل.

  • من الممكن مقطع صوتي الموقع مؤشر هو مغلق مبكرا، إلى فشل عند ReleaseHandleأسلوب هو وأخيراً، والمسمى بوضع نقطة إيقاف مصحح أخطاء في روتين الأصلية المستخدمة لتحرير المقبض، تشغيل سبيل المثال، CloseHandleدالة. قد لا يكون هذا لسيناريوهات الضغط حتى متوسطة الاختبارات الوظيفية سبب إلى إجراءات روتينية مثل غالباً بالتعامل مع حركة المرور المكثف. فربما يساعدك إلى الأداة التعليمة البرمجية استدعاء الأسلوب الإصدار الأصلي، في ترتيب إلى التقاط هوية المتصل، أو من الممكن أن تكون عملية تتبع بنية تخزين العناصر بكامل، وقيمة المؤشر التي يتم إصدارها. يمكن مقارنة القيمة المؤشر بالالقيمة التي تم إرسالها بواسطة MDA هذا.

  • ملاحظة أن مع بعض أنواع المؤشر الأصلي، مثل الجميع Win32 الذي يمكن أن يتم إصدار عبر CloseHandleيعمل، قم بمشاركة نفس مؤشر مساحة الاسم. خاطئة يطرح المنتج مؤشر واحد يمكن أن يؤدي نوع مشاكل أخرى. على سبيل المثال، قد يؤدي فجأة مغلق معالج حدث Win32 مرتين إلى مؤشر ملف غير مرتبطة بتلك إغلاقه قبل الأوان. Th هو يحدث عندما المقبض هو إصدارها وقيمة المؤشر يصبح متوفراً للاستخدام لتعقب مورد آخر، من المحتمل أن يكون من نوع آخر. إذا كان ترتيب هو يحدث و هو متبوعاً إصدار ثاني خاطئة، معالج على مؤشر ترابط غير المرتبطة قد تكون إبطال.

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

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

الإخراج

A رسالة indicating that a SafeHandle أو a CriticalHandle فشل إلى properly يطرح المنتج the مؤشر. فعلى سبيل المثال:

"A SafeHandle or CriticalHandle of type 'MyBrokenSafeHandle' 
failed to properly release the handle with value 0x0000BEEF. This 
usually indicates that the handle was released incorrectly via 
another means (such as extracting the handle using DangerousGetHandle 
and closing it directly or building another SafeHandle around it."

التكوين

<mdaConfig>
  <assistants>
    <releaseHandleFailed/>
  </assistants>
</mdaConfig>

مثال

The following هو a تعليمات برمجية مثال that can تنشيط the releaseHandleFailed MDA.

bool ReleaseHandle()
{
    // Calling the Win32 CloseHandle function to release the 
    // native handle wrapped by this SafeHandle. This method returns 
    // false on failure, but should only fail if the input is invalid 
    // (which should not happen here). The method specifically must not 
    // fail simply because of lack of resources or other transient 
    // failures beyond the user’s control. That would make it unacceptable 
    // to call CloseHandle as part of the implementation of this method.
    return CloseHandle(handle);
}

راجع أيضًا:

المرجع

MarshalAsAttribute

المبادئ

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

تنظيم إمكانية التشغيل المتداخل

موارد أخرى

إمكانية التشغيل المتداخل