
dlmalloc के लिए हीप विश्लेषण उपकरण
libdlmalloc एक python स्क्रिप्ट है जिसे GDB के साथ उपयोग के लिए डिज़ाइन किया गया है और इसका उपयोग Doug Lea के आवंटक (allocator), जिसे dlmalloc भी कहा जाता है, का विश्लेषण करने के लिए किया जा सकता है। यह वर्तमान में dlmalloc 2.8.x संस्करणों का समर्थन करता है। ध्यान दें कि कुछ भागों का उपयोग GDB से स्वतंत्र रूप से भी किया जा सकता है, उदाहरण के लिए कुछ स्नैपशॉट किए गए हीप मेमोरी का ऑफ़लाइन विश्लेषण करने के लिए।
libdlmalloc हीपों के विश्लेषण के लिए अन्य gdb python स्क्रिप्ट्स से प्रेरित था, जैसे libtalloc, unmask_jemalloc और libheap। कुछ बुनियादी कार्यक्षमता लगभग इन परियोजनाओं के समान है।
libdlmalloc का परीक्षण मुख्य रूप से 32-बिट और 64-बिट Cisco ASA उपकरणों पर किया गया है जो dlmalloc 2.8.3 का उपयोग करते हैं। इसे अन्य 2.8.x संस्करणों के साथ काम करना चाहिए, हालाँकि महत्वपूर्ण अंतरों के कारण यह पुराने रिलीज़, जैसे <= 2.7.x, पर काम नहीं करेगा।
यदि आप किसी विशिष्ट 2.8.x रिलीज़ या किसी विशिष्ट उपकरण पर libdlmalloc का सफलतापूर्वक परीक्षण करते हैं, तो कृपया लेखकों को बताएं और हम दस्तावेज़ों को अपडेट कर देंगे।
स्क्रिप्ट को केवल python3 समर्थन वाले एक अपेक्षाकृत आधुनिक GDB संस्करण की आवश्यकता होती है। हमने मुख्य रूप से python3 पर परीक्षण किया है, इसलिए हमें उम्मीद है कि यह अभी python2.7 पर काम नहीं करेगा।
यदि आप gdb कमांड का उपयोग करना चाहते हैं तो आप उपयोग कर सकते हैं:``` (gdb) source libdlmalloc_28x.py
`dl_helper` वर्ग में अधिकांश मुख्य लॉजिक को तोड़ा गया है, जो आपको सीधे libdlmalloc को आयात करने और GDB सत्र के बाहर कुछ महत्वपूर्ण संरचनाओं तक पहुँचने की सुविधा देता है। यह उपयोगी है यदि आप ऑफ़लाइन चंक/हीप स्नैपशॉट का विश्लेषण करना चाहते हैं।
# उपयोग
अधिकांश कार्यक्षमता 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
आप चंक्स के अंदर भी खोज सकते हैं। आइए 2 चंक्स में इस मान की खोज करें
`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