खोज…


वाक्य - विन्यास

  • Valgrind प्रोग्राम-नाम वैकल्पिक-तर्क < परीक्षण इनपुट

टिप्पणियों

Valgrind एक डीबगिंग उपकरण है जिसका उपयोग C प्रोग्राम्स में मेमोरी प्रबंधन के बारे में त्रुटियों के निदान के लिए किया जा सकता है। Valgrind का उपयोग अमान्य सूचक उपयोग जैसी त्रुटियों का पता लगाने के लिए किया जा सकता है, जिसमें आवंटित स्थान को लिखना या पढ़ना या free() कॉल करना शामिल है। इसका उपयोग मेमोरी प्रोफाइलिंग करने वाले कार्यों के माध्यम से अनुप्रयोगों में सुधार के लिए भी किया जा सकता है।

अधिक जानकारी के लिए http://valgrind.org देखें।

वेलग्रिंड चला रहा है

valgrind ./my-program arg1 arg2 < test-input

यह आपका प्रोग्राम चलाएगा और उसके द्वारा किए गए किसी भी आवंटन और डी-आवंटन की रिपोर्ट तैयार करेगा। यह आपको सामान्य त्रुटियों के बारे में भी चेतावनी देगा, जैसे कि असिंचित मेमोरी का उपयोग करना, अजीब जगहों पर डेरेफेरिंग करना, मॉलॉक का उपयोग करके आवंटित ब्लॉकों के अंत को लिखना या मुक्त ब्लॉकों को विफल करना।

झंडे जोड़ना

आप अधिक परीक्षण भी चालू कर सकते हैं, जैसे:

valgrind -q --tool=memcheck --leak-check=yes ./my-program arg1 arg2 < test-input

(कई) विकल्पों के बारे में अधिक जानकारी के लिए Valgrind --help देखें, या आउटपुट का क्या अर्थ है, इसके बारे में विस्तृत जानकारी के लिए http://valgrind.org/ पर प्रलेखन देखें।

बाइट्स खो दिया - मुक्त करने के लिए भूल गया

यहां एक कार्यक्रम है जो मॉलॉक कहता है, लेकिन मुफ्त नहीं:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    char *s;

    s = malloc(26); // the culprint 

    return 0;
}

बिना किसी अतिरिक्त तर्क के, वाल्ग्रिंड इस त्रुटि की तलाश नहीं करेगा।

लेकिन अगर हम --leak-check=yes या --tool=memcheck , तो यह शिकायत करेगा और उन मेमोरी लीक्स के लिए जिम्मेदार लाइनों को प्रदर्शित करेगा यदि प्रोग्राम डिबग मोड में संकलित किया गया था:

$ valgrind -q --leak-check=yes ./missing_free
==4776== 26 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4776==    at 0x4024F20: malloc (vg_replace_malloc.c:236)
==4776==    by 0x80483F8: main (missing_free.c:9)
==4776== 

यदि प्रोग्राम डिबग मोड में संकलित नहीं किया गया है (उदाहरण के लिए GCC में -g ध्वज के साथ) तो यह अभी भी हमें दिखाएगा कि रिसाव संबंधित फ़ंक्शन के संदर्भ में कहां हुआ था, लेकिन लाइनें नहीं।

यह हमें वापस जाने देता है और यह देखता है कि उस पंक्ति में किस ब्लॉक को आवंटित किया गया था और यह देखने के लिए आगे ट्रेस करने का प्रयास करें कि इसे क्यों मुक्त नहीं किया गया था।

Valgrind का उपयोग करते समय अधिकांश सामान्य त्रुटियों का सामना करना पड़ा

Valgrind आपको उस रेखा के साथ प्रदान करता है जिस पर प्रारूप में प्रत्येक पंक्ति के अंत में त्रुटि हुई थी (file.c:line_no) । वाल्ग्रिंड में त्रुटियां संक्षेप में निम्नलिखित हैं:

ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

सबसे आम त्रुटियों में शामिल हैं:

  1. त्रुटियों को पढ़ने / लिखने में अवैध
==8451== Invalid read of size 2
==8451==    at 0x4E7381D: getenv (getenv.c:84)
==8451==    by 0x4EB1559: __libc_message (libc_fatal.c:80)
==8451==    by 0x4F5256B: __fortify_fail (fortify_fail.c:37)
==8451==    by 0x4F5250F: __stack_chk_fail (stack_chk_fail.c:28)
==8451==    by 0x40059C: main (valg.c:10)
==8451==  Address 0x700000007 is not stack'd, malloc'd or (recently) free'd

यह तब होता है जब कोड मेमोरी तक पहुंचना शुरू कर देता है जो प्रोग्राम से संबंधित नहीं है। एक्सेस की गई मेमोरी का आकार भी आपको संकेत देता है कि किस चर का उपयोग किया गया था।

  1. Uninitialized चर का उपयोग
==8795== 1 errors in context 5 of 8:
==8795== Conditional jump or move depends on uninitialised value(s)
==8795==    at 0x4E881AF: vfprintf (vfprintf.c:1631)
==8795==    by 0x4E8F898: printf (printf.c:33)
==8795==    by 0x400548: main (valg.c:7)

त्रुटि के अनुसार, valg.c के main लाइन 7 पर, printf() को कॉल करने के लिए एक uninitialized चर को printf

  1. मेमोरी को अवैध मुक्त करना
==8954== Invalid free() / delete / delete[] / realloc()
==8954==    at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8954==    by 0x4005A8: main (valg.c:10)
==8954==  Address 0x5203040 is 0 bytes inside a block of size 240 free'd
==8954==    at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8954==    by 0x40059C: main (valg.c:9)
==8954==  Block was alloc'd at
==8954==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8954==    by 0x40058C: main (valg.c:7)

वैलग्राइंड के अनुसार, कोड ने अवैध रूप से (दूसरी बार) मेमोरी को valg.c की लाइन 10 पर मुक्त कर दिया, जबकि इसे पहले ही लाइन 9 पर मुक्त कर दिया गया था, और ब्लॉक को लाइन 7 पर मेमोरी आवंटित की गई थी



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow