ابزارهایی برای کاوش درون دات نت
چه بخواهید بدانید که در پشت صحنه کد شما چه میگذرد یا صرفاً کنجکاو باشید تا از درون CLR (Common Language Runtime) سر دربیاورید؛ ابزارهای زیادی برای شما وجود دارد.
ویژوال استودیو (Visual Studio) و VSCode هر دو از اشکالزداهایی (Debugger) عالی بهره میبرند. همچنین پروفایلرها (مثل JetBrains dotTrace ، Redgate ANTS و CodeTrack) و ابزارهای نظارت بر برنامه (مثل Loupe و Dynatrace) بسیار خوبی برای فریمورک دات نت (NET.) موجود است.
اما هدف این پست، معرفی ابزارهایی است که قابلیتهای محدودتر اما حرفهایتری نسبت به موارد بالا دارند. با این ابزارها میتوانید دیدی عمیق و دقیق از نحوه عملکرد هر بخش پیدا کنید. تمامی ابزارهای معرفیشده، متنباز (Open-source) هستند و شما میتوانید از نحوه عملکرد خود ابزارها نیز آگاه شوید.
PerfView با استفاده از رویدادهای «Event Tracing for Windows»، دیدی کامل از عملکرد CLR به شما میدهد. همچنین با این ابزار میتوانید بر استفاده از حافظه و پردازنده نظارت کنید. آموزشهای خوبی برای ابزار PrefView در Channel9 موجود است. اما خودتان هم میتوانید آن را یاد بگیرید. یادگیری این ابزار خالی از لطف نیست و قطعاً ارزشش را دارد.
اگر همچنان به کارا بودن این ابزار شک دارید، بهتر است بدانید که مهندسان مایکروسافت اخیراً با کمک همین ابزار و پیداکردن گلوگاهها (Bottleneck)، موفق به بهبود عملکرد MSBuild شدند.
PerfView بر اساس کتابخانه Microsoft.Diagnostics.Tracing.TraceEvent ساخته شده است. شما میتوانید از این کتابخانه (Library) در ابزارهای خودتان نیز بهره ببرید. ضمناً به دلیل متنباز بودن این ابزار، توسعهدهندگان قابلیتهای بسیار جالبی نظیر گرافهای شعلهای (Flame Graph) به آن افزودهاند.
شارپلب که ابتدا یک ابزار برای بررسی کد IL (زبان واسطه یا Intermediate Language) تولیدشده توسط کامپایلر Roslyn بود، هماکنون بسیار توسعهیافتهتر است.
شارپلب مراحل میانی و نتایج تفسیر (Compilation) کد را نشان میدهد. شارپلب به شما این قابلیت را میدهد تا کد را همان گونه که کامپایلر میبیند، ببینید و درک بهتری از زبانهای دات نت پیدا کنید.
این ابزار از سیشارپ (#C)، ویژوال بیسیک (Visual Basic) و #F پشتیبانی میکند. قابلیت متمایز این ابزار، «تفسیرزدایی/جداسازی» (Decompilation/Diassembly) است. این قابلیت فعلاً از #C، ویژوال بیسیک، IL و JIT Asm (کد اسمبلی) پشتیبانی میکند. این ابزار به شما کد اسمبلی (Assembly) تولیدشده توسط .NET JIT را خروجی میدهد.
این ابزار شما را از نحوه چینش (layout) آبجکتهای دات نت در حافظه، آگاه میسازد. OLI زمانی کاربردی است که بخواهید یک کد با عملکرد و کارایی بالا بنویسید. این امر بدون ابزار و به طور دستی نیز ممکن است اما کاری پیچیده و دشوار خواهد بود.
هیچ مستند (Documentation) رسمی درباره چینش زمینه (Field Layout) وجود ندارد و سازندگان CLR حق تغییر این موضوع را برای خود محفوظ کردهاند. اما آگاهی درباره Layout میتواند مفید واقع شود.
برای بررسی Layout میتوانیم به حافظه خام در ویژوال استودیو نگاه بیندازیم یا از دستور !dumpobj در افزونه SOS Debugging استفاده کنیم. اما این روشها خستهکنندهاند، پس ما ابزاری مینویسیم که چینش یک آبجکت را در زمان اجرا خروجی بدهد.
برای مثال اگر از TypeLayout.Print() با کد زیر استفاده شود،
public struct NotAlignedStruct{ public byte m_byte1; public int m_int; public byte m_byte2; public short m_short;}
خروجی زیر حاصل میشود. این خروجی دقیقاً نشان میدهد که CLR چگونه چینش struct در حافظه را ، براساس قوانین padding و بهینهسازی انجام میدهد.
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 بنویسید که شامل حداقل یک کلاس با متد پابلیک باشد که یک پارامتر رشته دریافت میکند. هنگامی که کد را اجرا کنید، اسکریپت کامپایل و اجرا میشود. در تبهای دیگر میتوانید کد دیکامپایلشده به IL و اسمبلی را مشاهده کنید. همچنین دادههای مربوط به مدیریت حافظه به شکل گراف در قسمت پایینی نمایش داده میشوند.
ابزارهای مبتنی بر ClrMD
از زمان انتشار NET. تا به امروز، امکان بررسی دقیق NET. با استفاده از WinDBG و افزونه SOS Debugging وجود داشته است. البته این ابزارها به اندازهی کافی آسان و کارا نیستند.
خوشبختانه مایکروسافت، کتابخانه ClrMD را ایجاد کرد. ClrMD مخفف CLR Memory Diagnostics است. با کمک این کتابخانه هر کسی میتواند ابزاری برای بررسی و تحلیل مشکلات حافظه نرمافزارهای NET. بنویسد. همچنین با استفاده از افزونههای ClrMD استفاده از آن راحتتر هم میشود. البته باید توجه داشت که ابزارهای مبتنی بر ClrMD، کراسپلتفرم (Cross-platform) نیستند، زیرا خود ClrMD فقط در ویندوز موجود است.
لیست برخی از ابزارهای مبتنی بر ClrMD
SuperDump: سرویسی برای تحلیل خودکار کرش.
Msos: محیطی دستوری به سبک WinDbg برای اجرای فرامین SOS بدون در دسترس بودن SOS.
MemoScope.Net: ابزاری برای تحلیل حافظه پردازش دات نت. این ابزار میتواند حافظهی نرمافزار را در یک فایل ذخیره کند و بعداً آن را بخواند. فایل ذخیرهشده شامل تمامی دادهها (آبجکتها) و تردها (state و stack) است. MemoScope.Net از این دادهها استفاده میکند تا شما را در پیدا کردن نشتیهای حافظه و بنبستها راهنمایی کند.
dnSpy: اشکالزدا و ویرایشگر اسمبلی.
MemAnalyzer: ابزاری دستوری برای تحلیل حافظه.
DumpMiner: محیطی گرافیکی برای استفاده از ClrMD، با قابلیتهای بیشتر.
Trace CLI: ابزار ردیابی و اشکالزدایی.
Shed: این اپلیکیشن اجازهی بررسی رانتایم دات نت از یک برنامه را میدهد تا به کمک آن، اطلاعات مفید استخراج شود. این ابزار میتواند برای بررسی بدافزارها استفاده شود.
ابزارهای دیگر
DebugDiag: ابزاری برای یاریرسانی در رفع مشکلاتی نظیر هنگ، عملکرد ضعیف، نشت حافظه و کرشها.
SOSEX: افزونهای برای اشکالزدایی.
VMMap: ابزاری برای تحلیل پردازش مجازی و فیزیکی حافظه.
شما چقدر به بررسی CLR اهمیت میدهید؟ آیا ابزار مفیدی خارج از لیست بالا میشناسید؟ دیدگاههای خود را با ما به اشتراک بگذارید.
نظرات