मैं वास्तव में libxml2 का उपयोग कर डेटा प्रोसेसिंग कोड पर काम कर रहा हूं। मैं हटाने के लिए असंभव स्मृति रिसाव पर फंस गया हूँ।क्या मुझे libxml2 बग मिला (बहु-थ्रेडेड पार्सिंग में मेमोरी लीक)?
#include <stdlib.h>
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <omp.h>
int main(void)
{
xmlDoc *doc;
int tn;
char fname[32];
omp_set_num_threads(2);
xmlInitParser();
#pragma omp parallel private(doc,tn,fname)
{
tn = omp_get_thread_num();
sprintf(fname,"testdoc%d.xml",tn);
doc = xmlReadFile(fname,NULL,0);
printf("document %s parsed on thread %d (%p)\n",fname,tn,doc);
xmlFreeDoc(doc);
}
xmlCleanupParser();
return EXIT_SUCCESS;
}
रनटाइम पर, उत्पादन होता है:
document testdoc0.xml parsed on thread 0 (0x1005413a0)
document testdoc1.xml parsed on thread 1 (0x1005543c0)
पुष्टि है कि हम वास्तव में बहु सूत्रण है और वह वास्तव में doc
समानांतर क्षेत्र में निजी है यहाँ यह उत्पन्न करने के लिए एक न्यूनतम कोड है। कोई यह देख सकता है कि मैंने libxml2 (http://xmlsoft.org/threads.html) का उपयोग करने के लिए सही ढंग से थ्रेड सुरक्षा निर्देश लागू किए हैं। वेलग्रिंड रिपोर्ट: जो कुछ भी इस्तेमाल किया XML दस्तावेज़
HEAP SUMMARY:
in use at exit: 9,000 bytes in 8 blocks
total heap usage: 956 allocs, 948 frees, 184,464 bytes allocated
968 bytes in 1 blocks are definitely lost in loss record 6 of 8
at 0x1000107AF: malloc (vg_replace_malloc.c:236)
by 0x1000B2590: xmlGetGlobalState (in /opt/local/lib/libxml2.2.dylib)
by 0x1000B1A18: __xmlDefaultSAXHandler (in /opt/local/lib/libxml2.2.dylib)
by 0x100106D18: xmlDefaultSAXHandlerInit (in /opt/local/lib/libxml2.2.dylib)
by 0x100041BE7: xmlInitParserCtxt (in /opt/local/lib/libxml2.2.dylib)
by 0x100042145: xmlNewParserCtxt (in /opt/local/lib/libxml2.2.dylib)
by 0x10004615E: xmlCreateURLParserCtxt (in /opt/local/lib/libxml2.2.dylib)
by 0x10005B56B: xmlReadFile (in /opt/local/lib/libxml2.2.dylib)
by 0x100000E03: main.omp_fn.0 (in ./xtest)
by 0x100028FA3: gomp_thread_start (in /opt/local/lib/gcc44/libgomp.1.dylib)
by 0x1001E8535: _pthread_start (in /usr/lib/libSystem.B.dylib)
by 0x1001E83E8: thread_start (in /usr/lib/libSystem.B.dylib)
LEAK SUMMARY:
definitely lost: 968 bytes in 1 blocks
indirectly lost: 0 bytes in 0 blocks
possibly lost: 0 bytes in 0 blocks
still reachable: 8,032 bytes in 7 blocks
suppressed: 0 bytes in 0 blocks
Reachable blocks (those to which a pointer was found) are not shown.
To see them, rerun with: --leak-check=full --show-reachable=yes
यह मेरे लिए काम कर रहा है। मैं जीबीसी 4.4.5 के साथ मैक ओएस एक्स 10.6.5 पर libxml 2.7.8 का उपयोग कर रहा हूं।
क्या कोई इस बग को पुन: उत्पन्न करने में सक्षम है?
धन्यवाद,
एन्टोनिन
मैं किसी भी नहीं दिख रहा है क्या है कि कोड है कि उत्पादन उत्पन्न कर सकता है। शायद आप कोड को बहुत छंटनी कर सकते हैं। –
क्या रिसाव का आकार निर्भर करता है जिस पर आप XML फ़ाइल को पार्स करते हैं? – AShelly
@ हंस पासेंट: मुझे नहीं लगता कि यह कोड ऐसा क्यों कर रहा है, लेकिन यह एक स्वच्छ वातावरण में है। मैं जानना चाहता हूं कि अन्य लोग एक बग की रिपोर्ट करने से पहले पुन: पेश कर सकते हैं या नहीं। –