ما هي الإمكانيات المتاحة لتحليل ما بعد الوفاة في .NET (على سبيل المثال؟بعد تعطل البرنامج)؟

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

  •  19-08-2019
  •  | 
  •  

سؤال

لنفترض أن هناك برنامج C#، والذي يستخدم كخدمة ويندوز.لنفترض أن الخدمة أصبحت متوحشة وتستهلك وحدة المعالجة المركزية والذاكرة بجنون.يجب إعادة تشغيله قريبًا جدًا، لأنه نظام إنتاج.لذلك ليس لدي الكثير من الوقت لجمع معلومات وقت التشغيل.ربما نظرة سريعة على مدير المهام ...هذا كل شئ.

بعد ذلك، كل ما لدي هو ملفات سجل log4net وسجل أحداث Windows لتحليل ما بعد الوفاة.

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

هل هناك أيضًا طرق أخرى لإجراء تحليل ما بعد الوفاة؟ربما شيء مثل عمليات تفريغ الخيوط (كما هو الحال في Java) أو عمليات تفريغ الذاكرة أو أي شيء آخر قد يساعد في تحليل ما بعد الوفاة؟ربما يمكن لبعض أدوات .NET Framework المضمنة أن تساعد؟

أنا مهتم جدًا بتجارب المشاريع الحقيقية وكيف ستحاول معالجة مسألة الصيانة هذه، والتي أعتقد أنها حقيقية جدًا بالنسبة لمعظم المبرمجين.

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

المحلول

كما يقول مارك، فإن WinDbg + SoS سيسمح لك بتصحيح الكثير من المشكلات، ولا يمكنك معالجتها حقًا في Visual Studio.هناك بعض الدروس الممتازة هذه المدونة.

بالنسبة لمشكلات الذاكرة، يمكنك أيضًا الاطلاع على عدادات أداء .NET في Perfmon.يمكنك إلقاء نظرة على مكان وجود الكائنات (أي جيل) ومقدار الوقت الذي تقضيه في جمع البيانات المهملة.ينبغي أن يوفر لك بعض المعلومات المفيدة.إذا كنت تريد معرفة سبب عدم جمع الكائنات، فإن WinDbg وSoS هو الحل الأمثل.لإرشادك خلال جلسة بسيطة، الخطوات هي:

  1. فحص الكومة باستخدام !dumpheap -stat, ، ابحث عن عدد كبير من الحالات.من المحتمل أن تكون لديك فكرة عما تتوقع العثور عليه في الكومة في أي لحظة، لذا إذا كان هناك أي شيء يبدو خارجًا عن المألوف، فانظر في ذلك.

  2. اختر مثيلًا عشوائيًا وقم بإجراء !gcroot على عنوان المثيل.سيخبرك ذلك لماذا لم يتم جمع الكائن.

  3. يكرر

المرشحون المحتملون للحفاظ على الأشياء حية لفترة أطول مما ينبغي هم:الأحداث والإحصائيات وقائمة الانتظار النهائية على سبيل المثال لا الحصر.

قد ترغب أيضًا في إلقاء نظرة على إجابتي لـ هذا السؤال لرؤية المزيد من عناصر WinDbg.

نصائح أخرى

ويمكنك القيام تحطم مقالب مع .NET، وننظر إليها مع windbg / استغاثة (وsosassist). ليست بسيطة، لكنها تعمل. لكن المتشددين إلى حد ما. يجب البحث عن "+ windbg +. NET" يثبت مثيرة للاهتمام.

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

ولسوء الحظ لقد كان علي أن أفعل قدر لا بأس به من هذا - أفضل وسيلة جئت عبر هو cordbg الذي يأتي مع SDK (ستحتاج الإصدار الصحيح للنسخة صافي الخاص بك). http://msdn.microsoft.com/en-us/library/a6zb7c8d. ASPX للحصول على مزيد من التفاصيل.

وإرفاق عملية قيد التشغيل في cordbg (أ <[معرف المنتج]>)، ونعلق على كل موضوع تشغيل (ر <[الدار]>) ثم تفريغ كومة لكل موضوع (ث).

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

والشيء الجميل في هذا النهج، وخاصة مع أتمتة مقالب، هو أنه يمكنك انتزاع بسرعة كبيرة على جميع المعلومات والحصول على عملية إعادة الخاص بك في أقصر فترة من الزمن.

وهناك موارد كبيرة لتحليل ما بعد الوفاة مع WinDbg و SOS هو تيس Ferrandez '<لأ href = "http://blogs.msdn.com/tess/pages/net-debugging-demos-information-and-setup- instructions.aspx "يختلط =" نوفولو noreferrer "> سلسلة من مقالات بلوق حول هذا الموضوع.

وتحرير: وصلة تحديث

إذا كانت العملية لا تزال حية، فيمكنك تشغيل مستكشف المكدس المُدار ضدها للحصول على لمحة سريعة عما تفعله.يمكنك تشغيل هذا دون تثبيت صريح.

بخلاف ذلك فإن full dump +windbg +SOS يمنحك أكبر قدر من المعلومات، ولكن الحصول عليها ليس بالأمر التافه.

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