2012-11-21 16 views
6

हमारे कार्यक्रम में एक कस्टम मेमोरी मैनेजर है, हमारे सभी मॉलोक/फ्री कॉल मेमोरी मैनेजर द्वारा प्रबंधित किए जाते हैं, लेकिन प्रोग्राम के आरंभ में getpwuid() को कॉल किया जाएगा और कुछ में nss_ldap साथ ग्राहकों की मशीन सक्रिय यह libc से malloc कॉल करेंगे नहीं हमारे स्मृति प्रबंधक जो हमारे स्मृति प्रबंधक में किसी त्रुटि की ओर जाता है से, gdb से ढेर रिपोर्ट है:थ्रेड स्थानीय भंडारण के साथ कस्टम मेमोरी मैनेजर

Breakpoint 2, 0x0000003df8cc6eb0 in brk() from /lib64/libc.so.6 
0 0x0000003df8cc6eb0 in brk() from /lib64/libc.so.6 
1 0x0000003df8cc6f72 in sbrk() from /lib64/libc.so.6 
2 0x0000003df8c73d29 in __default_morecore() from /lib64/libc.so.6 
3 0x0000003df8c70090 in _int_malloc() from /lib64/libc.so.6 
4 0x0000003df8c70c9d in malloc() from /lib64/libc.so.6 
5 0x0000003df880fc65 in __tls_get_addr() from /lib64/ld-linux-x86-64.so.2 
6 0x00002aaaae302a7c in _nss_ldap_inc_depth() from /lib64/libnss_ldap.so.2 
7 0x00002aaaae2f91a4 in _nss_ldap_enter() from /lib64/libnss_ldap.so.2 
8 0x00002aaaae2f942c in _nss_ldap_getbyname() from /lib64/libnss_ldap.so.2 
9 0x00002aaaae2f9aa9 in _nss_ldap_getpwuid_r() from /lib64/libnss_ldap.so.2 
10 0x0000003df8c947c5 in [email protected]@GLIBC_2.2.5() from /lib64/libc.so.6 
11 0x0000003df8c9412f in getpwuid() from /lib64/libc.so.6 
12 0x0000000001414be3 in lc_username() 

मैं _nss_ldap_inc_depth के कोड का पता लगाया गया है(), ऐसा लगता है कि __tls_get_addr() को कॉल मिला क्योंकि थ्रेड स्थानीय संग्रहण का उपयोग किया जाता है, मैंने मेमोरी मैनेजर को साझा लाइब्रेरी में बदलने का प्रयास किया है, लेकिन __tls_get_addr() अभी भी libc से malloc को कॉल करता है, मैं इसे कैसे कॉल कर सकता हूं इसके बजाय मेमोरी मैनेजर libc है ??

+2

संपादन को रोलबैक न करें :) – iabdalkader

+0

समस्या जैसा दिखता है 'lc_username()' से उत्पन्न होता है 'क्या आप उस कोड को पोस्ट कर सकते हैं? – iabdalkader

+0

मुझे लगता है कि यह lc_username() की वजह से नहीं है, मैंने getpwuid() को सीधी कॉल की है और उसी परिणाम प्राप्त हुए हैं। – DreamLinuxer

उत्तर

2

आप LD_PRELOAD उपयोग कर सकते हैं (glibc सहित) किसी भी अन्य पुस्तकालय से पहले अपने पुस्तकालय लोड करने के लिए और यह बजाय लिंक कर दिया जाएगा, कुछ की तरह:

$ LD_PRELOAD=/path/to/library/libmymalloc.so /bin/myprog 

वहाँ एक ट्यूटोरियल here से पता चलता है कि यह कैसे काम करता है, तो यह और भी है एक उदाहरण malloc

+0

मैंने एलडी_PRELOAD को आजमाया है, लेकिन यह अभी भी libc से malloc को कॉल करता है :( – DreamLinuxer

+0

मुझे लगता है कि यह काम नहीं करता है __tls_get_addr() – DreamLinuxer

+0

@DreamLinuxer एक साइड नोट के रूप में है, आपको 'getpwuid () 'आपको पुन: प्रवेश संस्करण' getpwuid_r() ' – iabdalkader

0

brk के mmap इंस्ट्रेड का उपयोग करने के लिए आप अपना मेमोरी मैनेजर बदल सकते हैं।

एक प्रक्रिया में brk का केवल एक उपयोगकर्ता हो सकता है। इसलिए यदि आपने सभी कॉल malloc और संबंधित फ़ंक्शंस (calloc, strdup और अधिक) में नहीं बदला है, तो आपको brk का उपयोग नहीं करना चाहिए।

mmap, हालांकि, ऐसी कोई समस्या नहीं है। आपका मेमोरी मैनेजर mmap का उपयोग कर सकता है, और malloc अभी भी समानांतर में काम कर सकता है।

+0

मेमोरी मैनेजर विरासत कोड है, मैं वास्तव में इसे संशोधित नहीं करना चाहता हूं। मैं __tls_get_addr() में malloc को प्रतिस्थापित करके इसे हल करना पसंद करता हूं। – DreamLinuxer

+0

मुझे नहीं लगता कि 'मॉलोक' कॉल को एक-एक करके बदलना एक अच्छा विचार है - आप नए खोज रहे रहेंगे। आपको सभी कॉल को स्वचालित रूप से बदलने का तरीका ढूंढना होगा (वाल्ग्रिंड जैसे कई सॉफ़्टवेयर पैकेज, इसे करें) – ugoren

+0

यह वाल्ग्रिंड में ठीक चलता है जिसका अर्थ है कि मॉलोक कॉल को valgrind @@ " – DreamLinuxer

संबंधित मुद्दे