2011-01-06 5 views
6

मैं वास्तव में 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 का उपयोग कर रहा हूं।

क्या कोई इस बग को पुन: उत्पन्न करने में सक्षम है?

धन्यवाद,

एन्टोनिन

+0

मैं किसी भी नहीं दिख रहा है क्या है कि कोड है कि उत्पादन उत्पन्न कर सकता है। शायद आप कोड को बहुत छंटनी कर सकते हैं। –

+0

क्या रिसाव का आकार निर्भर करता है जिस पर आप XML फ़ाइल को पार्स करते हैं? – AShelly

+0

@ हंस पासेंट: मुझे नहीं लगता कि यह कोड ऐसा क्यों कर रहा है, लेकिन यह एक स्वच्छ वातावरण में है। मैं जानना चाहता हूं कि अन्य लोग एक बग की रिपोर्ट करने से पहले पुन: पेश कर सकते हैं या नहीं। –

उत्तर

2

आप शायद इस ऊपर लाने चाहिए libxml2 मेलिंग सूची पर।

http://mail.gnome.org/mailman/listinfo/xml

+0

मैंने इसे libxml2 बगजिला पर रखा है, मैं बस यह जानने के लिए कुछ पोस्ट करना चाहता था कि कोई बग पुन: उत्पन्न करने में सक्षम है या नहीं। –

3

वेब साइट आप (http://xmlsoft.org/threads.html) ऊपर सूचीबद्ध से:

2.4.7 के साथ शुरू, libxml2 बनाता है यह सुनिश्चित करने के लिए प्रावधान है कि समवर्ती धागे समानांतर पार्सिंग अलग-अलग दस्तावेज़ों में सुरक्षित रूप से काम कर सकते हैं।

आपका उदाहरण प्रत्येक थ्रेड के लिए उसी दस्तावेज़ (testdoc.xml) के लिए xmlReadFile का उपयोग करना प्रतीत होता है। यह आगे कहता है:

ध्यान दें कि धागा सुरक्षा से अधिक थ्रेड एक ही दस्तावेज़ साझा करने के लिए सुनिश्चित किया जा सकता है, ताला आवेदन स्तर पर किया जाना चाहिए ...

+0

अद्यतन करने के लिए भूल गया धन्यवाद, आप सही हैं। लेकिन दुख की बात है कि मैं जिस मूल कोड का उपयोग कर रहा हूं, वास्तव में अलग-अलग दस्तावेजों का उपयोग करता हूं, मैंने अपना उदाहरण कोड संशोधित किया (और मेरा प्रश्न संपादित किया) और रिसाव बनी हुई है। –

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

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