2012-12-24 12 views
12

प्रश्न के अनुसार, मैं getnameinfo द्वारा कुछ मेमोरी लीकिंग में भाग रहा हूं। मैं उबंटू 12.04 (लिनक्स एसवीवी 3.2.0-35-जेनेरिक # 55-उबंटू एसएमपी बुध 5 दिसंबर 17:42:16 यूटीसी 2012 x86_64 x86_64 x86_64 जीएनयू/लिनक्स) जीसीसी संस्करण 4.6.3 के साथ उपयोग कर रहा हूं।
मैं अपने सर्वर को g ++ के साथ निष्पादन योग्य लिंक कर रहा हूं और अब तक वालग्रिंड ने कोई समस्या नहीं दी है। मैंने नेटवर्क नाम और कनेक्टिंग क्लाइंट के पोर्ट को प्रिंट करने के लिए getnameinfo पर एक साधारण कॉल जोड़ा है।
और मैं निम्नलिखित मिल:getnameinfo मेमोरी लीकिंग की पुष्टि है?

 
==4425== 
==4425== HEAP SUMMARY: 
==4425==  in use at exit: 10 bytes in 1 blocks 
==4425== total heap usage: 4,508 allocs, 4,507 frees, 134,939,153 bytes allocated 
==4425== 
==4425== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1 
==4425== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==4425== by 0x50D7D71: strdup (strdup.c:43) 
==4425== by 0x1484B861: ??? 
==4425== by 0x515B871: gethost[email protected]@GLIBC_2.2.5 (getXXbyYY_r.c:256) 
==4425== by 0x5161D06: getnameinfo (getnameinfo.c:223) 
==4425== by 0x404175: solsrv_run (solsrv.c:381) 
==4425== by 0x404DAC: main (main.c:167) 
==4425== 
==4425== LEAK SUMMARY: 
==4425== definitely lost: 10 bytes in 1 blocks 
==4425== indirectly lost: 0 bytes in 0 blocks 
==4425==  possibly lost: 0 bytes in 0 blocks 
==4425== still reachable: 0 bytes in 0 blocks 
==4425==   suppressed: 0 bytes in 0 blocks 
==4425== 
==4425== For counts of detected and suppressed errors, rerun with: -v 
==4425== ERROR SUMMARY: 12 errors from 11 contexts (suppressed: 2 from 2) 

क्या मैं गलत कर रहा हूँ?

struct sockaddr addr; 
socklen_t   addr_sz = sizeof(addr); 
char  host[NI_MAXHOST], 
      serv[NI_MAXSERV]; 
int infd = accept(srv_fd, (struct sockaddr*)&addr, &addr_sz); 
if (infd == -1) { 
    ... manage error on accept ... 
} 
if(getnameinfo((struct sockaddr *)&addr, addr_sz, host, NI_MAXHOST, serv, NI_MAXSERV, NI_NUMERICSERV)) { 
    strncpy(host, "<unknown host>", NI_MAXHOST-1); 
    strncpy(serv, "<unknown port>", NI_MAXSERV-1); 
} 

और वहाँ आप रिसाव ...
मैं पुष्टि कर सकता है, कि रिसाव हो रहा है: के लिए 6 ग्राहकों जुड़े valgrind पाया 60 बाइट्स लीक (
कोड बस इस प्रकार है मुझे लगता है कि ग्राहक एक ही होस्ट से कनेक्ट हो रहे थे, इसलिए यदि यह मेजबान नाम से संबंधित है तो वृद्धि अपेक्षित के रूप में रैखिक है)।
कोई विचार?

चीयर्स

+0

हमेशा स्रोत डाउनलोड कर सकता है और यह देख रहा है कि यह क्या कर रहा है। –

+0

और चूंकि यह खुला स्रोत है, आप स्वयं समस्या को ठीक कर सकते हैं! –

+0

शायद इसे करना होगा :-) – Emanuele

उत्तर

3

अंततः असली रिसाव पाया।

सर्वर सॉकेट से कनेक्ट होने पर name.locallocalhost और/या पूरी तरह से योग्य नाम के बजाय उपयोग करें।
getnameinfo() तब रिसाव होगा।

मैं, 12.04 पर बग पुन: पेश कर सकते हैं 12.10 दोनों और ।
यदि मैं .local निर्दिष्ट नाम पर निर्दिष्ट करता हूं।

चीयर्स

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

  • कोई संबंधित समस्या नहीं^_^