DHAT - Dynamic Heap Analysis Tool
DHAT - Dynamic Heap Analysis Tool
DHAT (Dynamic Heap Analysis Tool) هي أداة Valgrind التي تجيب سؤال مختلف من معظم محللي الذاكرة. بدلاً من “كم الذاكرة التي خصصت” فقط فإنها تقرير كيفية استخدام الذاكرة بالفعل: blocks المخصصة ولم تُقرأ أبداً و blocks المكتوبة مرة واحدة ولم تُلمس مرة أخرى و allocations قصيرة الأجل جداً و allocations أكبر بكثير من البايتات المزار فعلاً. وجهة view الاستخدام هذه غالباً ما تكشف النفايات التي محللي الملف التعريفي size-only لا تستطيع أن ترى.
التثبيت
| المنصة | الأمر |
|---|---|
| Debian/Ubuntu | sudo apt install valgrind |
| Fedora/RHEL | sudo dnf install valgrind |
| Arch Linux | sudo pacman -S valgrind |
| macOS | دعم محدود; فضل Linux |
| التحقق | valgrind --tool=dhat --version |
بناء برنامجك مع
-gلـ useful stack traces. DHAT يعمل تحت Valgrind حتى توقع بطء كبير — هذه أداة تحليل وليست محلل ملف تعريفي للإنتاج.
تشغيل DHAT
valgrind --tool=dhat ./my-program
# → ينتج dhat.out.<pid>
| الخيار | الغرض |
|---|---|
--dhat-out-file=FILE | مسار الإخراج |
--mode=heap | تحديد ملف تعريفي الـ heap الافتراضي |
--mode=copy | تحديد ملف تعريفي لـ memory copying (memcpy إلخ.) |
--mode=ad-hoc | نقاط البرمجة المخصصة |
--num-callers=N | عمق المكدس في التقارير |
عرض النتائج
DHAT output هو JSON و تُعرض في عارض HTML المضمنة:
# فتح العارض وتحميل dhat.out.<pid>
firefox /usr/libexec/valgrind/dh_view.html
| عنصر واجهة رسومية | يعرض |
|---|---|
| شجرة نقاط الـ allocation | مجمع حسب call stack |
| إجمالي / max bytes | مقدار لكل site |
| Reads / writes | كم الذاكرة الفعلي تم الوصول إليها |
| Lifetimes | كم طويل عاش blocks |
| الفرز | حسب أي metric لإيجاد المخترقين الأسوأ |
المقاييس التي تهم
| المقياس | يكشف |
|---|---|
| إجمالي bytes | مقدار allocation الكامل من هذا site |
| Max bytes | الاستخدام المتزامن الأقصى |
| Reads / writes | كثافة الوصول |
| Reads = 0 | مخصص لكن لم تُقرأ أبداً — نفايات صرفة |
| Writes = 0 | لم تُهيأ أبداً — ربما bug أو نفايات |
| Short lifetimes | Churn; مرشحات stack/pooling |
| Access ratio | البايتات المزار مقابل bytes المخصصة |
حالة “reads = 0” هي الاكتشاف الكلاسيكي DHAT: الذاكرة التي برنامج بجد يخصص و يملأ و يحرر بدون أي شيء يقرؤها.
الاكتشافات الشائعة و الإصلاحات
| الاكتشاف | الإصلاح المحتمل |
|---|---|
| allocations صغيرة قصيرة الأجل كثيرة | Stack allocation أو arena أو object pool |
| Block كبير و portion مزار صغيرة | خصص فقط ما تستخدم; lazy load |
| allocations لم تُقرأ أبداً | حذف العمل تماماً |
| repeated alloc/free من نفس الحجم | إعادة استخدام buffer |
| containers oversized | Reserve accurate capacity |
Copy Mode
valgrind --tool=dhat --mode=copy ./my-program
Copy mode يحدد ملف تعريفي لـ memcpy/memmove مقدار بـ call site — مفيد عندما التحديد ملف تعريفي يظهر وقت في copying وتحتاج معرفة أي كود مسؤول.
Ad-Hoc Mode
Ad-hoc mode تسمح لك بعد أحداث تعسفية بـ annotate الكود الخاص بك مع طلبات عميل DHAT وتحويل DHAT إلى عام “أي call stack يفعل هذا الأكثر” counter.
DHAT مقابل الأدوات ذات الصلة
| الجانب | DHAT | massif | heaptrack | Bytehound |
|---|---|---|---|---|
| التركيز | كيفية استخدام الذاكرة | الاستخدام الأقصى بمرور الوقت | تحديد ملف تعريفي Allocation | استكشاف تفاعلي |
| النفقات العامة | عالية (Valgrind) | عالية (Valgrind) | منخفضة | منخفضة |
| رؤى فريدة | Unread/underused blocks | قطعات ذروة | Churn + leaks | تصفية غنية |
| الأفضل للـ | إيجاد عمل مهدر | انخفاض الذروة | تشغيلات واقعية سريعة | تحليل تفاعلي عميق |
استخدم heaptrack أو Bytehound لتحديد ملف تعريفي منخفض overhead للتشغيلات الواقعية; ابدأ إلى DHAT عندما تريد معرفة ما إذا كانت allocated memory استُخدمت فعلاً.