
मेमपूल के लिए हीप विश्लेषण टूलिंग
प्रारंभिक नोट: हम अनुशंसा करते हैं कि आप इसे asatools के भाग के रूप में उपयोग करें, लेकिन इसे स्टैंडअलोन भी उपयोग किया जा सकता है।
libmempool एक पायथन स्क्रिप्ट और GDB विश्लेषण उपकरण है जो Cisco ASA
डिवाइसों पर विभिन्न हीप्स के भीतर पाए जाने वाले mempool-संबंधित डेटा संरचनाओं के विश्लेषण में सहायता करता है।
सामान्यतः यह जानकारी एक हीप चंक में एम्बेडेड होती है, या किसी अन्य सामान्य हीप संरचना जैसे dlmalloc
mstate संरचना का एक कस्टम विस्तार होती है।
Cisco विभिन्न उद्देश्यों जैसे सामान्य आवंटन, DMA, आदि के लिए मैप की गई मेमोरी के क्षेत्रों का वर्णन करने के लिए mempool शब्द का उपयोग करता है। इन क्षेत्रों में आमतौर पर उनका हीप, जैसे dlmalloc, होता है। इन mempools पर आवंटन दिनचर्या आमतौर पर अंतर्निहित हीप आवंटक के चारों ओर रैपर का उपयोग करके की जाती है, और ये रैपर परिणामी आवंटन में mempool-विशिष्ट मेटाडेटा इंजेक्ट करते हैं। हम इस मेटाडेटा को mempool header या संक्षेप में mh कहते हैं। इसी तरह हम नियमित रूप से mempool को mp कहेंगे। mempool header का वर्णन करने के लिए mh का उपयोग Cisco ASA lina बाइनरी में पाए जाने वाले विभिन्न स्ट्रिंग्स के साथ भी संगत है।
यद्यपि libmempool को mempool हेडर और डेटा संरचनाओं से संबंधित कुछ चीजों के विश्लेषण के लिए एक स्टैंड-अलोन उपकरण के रूप में उपयोग किया जा सकता है, इसका सबसे बड़ा मूल्य अन्य पुस्तकालयों जैसे libdlmalloc या libptmalloc से कॉलबैक के रूप में उपयोग किए जाने से आता है।
यह ध्यान देने योग्य है कि mempool के कुछ पहलू, जैसे कि उपयोग में आने वाले चंक्स को ट्रैक करने के लिए उपयोग किए जाने वाले bins, dlmalloc 2.8.x mstate संरचना के अंदर एम्बेडेड होते हैं और समान bin आकार का पालन करते हैं। इसका मतलब है कि लगभग अनिवार्य रूप से आपको libdlmalloc का उपयोग करके mempool डेटा को समाहित करने वाले कम से कम mstate के आसपास खोजबीन करनी पड़ सकती है।
libmempool का परीक्षण 32-बिट / 64-बिट Cisco ASA संस्करणों (ASA5500-X श्रृंखला और GNS3 दोनों) के साथ किया गया है जो dlmalloc2.8 या glibc के ptmalloc2-आधारित आवंटक का उपयोग करते हैं। इसका परीक्षण कई ASA संस्करणों पर किया गया है, जिनमें कई 8.x.y और 9.x.y शाखाएँ शामिल हैं। हालाँकि, यह पूरी तरह से संभव है कि यह किसी संस्करण पर विफल हो जाए।
libmempool को स्टैंड-अलोन उपयोग करने के लिए आपको बस अपने प्रोजेक्ट में libmempool.py फ़ाइल को import करना होगा। यह आपको कुछ सीमित क्रियाएँ करने की अनुमति देता है, जैसे
mpcallback ऑब्जेक्ट को पंजीकृत करना, आदि। यह उपयोगी हो सकता है यदि आप लॉग किए गए हीप कार्यक्षमता का ऑफ़लाइन विश्लेषण कर रहे हैं।
GDB में import करने के लिए, स्क्रिप्ट को केवल पायथन समर्थन के साथ GDB की आवश्यकता होती है। हालाँकि अधिकांश आधुनिक GDB संस्करण पायथन 3 की ओर बढ़ गए हैं, कुछ अभी भी 2.7 की अपेक्षा करते हैं। स्क्रिप्ट का परीक्षण दोनों पर किया गया है, लेकिन मुख्य रूप से विकास और परीक्षण पायथन 3 के साथ किया जाता है।
(gdb) source libmempool_gdb.py
हम अधिकांश gdb-संबंधित तर्क को libmempool.py से अलग करके libmempool_gdb.py में रखते हैं, केवल चीजों को अमूर्त करने का परीक्षण करने के लिए और ताकि आप GDB के बाहर आसानी से libmempool.py का उपयोग कर सकें। यह संभवतः भविष्य में बदलेगा, क्योंकि हम अंततः libheap और shadow जैसे अन्य हीप विश्लेषण उपकरणों द्वारा उपयोग किए जाने वाले समान डीबग इंजन अमूर्तन को लागू करना चाहेंगे।
यद्यपि libmempool का अधिकांश मूल्य इसके द्वारा उजागर किए गए mpcallback कॉलबैक फ़ंक्शन से आता है, फिर भी कई अंतर्निहित GDB कमांड हैं जिन्हें हम देख सकते हैं।
(gdb) mphelp
[libmempool] mempool commands for gdb
[libmempool] mpheader -v -x <addr> : show chunk contents (-v for verbose, -x for data dump)
[libmempool] mpbinwalk [-v] [-p <addr>] <sz> : walk an mpbin and operate on each chunk in a bin
[libmempool] mpbin <addr> : determine to which bin an mp_header is associated to
[libmempool] mpmstate <addr> : display and cache a mempool mstate address
[libmempool] mphelp
मान लीजिए हम किसी mempool हेडर का पता जानते हैं, तो हम उसके डेटा का विश्लेषण कर सकते हैं। ध्यान दें कि यह mempool हेडर का पता होना चाहिए, न कि कोर आवंटक चंक मेटाडेटा का पता। तो, हम सामग्री को निम्नानुसार डंप कर सकते हैं:
(gdb) mpheader 0x7fffbc1c1ca0
struct mp_header @ 0x7fffbc1c1ca0 {
mh_magic = 0xa11c0123
mh_len = 0x3
mh_refcount = 0x10000
mh_unused = 0x0
mh_fd_link = 0x7fffbc1c19e0 (OK)
mh_bk_link = 0x7ffff7ff7540 (-)
alloc_pc = 0x55555849e260 (-)
free_pc = 0x0 (-)
हम -x का उपयोग करके चंक की हेक्स सामग्री भी डंप कर सकते हैं।
(gdb) mpheader -x 0x7fffbc1c1ca0
struct mp_header @ 0x7fffbc1c1ca0 {
mh_magic = 0xa11c0123
mh_len = 0x3
mh_refcount = 0x10000
mh_unused = 0x0
mh_fd_link = 0x7fffbc1c19e0 (OK)
mh_bk_link = 0x7ffff7ff7540 (-)
alloc_pc = 0x55555849e260 (-)
free_pc = 0x0 (-)
0x3 bytes of chunk data:
0x7fffbc1c1cd0: 0x55 0x04 0x03
Mempools में bins की अवधारणा होती है, जो dlmalloc bins के समान आकार की दोहरी लिंक्ड सूचियाँ होती हैं, लेकिन इनका उपयोग मुक्त चंक्स के बजाय उपयोग में आने वाले चंक्स को ट्रैक करने के लिए किया जाता है।
यह Cisco डिवाइसों पर मेमोरी उपयोग बहीखाता के लिए किया जाता है।
अक्सर आपको एक चंक मिल सकता है जिसमें mempool हेडर होता है, लेकिन आप अभी तक नहीं जानते कि हीप पर mstate संरचना कहाँ रहती है। अपनी स्थिति समझने के लिए, आप mpbin कमांड का उपयोग कर सकते हैं, जो आपको उस mempool bin का पता देगा जिसमें एक उपयोग में आने वाला चंक वर्तमान में रहता है। उदाहरण के लिए:
(gdb) mpbin 0x7fffbc1c1ca0
[libmempool] Found bin start at 0x7ffff7ff7540
[libmempool] Cached new mp_mstate @ 0x7ffff7ff73c0
[libmempool] mp_smallbin[08] - sz: 0x00000040 cnt: 0x00d3, mh_fd_link: 0x7fffbc1c1ca0
यह नोट केवल mstate के mempool भाग की शुरुआत नहीं खोजता, बल्कि इसे कैश भी करता है, और उस विशिष्ट bin को सूचीबद्ध करता है जिसमें चंक मौजूद है। हम
वैकल्पिक रूप से mpbinwalk कमांड का उपयोग इस bin से सभी 0xd3 चंक्स को सूचीबद्ध करने के लिए कर सकते हैं, या केवल एक विशिष्ट संख्या तक:
(gdb) mpbinwalk 0x40
[libmempool] mp_header @ 0x7ffff7ff7540 - mh_len: 0x00000000, alloc_pc: 0x00000000 [BIN HEAD]
[libmempool] mp_header @ 0x7fffbc1c1ca0 - mh_len: 0x00000003, alloc_pc: 0x55555849e260
[libmempool] mp_header @ 0x7fffbc1c19e0 - mh_len: 0x00000003, alloc_pc: 0x55555849e260
[libmempool] mp_header @ 0x7fffbc1c1750 - mh_len: 0x00000003, alloc_pc: 0x55555849e260
[libmempool] mp_header @ 0x7fffbc1bffa0 - mh_len: 0x00000003, alloc_pc: 0x55555849e260
[libmempool] mp_header @ 0x7fffbc1bff60 - mh_len: 0x00000003, alloc_pc: 0x5555584a1288
[libmempool] mp_header @ 0x7fffbc1c0050 - mh_len: 0x00000003, alloc_pc: 0x55555849e260
[...]
अब यदि हम mstate संरचना के पूरे mempool भाग को डंप करना चाहते हैं (अर्थात सभी bins और संबंधित आँकड़े) तो हम mpmstate कमांड का उपयोग कर सकते हैं: