
أدوات تحليل الكومة لـ dlmalloc
libdlmalloc هو سكربت بلغة بايثون مصمم للاستخدام مع GDB ويمكن استخدامه لتحليل مُخصِّص الذاكرة دوج ليا، المعروف باسم dlmalloc. وهو يدعم حاليًا إصدارات dlmalloc 2.8.x. لاحظ أن بعض الأجزاء يمكن استخدامها أيضًا بشكل مستقل عن GDB، على سبيل المثال لإجراء تحليل دون اتصال لبعض ذاكرة الكومة الملتقطة.
استلهم libdlmalloc من سكربتات GDB الأخرى المكتوبة بلغة بايثون لتحليل الكومات مثل libtalloc، وunmask_jemalloc، وlibheap. بعض الوظائف الأساسية متطابقة تقريبًا مع هذه المشاريع.
اختُبر libdlmalloc بشكل أساسي على أجهزة Cisco ASA ذات 32 بت و64 بت التي تستخدم dlmalloc 2.8.3. يجب أن يعمل مع إصدارات 2.8.x الأخرى، ولكن نظرًا للاختلافات الكبيرة لن يعمل مع الإصدارات الأقدم، مثل <= 2.7.x.
إذا نجحتَ في اختبار libdlmalloc على إصدار معين من 2.8.x أو جهاز معين، فيُرجى إخبار المؤلفين وسنقوم بتحديث المستندات.
يتطلب السكربت فقط إصدارًا حديثًا نسبيًا من GDB مع دعم python3. اختبرنا بشكل أساسي على python3، لذا نتوقع أن يتعطل على python2.7 حاليًا.
إذا كنت تريد استخدام أوامر gdb، يمكنك استخدام:``` (gdb) source libdlmalloc_28x.py
تم تقسيم جزء كبير من المنطق الأساسي إلى فئة `dl_helper`، والتي تتيح لك
استيراد libdlmalloc مباشرةً والوصول إلى بعض البنى المهمة
خارج جلسة GDB. وهذا مفيد إذا كنت تريد تحليل
لقطات chunk/heap دون اتصال.
# الاستخدام
معظم الوظائف منمذجة على النهج المتبع في unmask_jemalloc
وlibtalloc حيث يتم توفير أمر GDB منفصل. ومع ذلك، نستخدم أيضًا
عددًا لا بأس به من الخيارات.
لعرض قائمة كاملة بالأوامر المدعومة حاليًا، يمكنك استخدام
الأمر `dlhelp`:
## dlhelp
هذه هي الوظيفة الرئيسية لعرض الأوامر المتاحة. يدعم كل أمر
من الأوامر خيار `-h` الذي يسمح لك بالحصول على تعليمات استخدام
أكثر تفصيلًا.```
(gdb) dlhelp
[libdlmalloc] dlmalloc commands for gdb
[libdlmalloc] dlchunk : show one or more chunks metadata and contents
[libdlmalloc] dlmstate : print mstate structure information. caches address after first use
[libdlmalloc] dlcallback : register a callback or query/modify callback status
[libdlmalloc] dlhelp : this help message
[libdlmalloc] NOTE: Pass -h to any of these commands for more extensive usage. Eg: dlchunk -h
يمكن لـ dlchunk أن يوفّر لك ملخصًا لقطعة، أو معلومات أكثر تفصيلًا
عن كل حقل. كما يمكنك استخدامه لعرض معلومات عن
قطع متعددة، والبحث عن القطع، وما إلى ذلك. يمكن الاطلاع على استخدام dlchunk أدناه:```
(gdb) dlchunk -h
[libdlmalloc] usage: dlchunk [-v] [-f] [-x] [-c ]
[libdlmalloc] a dlmalloc chunk header
[libdlmalloc] -v use verbose output (multiples for more verbosity)
[libdlmalloc] -f use explicitly, rather than be smart
[libdlmalloc] -x hexdump the chunk contents
[libdlmalloc] -m max bytes to dump with -x
[libdlmalloc] -c number of chunks to print
[libdlmalloc] -s search pattern when print chunks
[libdlmalloc] --depth depth to search inside chunk
[libdlmalloc] -d debug and force printing stuff
[libdlmalloc] Flag legend: C=CINUSE, P=PINUSE
يبدو الإخراج الأساسي كما يلي:```
(gdb) dlchunk 0xacff59d0
0xacff59d0 M sz:0x000f8 fl:CP
كما ترى، تريد أن تعطيه عنوان بيانات تعريف dlmalloc الفعلية
نفسها. للحصول على مخرجات أكثر تفصيلاً، يمكنك استخدام -v.```
(gdb) dlchunk -v 0xacff59d0
struct malloc_chunk @ 0xacff59d0 {
prev_foot = 0x8140d4d0
size = 0xf8 (CINUSE|PINUSE)
يمكنك أيضًا سرد عدة أجزاء متجاورة باستخدام الخيار `-c <count>`.```
(gdb) dlchunk -c 2 0xacff59d0
0xacff59d0 M sz:0x000f8 fl:CP
0xacff5ac8 M sz:0x00270 fl:CP
(gdb) dlchunk -v -c 2 0xacff59d0
struct malloc_chunk @ 0xacff59d0 {
prev_foot = 0x8140d4d0
size = 0xf8 (CINUSE|PINUSE)
--
struct malloc_chunk @ 0xacff5ac8 {
prev_foot = 0x8140d4d0
size = 0x270 (CINUSE|PINUSE)
-x والتحكم في عدد البايتات التي تريد تفريغها باستخدام -m.```
(gdb) dlchunk -v -x -m 16 -c 2 0xacff59d0
struct malloc_chunk @ 0xacff59d0 {
prev_foot = 0x8140d4d0
size = 0xf8 (CINUSE|PINUSE)
0x10 bytes of chunk data:
0xacff59d8: 0xa11c0123 0x000000cc 0x00000000 0x00000000struct malloc_chunk @ 0xacff5ac8 { prev_foot = 0x8140d4d0 size = 0x270 (CINUSE|PINUSE) 0x10 bytes of chunk data: 0xacff5ad0: 0xa11c0123 0x00000244 0x00000000 0x00000000
يمكنك أيضًا البحث داخل الأجزاء. لنبحث في جزأين عن القيمة `0x00000244`، والتي نرى أعلاه أنها موجودة فقط في الجزء الثاني.```
(gdb) dlchunk -s 0x00000244 -c 2 0xacff59d0
0xacff59d0 M sz:0x000f8 fl:CP [NO MATCH]
0xacff5ac8 M sz:0x00270 fl:CP [MATCH]
سيتم عرض جميع التطابقات داخل عدد الأجزاء التي تم البحث فيها. دعنا نبحث
عن 0xa11c01123 الذي رأينا أعلاه أنه موجود في كلا الجزأين:```
(gdb) dlchunk -s 0xa11c0123 -c 2 0xacff59d0
0xacff59d0 M sz:0x000f8 fl:CP [MATCH]
0xacff5ac8 M sz:0x00270 fl:CP [MATCH]
## dlmstate