كيفية استكشاف أخطاء .NET 2.0 خطأ الإبلاغ عن الرسائل في سجل الحدث؟
-
03-07-2019 - |
سؤال
أنا أعمل على منتج مفتوح المصدر يسمى إيفمون مكتوبة في C# التي تستهدف منصة .NET 2.0 ، لدي مستخدم واحد يعاني من تحطم غريب .NET لم نتمكن من حله.
Event Type: Error Event Source: .NET Runtime 2.0 Error Reporting Event Category: None Event ID: 5000 Date: 4/29/2009 Time: 10:58:10 PM User: N/A Computer: removed this Description: EventType clr20r3, P1 evemon.exe, P2 1.2.7.1301, P3 49ea37c8, P4 system.windows.forms, P5 2.0.0.0, P6 4889dee7, P7 6cd3, P8 18, P9 system.argumentexception, P10 NIL. Data: //hex representation of the above Description
يتعطل التطبيق نفسه دون عرض خطأ (على الرغم من وجود خطأ في التعامل مع واجهة المستخدم) ، تم نسخ الرسائل المذكورة أعلاه من سجل أحداث Windows. قام المستخدم النهائي بإعادة تثبيت .NET وتم تحديثه إلى أحدث الإصدارات. يتم توزيع ملفات .pdb مع كل إصدار إصدار من البرنامج للمساعدة في تصحيح الأخطاء والاختبار ، فإن المستخدم الذي يعاني من المشكلة المعنية لديه مكمل كامل لملفات PDB للإصدار الصحيح من Evemon.
هل هناك تقنية محددة ومجربة ومختبرة لتحليل وتشخيص هذا النوع من التعطل؟ وإذا كان الأمر كذلك فما هي الأدوات والتقنيات المتاحة للمساعدة في تصحيح الأخطاء؟
شكر خاص
أود أن أقدم شكرًا خاصًا لستيفن أوبل وأسلط الضوء على ذلك إجابته على الرغم من عدم الإجابة مباشرة على السؤال الذي كنت أطرحه ، تناولت المشكلة الأكبر في قاعدة الكود الخاصة بي بأن معالجة الأخطاء العالمية تفتقد مكونًا مهمًا.
المحلول
هذه هي الطريقة التي سأواجه بها مشكلة مستخدم نهائي مع تحطم.
قم بتنزيل وتثبيت أدوات تصحيح الأخطاء لنظام التشغيل Windows على http://www.microsoft.com/whdc/devtools/debugging/default.mspx
بمجرد تثبيت الأدوات (ينتهي الأمر بالانتقال إلى C: Program Files افتراضيًا) ، قم بتشغيل نافذة سطر الأوامر.
قم بتغيير إلى الدليل الذي يحتوي على AdPlus (على سبيل المثال "C: Program Files Debugging Tools for Windows (x86)").
تشغيل الأمر follwing. سيؤدي هذا إلى بدء التطبيق وإرفاق AdPlus.
adplus -crash -o C:\debug\ -FullOnFirst -sc C:\path\to\your\app.exe
بعد إنشاء تفريغ الحادث
بمجرد بدء تشغيل التطبيق WindBG وتحميل ملف .dmp الذي يتم إنشاؤه في C: Debug. (ملف -> فتح تفريغ تحطم)
قم بتنفيذ هذه الأوامر لرؤية تتبع المكدس ونأمل أن نجد المشكلة.
لتحميل SOS لتصحيح الأخطاء
- قبل .NET 4.0
.loadby sos mscorwks
- .NET 4.0
.loadby sos clr
لرؤية تتبع المكدس
!clrstack
لرؤية تتبع مكدس أكثر فائدة
!clrstack –p
الكزة داخل كائن .. ربما ترى ما الذي تسبب في الاستثناء
!do <address>
على سبيل المثال ، هذه هي النتيجة من تطبيق تعرض بشكل عشوائي مع استثناء IO. أشار Windbg إلى المسار الذي تم الرجوع إليه والذي كان غير صحيح.
0:009> !do 017f2b7c
Name: System.String
MethodTable: 790fd8c4
EEClass: 790fd824
Size: 124(0x7c) bytes
(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: \\server\path\not_here.txt
Fields:
MT Field Offset Type VT Attr Value Name
79102290 4000096 4 System.Int32 1 instance 54 m_arrayLength
79102290 4000097 8 System.Int32 1 instance 53 m_stringLength
790ff328 4000098 c System.Char 1 instance 5c m_firstChar
790fd8c4 4000099 10 System.String 0 shared static Empty
>> Domain:Value 00161df8:790d884c <<
7912dd40 400009a 14 System.Char[] 0 shared static WhitespaceChars
>> Domain:Value 00161df8:014113e8 <<
نصائح أخرى
يشير النظر إلى رمز المصدر الخاص بك (الجذع) إلى أن معالجة الاستثناء الخاصة بك غير مكتملة فيما يتعلق بتطبيقات نماذج Windows:
تحتاج إلى التعامل معها على حد سواء استثناءات موضوع غير UI واستثناءات موضوع واجهة المستخدم:
بالنسبة إلى الأول ، تحتاج إلى تنفيذ معالج استثناء غير معقد عبر CLR عبر
AppDomain.CurrentDomain.UnhandledException
, ، وهو في مكانه بالفعل.بالنسبة لهذا الأخير ، تحتاج إلى تنفيذ معالج استثناء غير معالج بنظام Windows عبر
Application.ThreadException
, الذي يبدو أنه مفقود ؛ هذا يمكن أن يسفر بالضبط تلك المشاكل التي تشهدها. للحصول على مثال التنفيذ ، راجع وثائق MSDN من Application.ThreadException حدث.
يرجى ملاحظة أنك الآن تقمع بشكل صريح من استثناءات Windows غير المعقولة عن طريق استثناءات عبر Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException)
, ، ستحتاج إلى تغيير هذا إلى UnhandledExceptionMode.CatchException
لتمكين التوجيه إلى معالجك Application.ThreadException
, ، كما اقترح بشكل صحيح من قبل Jehof بالفعل.
ما هو نظام التشغيل (Windows XP ، Windows Vista ، إلخ) الذي يستخدمه المستخدم؟
إذا حاول Windows Vista تعطيل "ميزة تقارير المشكلات والحلول" (لوحة التحكم-> تقارير وحلول المشكلات-> تغيير الإعدادات-> الإعدادات المتقدمة-> إيقاف تشغيل برامجي ، الإبلاغ عن المشكلات)
أو محاولة ضبط
Application.SetUnhandledExceptionMode( UnhandledExceptionMode.CatchException );
سيؤدي هذا دائمًا إلى توجيه الاستثناءات إلى معالج ThreadException.
باختصار: هناك استثناء غير معقول في التطبيق.
إذا كان لديك إمكانية الوصول إلى الجهاز (من خلال الوصول عن بُعد ، وما إلى ذلك) ، فحاول تثبيت Visual Studio Express وبدء التطبيق. يجب أن تشاهد مربع حوار يوفر الفرصة لتصحيح التطبيق مع مثيل جديد من Visual Studio.
قد يكون هناك شيء يمنع نماذج النوافذ من التهيئة بشكل صحيح. لقد رأيت منشورات المنتدى التي تشير إلى أن مشكلات الخطوط يمكن أن تسبب ذلك - تأكد من تثبيت الخطوط التي يحتاجها التطبيق الذي يحتاجه إلى الافتراضات المعتادة مثل MS Sansserif و Arial و Tahoma والأوقات ومثل هذا.
وفشل ذلك ... حاول التضحية بالدجاج على الكمبيوتر. يعمل سحر في كل مرة!
لقد واجهنا مشكلات مع استثناءات في رمز الخيط. إذا قمت بتفريغ مؤشر ترابط جديد ونسيت التعامل مع استثناء في طريقة مؤشر الترابط ، فإن التطبيق "يتوقف" فقط - لا توجد رسالة خطأ ، لا شيء ، ولكن فقط إدخال في سجل الحدث. حتى ذلك الحين UnhandledExceptionHandler
يتم تشغيل.
ربما شيء من هذا القبيل هو السبب؟
... إذا كنت قادرًا على الاتصال بهذا المستخدم المعاناة ، فإليك
الفكرة: سجل مراحل التسجيل
بدلاً من إجراء اختصار لك program.exe
, قم بإجراء اختصار ل program.bat
, ، والتي سوف
echo "Pre-start" > stage.txt
start program.exe
السطر الأول من Program.cs
لذلك سيكون
File.WriteAllLines("stage.txt", "Program execution started.");
في معالج AppDomain.UnhandledException
سيكون السطر الأول
File.WriteAllLines("stage.txt", "Unhandled exception has been caught.");
تأكد أيضًا من أن المعالج لا يخصص الذاكرة أو الموارد-تخصيصها مسبقًا على البرامج. المعالج فقط يؤدي الكتابة إلى السجل.
تعليقات
من المحتمل جدًا أن stage.txt
(أرسله المستخدم) سيحتوي على "بدء التشغيل". يحدث هذا عندما يتم طرح استثناء في الطرف الثالث .DLL - حتى قبل بدء البرنامج.
في هذه الحالة ، ستحتاج إلى برنامج مدقق بسيط ، والذي لن يشير إلى التجميعات التي أنت program.exe
لا ، ولكن سوف Assembly.Load(...)
هم.
ملاحظة
stage.txt
يجب وضعها في مكان ما تحت ٪ appdata ٪ ، وليس في ملفات البرنامج.
وجدت حالة مثيرة للاهتمام على الخادم 2003 و مناقشة لطيفة أخرى.
يجب أن تحصل على تتبع مكدس أكثر تفصيلاً عن طريق إرسال .pdb
ملف لهذا الإصدار الخاص للمستخدم (ليتم وضعه بجوار .exe
) وجعلهم يعيد إنتاج الحادث.
يجب أن تتعامل AppDomain.UnhandledException
في الكود.
كان هناك سؤال مماثل طلبت. انظر تلك ذات الصلة أيضا.