كيفية تحديد المشكلة عند تعطل البرنامج دون إظهار الخطأ؟

StackOverflow https://stackoverflow.com/questions/798239

  •  18-09-2019
  •  | 
  •  

سؤال

واسمحوا لي أن أعرف الخطوات التي أحتاج إلى اتباعها عند تعطل تطبيقي وتغلق إظهار مربع الحوار الذي يحتوي على أزرار "لا ترسل" و "إرسال تقرير الأخطاء".

ما الذي يمكن أن أفعله بخلاف النظر إلى عارض الأحداث لحل هذا؟

شكرا

هل كانت مفيدة؟

المحلول

  1. يمكنك إضافة try/catch/finally بناء حولك Main() جسم طريقة الدخول.

  2. لل WinForms، يمكنك إضافة ThreadException معالج، فقط قبل التطبيق. رون ()، للقبض على الاستثناءات التي ألقيت في معالجات حدث WinForms UI:

    Application.ThreadException +=
       new ThreadExceptionEventHandler(Application_ThreadException);
    
  3. يمكن اشتعلت جميع الاستثناءات الأخرى غير المعالجة باستخدام:

    AppDomain.CurrentDomain.UnhandledException +=
       new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    

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

  4. يمكن أيضا تكوين Visual Studio ل كسر على استثناءات الفرصة الأولى, ، والموظفين الخارجيين (مثل WINDBG مع ملحقات SOS المدارة) يمكن أن يمسك استثناءات الفرصة الأولى (http://www.codeproject.com/kb/debug/windbg_part1.aspx.).

أيضا، استخدم إطار تسجيل تسجيل مثل log4net لإضافة تسجيل مفيد إلى التطبيق الخاص بك وتفريغ معلومات استثناء قبل إغلاق التطبيق.

نصائح أخرى

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

من الناحية المثالية يجب عليك استخدام مكتبة تسجيل مثل nlog. أو log4net. لتسجيل أي استثناءات غير معلقة، والاستثناءات بشكل عام، عن طريق تسجيلها في التعليمات البرمجية الخاصة بك عند حدوثها.

يمكن أن يساعد أيضا في الحصول على مستويات مختلفة من تسجيل الدخول في طلبك لمساعدتك في تتبع المشكلة عندما لا تعمل على جهاز التطوير الخاص بك. باستخدام NLOG، يمكنك ترك التسجيل في رمز الإنتاج الخاص بك وتمكين / تعطيل إخراج السجل من خلال استخدام ملف تكوين التسجيل.

لم أستخدم log4net، لذلك لا أعرف ما إذا كان لديه ميزة مماثلة.

تميل أخطاء "إرسال / لا ترسل" عندما يكون لديك استثناء غير معالج في مؤشر ترابط الخلفية (سيظهر الخيط الرئيسي مربع الحوار متابعة / إنهاء .NET مع تتبع مكدس).

إضافة معالج استثناء إلى وظيفة مؤشر الترابط الخاص بك وتسجيل الدخول من هناك:

void RunMyThread()
{
    try
    {
        // background thread code
    }
    catch (Exception ex)
    {
        // Log the exception
    }
}

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

استخدم Windbg لتصحيح المشكلة. يمكنك إجراء كسر (كما توقف عند نقطة توقف) عند إلقاء استثناء، ثم قم بفحص كائنات StackTrace ... كائنات في نطاقها ...

إذا حدث ذلك في موقع عميل، ولا يمكن استنساخه بسهولة داخل مصحح الأخطاء، فيمكنك القيام ببعض تصحيح الأخطاء بعد الوفاة. أحب استخدام userdump. لجمع ملف تفريغ الذاكرة (.dmp). ثم استخدم Windbg للتحليل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top