سؤال

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

كيف تحصل هذه الأداة على هذه المعلومات؟

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

المحلول

(الإفصاح الكامل: أنا في فريق البروفيلير في Visual Studio ، لكن المعلومات أدناه عامة)

يمكنك القيام بذلك عن طريق كتابة pforler CLR التي تعمل داخل العملية التي تستهدفها. Profilers CLR هي كائنات C ++ com التي يتم إنشاء مثيل لها في وقت التشغيل عندما تكون COR_PROFILER و COR_PROFILING_ENABLED يتم تعيين متغيرات البيئة (انظر هنا). هناك نوعان رئيسيان واجهات التنميط CLR, ، خاصة، ICorProfilerCallback و ICorProfilerInfo. ICorProfilerCallback هو ما يستخدمه CLR لإعلامك بأحداث محددة تشترك فيها (أحمال الوحدة النمطية ، الدالة JIT ، إنشاء مؤشرات الترابط ، أحداث GC) ، بينما ICorProfilerInfo يمكن استخدامها من قبل Profiler للحصول على معلومات إضافية حول مؤشرات الترابط والوحدات النمطية والأنواع والأساليب والبيانات الوصفية للتجميعات المحملة. هذه الواجهة هي ما أنت استطاع استخدم للحصول على معلومات رمز حول الأنواع المخصصة.

مع عملية البروفيلر الخاصة بك ، يمكنك فرض GC من خلال ICorProfilerInfo::ForceGC. بعد الانتهاء من GC ، سيتم إخطار البروفيل الخاص بك عبر ICorProfilerCallback2::GarbageCollectionFinished, ، وستحصل على مراجع الجذر عبر ICorProfilerCallback2::RootReferences2. عند الجمع بين المعلومات المرجعية الجذرية مع ICorProfilerCallback::ObjectReferences, ، يمكنك الحصول على الرسم البياني المرجعي للكائن الكامل لتطبيق .NET الخاص بك.

يمكنك الحصول على المزيد من المعلومات في الوقت الفعلي باستخدام ICorProfilerCallback::ObjectAllocated رد الاتصال لتحديد متى يتم إنشاء كائنات CLR الفردية. يمكن أن يكون هذا مكلفًا ، نظرًا لأنك تتحمل على الأقل استدعاء وظيفة إضافية لكل كائن مخصص. يمكنك تتبع الكائنات الفردية عن طريق تعيين CLR المخصصة ObjectID إلى معرفك الداخلي الخاص بك. و ObjectID بالنسبة إلى كائن معين ، يوجد مؤشر سريع الزوال لأنه يمكن أن يتغير مع حدوث مجموعات القمامة ، مما قد يتسبب في تحرك كائنات أثناء الضغط. تم توضيح هذه العملية هنا. يمكنك استخدام المعلومات من ICorProfilerCallback::MovedReferences لتتبع الكائنات المتحركة.

من أجل تنشيط عمليات الاسترجاعات المذكورة أعلاه ، تحتاج إلى إخبار واجهة برمجة تطبيقات Perfiling CLR بأنك مهتم بها. يمكنك القيام بذلك عن طريق تحديد COR_PRF_MONITOR_GC و COR_PRF_MONITOR_OBJECT_ALLOCATED كجزء من أعلام الحدث الخاص بك عند الاتصال ICorProfilingInfo::SetEventMask.

ديفيد برومان هو المطور على CLR Profiler ، و مدونته لديه الكثير من المعلومات الرائعة حول التنميط بشكل عام ، بما في ذلك جميع المزالق المجنونة والمشكلات التي قد تواجهها.

نصائح أخرى

يستخدم البروفيسور مثل النمل "واجهة برمجة تطبيقات التنميط" التي يقدمها CLR نفسها ، والتي يمكن أن تخبرك ببساطة بما يجري داخل CLR. على سبيل المثال ، هناك طريقة رد اتصال API تحدث عند تخصيص كائن ، وسمّى بشكل مناسب ObjectAllocated (). وبالمثل ، هناك أحداث عندما يتم إدخال الأساليب ، عند إنشاء مؤشرات الترابط ، إلخ ، إلخ.

ويسمى واجهة برمجة تطبيقات التنميط الأصلي ICORPROFILERCALLBACK. تسمى الإصدارات اللاحقة CoreProfilerCallback2 و CoreProfilerCallback3. إذا قمت بوجود هذه الأسماء ، فستجد بالضبط الإجابات التي تبحث عنها. في CodeProject ، يمكنك رؤية مثال عملي: إنشاء مخصص .NET Profiler

ملاحظة أخيرة: لا يمكن استخدام API من التعليمات البرمجية المدارة مثل C# و VB.NET. إنه متوفر فقط من رمز غير مُدارة مثل EG C أو C ++. لذلك لا يمكن تطبيق C# استخدام واجهة برمجة التطبيقات هذا لفحص سلوكه وكائناته ، على سبيل المثال.

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