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

PerfView هي أداة رائعة استخدمها منذ عدة سنوات. إنه يعمل على أساس تعقب أحداث Windows (ETW) ويسمح لك بفهم أفضل لما يحدث داخل CLR ، كما يتيح لك الفرصة للحصول على ملف تعريف للذاكرة واستخدام وحدة المعالجة المركزية. لإتقان الأداة ، سيتعين عليك استيعاب الكثير من المعلومات ، على سبيل المثال بمساعدة مقاطع الفيديو التدريبية ، لكنها تستحق الوقت والجهد.
الأداة مفيدة للغاية بحيث يستخدمها مهندسو Microsoft أنفسهم ، وظهرت العديد من تحسينات الأداء الحديثة في MSBuild بعد تحليل الاختناقات باستخدام PerfView.
تعتمد الأداة على مكتبة Microsoft.Diagnostics.Tracing.TraceEvent ، والتي يمكنك استخدامها لإنشاء أدواتك الخاصة. بالإضافة إلى ذلك ، نظرًا لأن الشفرة المصدرية للمكتبة مفتوحة ، بفضل المجتمع ، فقد ظهرت فيها العديد من الوظائف المفيدة ، على سبيل المثال ، الرسوم البيانية باللهب :

برز SharpLab كأداة لفحص كود IL الذي تم إنشاؤه بواسطة برنامج التحويل البرمجي Roslyn ، وتطور بمرور الوقت إلى شيء أكثر :
تعد SharpLab بيئة تفاعلية لتشغيل التعليمات البرمجية .NET ، والتي تعرض الخطوات والنتائج الوسيطة لتجميع التعليمات البرمجية. بعض وظائف اللغة هي مجرد غلاف للآخرين ، على سبيل المثال استخدام () يصبح try / catch. مع SharpLab ، سترى الكود كما يراه المترجم ويفهم بشكل أفضل جوهر لغات .NET.
تدعم الأداة C # و Visual Basic و F # ، ولكن الوظائف الأكثر إثارة للاهتمام في ذلك هي Decompilation / Disassembly:
يمكن استخدام وظائف إزالة التجميع / التفكيك من أجل:
- C #
- البصرية الأساسية
- IL
- JIT Asm (كود Asm الأصلي)
لقد فهمت بشكل صحيح: تقوم الأداة بإخراج رمز أداة التجميع التي ينشئها .NET JIT من رمز C # الخاص بك:

باستخدام هذه الأداة ، يمكنك تحليل بنية كائنات .NET في الذاكرة ، أي كيف رتبت JITter الحقول التي تنتمي إلى فصلك أو هيكلك. هذا مفيد عند كتابة التعليمات البرمجية عالية الأداء. من الجيد أيضًا أن يكون لدينا أداة تؤدي العمل الشاق لنا.
لا توجد وثائق رسمية تصف هيكل الحقل ، حيث يحتفظ مؤلفو CLR بالحق في تغييره في المستقبل. لكن المعرفة بالهيكل يمكن أن تكون مفيدة إذا كنت تعمل على تطبيق عالي السرعة.
كيف يمكنك دراسة الهيكل؟ يمكنك إلقاء نظرة على الذاكرة الخام في Visual Studio أو استخدام !dumpobj
في ملحق تصحيح أخطاء SOS . يتطلب كلا النهجين الكثير من الجهد ، لذلك سنقوم بإنشاء أداة تعرض بنية الكائن في وقت التشغيل.
وفقًا للمثال في مستودع GitHub ، إذا كنت تستخدم TypeLayout.Print<NotAlignedStruct>()
مع رمز مشابه:
public struct NotAlignedStruct { public byte m_byte1; public int m_int; public byte m_byte2; public short m_short; }
سيظهر الإخراج التالي ، والذي سيوضح بدقة كيف سيقوم CLR بترتيب البنية في الذاكرة استنادًا إلى قواعد التحسين والحشو.
Size: 12. Paddings: 4 (%33 of empty space) |================================| | 0: Byte m_byte1 (1 byte) | |--------------------------------| | 1-3: padding (3 bytes) | |--------------------------------| | 4-7: Int32 m_int (4 bytes) | |--------------------------------| | 8: Byte m_byte2 (1 byte) | |--------------------------------| | 9: padding (1 byte) | |--------------------------------| | 10-11: Int16 m_short (2 bytes) | |================================|
كما هو مذكور في صفحة جيثب ، TUNE هي أداة واعدة. سيساعدك على التعرف على .NET الداخلية وكيفية تحسين الأداء من خلال تجربة رمز C #.
يمكن العثور على معلومات مفصلة عنه في هذا المنشور ، ولكن على مستوى عال ، فإنه يعمل على النحو التالي :
- اكتب مثال رمز C # صالحًا يحتوي على فئة واحدة على الأقل باستخدام طريقة عامة تأخذ معلمة سلسلة واحدة. يتم إطلاق الكود باستخدام زر التشغيل. يمكنك تضمين أي عدد من الأساليب والفصول الدراسية. ولكن تذكر أنه سيتم تنفيذ الطريقة العامة الأولى من الفئة العامة الأولى باستخدام المعلمة الأولى من نافذة الإدخال تحت الرمز ؛
- انقر فوق الزر "تشغيل" لتجميع التعليمات البرمجية وتنفيذها. بالإضافة إلى ذلك ، سيتم تجميعها في IL-code ورمز المجمع في علامات التبويب المقابلة ؛
- أثناء تشغيل Tune (بما في ذلك وقت التشغيل) ، تقوم الأداة بإنشاء رسم بياني يعرض بيانات أداة تجميع مجمعي البيانات المهملة. يحتوي على معلومات حول أحجام التوليد وجلسات تجميع البيانات المهملة (يتم تمثيلها كخطوط رأسية برقم أدناه ، والتي تشير إلى أي مجموعة من مجموعات توليد البيانات المهملة تتم)
يبدو مثل هذا:

أدوات تشخيص الذاكرة CLR (ClrMD)
أخيرًا ، دعنا نلقي نظرة على فئة معينة من الأدوات. منذ إصدار .NET ، كان المطورين قادرين دائمًا على استخدام WinDBG و SOS Debugging Extension لمعرفة ما يحدث في وقت تشغيل .NET. ومع ذلك ، فهذه ليست أسهل الأدوات للتعارف الأول ، وكما هو مذكور في تغريدة التالية ، ليست دائمًا الأكثر إنتاجية:
لحسن الحظ ، أتاحت Microsoft مكتبة ClrMD (المعروفة أيضًا باسم Microsoft.Diagnostics.Runtime ) ، ويمكن لأي شخص الآن إنشاء أداة لتحليل ملفات تفريغ الذاكرة لبرامج .NET. يمكن العثور على معلومات مفصلة في المدونة الرسمية . أوصي أيضًا بإلقاء نظرة على ClrMD.Extensions ، والتي "... توفر التكامل مع LINPad وتجعل استخدام ClrMD أسهل . "
كنت أرغب في إعداد قائمة تضم جميع الأدوات الحالية ودعت على Twitter للحصول على المساعدة. تذكير نفسك: كن حذرا مع التغريدات. المدير المسؤول عن WinDBG قد يقرأها ويكون مستاء!
معظم هذه الأدوات تعمل على أساس ClrMD ، لأن هذا هو الأسهل. ولكن إذا كنت ترغب في ذلك ، يمكنك استخدام واجهات COM مباشرة . تجدر الإشارة أيضًا إلى أن أي أداة تستند إلى ClrMD ليست مشتركة بين الأنظمة الأساسية ، لأن ClrMD نفسه مصمم فقط لنظام Windows. يتم وصف خيارات النظام الأساسي في تحليل .NET Core Core Dump على نظام Linux .
أخيرًا ، من أجل الحفاظ على التوازن بطريقة أو بأخرى ، ظهرت نسخة محسنة من WinDBG مؤخرًا ، وحاولوا على الفور إضافة وظائف:
بعد كل هذه الكلمات ، انتقل إلى القائمة:
- SuperDump ( جيثب )
- أداة للتحليل التلقائي لتفريغ التعطل ( العرض )
- msos ( جيثب )
- بيئة مع واجهة سطر الأوامر مثل WinDbg لتنفيذ أوامر SOS في غياب SOS.
- MemoScope.Net ( جيثب )
- أداة لتحليل ذاكرة العملية في .NET. يمكنك تفريغ ذاكرة التطبيق في ملف وقراءتها لاحقًا.
- يحتوي الملف على جميع البيانات (الكائنات) ومعلومات حول مؤشرات الترابط (الحالة ، المكدس ، مكدس الاستدعاءات). تقوم MemoScope.Net بتحليل البيانات وتساعدك في العثور على تسرب الذاكرة والجمود.
- dnSpy ( جيثب )
- .NET مصحح أخطاء التجميع ومحرر
- يمكن استخدامه لتحرير وتصحيح التجميعات ، حتى لو لم يكن لديك شفرة المصدر.
- MemAnalyzer ( جيثب )
- أداة تحليل الذاكرة لرمز المدارة. هناك واجهة سطر الأوامر.
- يمكن لـ
!DumpHeap
in Windbg تحديد الكائنات التي !DumpHeap
أكبر مساحة على الكومة دون الحاجة إلى تثبيت مصحح أخطاء.
- DumpMiner ( جيثب )
- تتبع CLI ( جيثب )
- أداة لتصحيح الأخطاء والتتبع أثناء التشغيل
- سقيفة ( جيثب )
- Shed هو تطبيق يقوم بتحليل تنفيذ برنامج في .NET. يمكن استخدامه لتحليل البرامج الضارة من أجل الحصول على بيانات حول المعلومات المخزنة عند بدء تشغيل هذا البرنامج. سقيفة يمكن:
- استرداد كافة الكائنات المخزنة في كومة الذاكرة المؤقتة التي تتم إدارتها
- خطوط العرض المخزنة في الذاكرة ؛
- إنشاء لقطة كومة في تنسيق JSON لمزيد من المعالجة ؛
- تفريغ جميع الوحدات المحملة في الذاكرة.
يمكنك العثور على العديد من الأدوات الأخرى التي تستخدم ClrMD . جعلها متوفرة فكرة جيدة من Microsoft.
أدوات أخرى
الأدوات الأخرى الجديرة بالذكر:
- DebugDiag
- تم تصميم أداة DebugDiag لإصلاح مشكلات مثل التجمد أو الأداء الضعيف أو تسرب الذاكرة أو التجزئة ، وكذلك حالات الفشل في عمليات وضع المستخدم (الآن مع تكامل CLRMD).
- SOSEX (ربما لم تعد قيد التطوير)
- ... امتداد لتصحيح الأخطاء التي تتم إدارتها والتي تعمل على تقليل استيائي من SOS.
- VMMap من Sysinternals
