2010-05-24 14 views
10

पुस्तकालयों के कुछ सेट को अनदेखा करने के लिए वालग्रिंड को बताना संभव है? विशेष रूप से glibc पुस्तकालय ..क्या मैं वालिग्रिंड ग्लिब पुस्तकालयों को अनदेखा कर सकता हूं?

वास्तविक समस्या: मेरे पास कुछ कोड है जो सामान्य निष्पादन में ठीक चलता है। कोई रिसाव आदि

जब मैं इसे वालग्रिंड के माध्यम से चलाने की कोशिश करता हूं, तो मुझे कोर डंप और प्रोग्राम पुनरारंभ/बंद हो जाता है।

कोर आमतौर पर ग्लिब फ़ंक्शन (आमतौर पर fseek, mutex आदि) को इंगित करता है। मैं समझता हूं कि असंगत glibc/valgrind संस्करण के साथ कुछ समस्या हो सकती है।

मैंने विभिन्न valgrind रिलीज और glibc संस्करणों की कोशिश की लेकिन कोई भाग्य नहीं। कोई सुझाव?

उत्तर

3

हां, वालग्रिंड के suppression system पर देखें।

+0

मुझे लगता है कि वह कुछ ग्लिबैक फ़ंक्शन को न प्रोफाइल करने के लिए वाल्ग्रिंड को बताना चाहता है, न केवल परिणामी आउटपुट को दबाएं। –

+0

@ टिम: बिल्कुल! असल में मैं चाहता हूं कि वे उन्हें अनदेखा करें (सामान्य निष्पादन की तरह उन्हें निष्पादित करें) – Jack

+0

@ जैक - आपको इसके लिए वालग्रिंड आंतरिक के साथ परिचित होना चाहिए। मैं वास्तव में valgrind/valgrind.h पर एक झांक लेने का सुझाव देता हूं, जब तक आप वाल्ग्रिंड से प्राप्त आउटपुट पोस्ट नहीं करते हैं, तब तक कुछ सुझाव देना मुश्किल होता है। –

1

आप शायद इस बारे में Valgrind user's mailing list पर पूछना चाहते हैं (जो बेहद सहायक है)। आप कुछ कॉल से आउटपुट दबा सकते हैं, हालांकि, शोर को दबाने से आप सब कुछ कर रहे हैं। कॉल अभी भी Valgrind के माध्यम से जा रहे हैं।

आपको क्या चाहिए, आप (आदर्श) वेलग्रिंड उचित रूप से glibc साथ मेल खाते हैं याvalgrind/valgrind.h मैक्रो का उपयोग उनके आसपास काम करने के लिए पूरा करने के लिए। उन लोगों का उपयोग करके, हाँ, आप कुछ चीजों को छूने के लिए valgrind बता सकते हैं। मुझे यकीन नहीं है कि कौन सी कॉल बोर्किंग सब कुछ कर रही हैं, हालांकि आप अपने प्रोग्राम में कोड के बिट्स को चलाने के लिए भी चुनिंदा नहीं कर सकते हैं। valgrind/valgrind.h में RUNNING_ON_VALGRIND मैक्रो देखें।

दूसरी चीज जो दिमाग में आती है यह सुनिश्चित करना है कि वालग्रिंड को deal with threads पर सही ढंग से संकलित किया गया हो। ध्यान रखें कि वालग्रिंड के तहत परमाणु संचालन रेसिपी ऑपरेशंस के दौरान आपके प्रोग्राम को क्रैश कर सकता है, जहां अन्यथा यह ठीक से कॉन्फ़िगर नहीं किया जा सकता है।

यदि आप valgrind और glibc के संस्करणों को स्वैप कर रहे हैं, तो आपको एक मैच मिला है, लेकिन बिल्ड समय पर गलत तरीके से कॉन्फ़िगर किया गया है।

4

जैसा कि अनचाहे द्वारा देखा गया है, वाल्ग्रिंड के पास कौन सी प्रक्रियाओं का साधन है और कैसे नियंत्रित किया जाता है, इसे नियंत्रित करने के लिए एक विस्तृत तंत्र है। लेकिन दोनों valgrind और glibc जटिल जानवर हैं, और आप वास्तव में, वास्तव में, वास्तव में ऐसा नहीं करना चाहते हैं। एक glibc और valgrind को पारस्परिक रूप से संगत करने का आसान तरीका आपकी पसंद के लिनक्स डिस्ट्रो से दोनों को प्राप्त करें। चीजें "बस काम करें", और यदि वे नहीं करते हैं, तो आपके पास शिकायत करने के लिए कोई है।

6

यह शायद आपके प्रश्न का उत्तर नहीं है, लेकिन आप कैसे कुछ त्रुटियों को दबाने के लिए की बारीकियों (जो दूसरों के लिए alluded है, लेकिन विस्तार से वर्णन किया है) प्रदान करेगा:

पहले, चलाने valgrind इस प्रकार है:

valgrind --gen-suppressions=all --log-file=valgrind.out ./a.out 

अब आउटपुट फ़ाइल valgrind.out निम्नलिखित की तरह कुछ स्वचालित रूप से बना दमन ब्लॉक में शामिल होंगे:

{ 
    stupid sendmsg bug: http://sourceware.org/bugzilla/show_bug.cgi?id=14687 
    Memcheck:Param 
    sendmsg(mmsg[0].msg_hdr) 
    fun:sendmmsg 
    obj:/usr/lib/libresolv-2.17.so 
    fun:__libc_res_nquery 
    obj:/usr/lib/libresolv-2.17.so 
    fun:__libc_res_nsearch 
    fun:_nss_dns_gethostbyname4_r 
    fun:gaih_inet 
    fun:getaddrinfo 
    fun:get_socket_fd 
    fun:main 
} 

जहां "बेवकूफ प्रेषण बग" और लिंक वह नाम है जिसे मैंने इस ब्लॉक के संदर्भ में जोड़ा है।अब, sendmsg.supp है कि ब्लॉक बचाने के लिए और बता valgrind अगले रन पर उस फ़ाइल के बारे में:

valgrind --log-file=valgrind --suppressions=sendmsg.supp ./a.out 

और valgrind कृपा है कि बेवकूफ अपस्ट्रीम बग ध्यान नहीं देगा।

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

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