2011-01-06 2 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). Valgrind сообщает:

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 

Это работает для меня независимо от используемого документа XML. Я использую libxml 2.7.8, в Mac OS X 10.6.5 с gcc 4.4.5.

Может ли кто-нибудь воспроизвести эту ошибку?

Спасибо,

Antonin

+0

Я не вижу никакого кода, который мог бы сгенерировать этот вывод. Возможно, вы слишком много подрезали код. –

+0

Является ли размер утечки зависимым от того, какой XML-файл вы разбираете? – AShelly

+0

@Hans Passant: Я не вижу ни того, почему этот код делает это, но он находится в чистой среде. Я хочу знать, могут ли другие люди воспроизвести это, прежде чем сообщать об ошибке. –

ответ

2

Вы, вероятно, следует довести эту информацию до в списке рассылки libxml2.

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

+0

Я положил его на libxml2 bugzilla, я просто хотел опубликовать здесь что-то, чтобы узнать, способен ли кто-нибудь воспроизвести ошибку. –

3

С веб-сайта вы перечислили выше (http://xmlsoft.org/threads.html):

Начиная с 2.4.7, libxml2 делает положения, гарантирующие, что параллельные потоки могут безопасно работать при параллельном анализе разные документы.

Ваш пример, похоже, использует xmlReadFile для того же документа (testdoc.xml) для каждого потока. Далее говорится:

Обратите внимание, что безопасность потока не может быть обеспечена для нескольких потоков, разделяющих один и тот же документ, фиксирующий должно быть сделано на уровне приложений ...

+0

Спасибо, вы правы. Но, к сожалению, исходный код, над которым я работаю, использует действительно разные документы, я изменил свой примерный код (и отредактировал мой вопрос), и утечка останется. –

Смежные вопросы