2011-01-06 26 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 

私はlibxml 2.7.8、Mac OS X 10.6.5、gcc 4.4.5を使用しています。

誰かがこのバグを再現できますか?

おかげで、あなたは(http://xmlsoft.org/threads.html)上記のWebサイトから

アントニン

+0

そのコードがその出力を生成する可能性はありません。たぶんあなたはあまりにも多くのコードをトリミングしました。 –

+0

リークのサイズは、解析するXMLファイルに依存していますか? – AShelly

+0

@Hans Passant:なぜこのコードがそれをやっているのかわかりませんが、それはきれいな環境です。私は他の人がバグを報告する前にそれを再現できるかどうか知りたい。 –

答えて

2

あなたはおそらくこれを持参してくださいlibxml2メーリングリストにあります。

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

+0

私はlibxml2 bugzillaに載せました。誰かがこのバグを再現できるかどうかを知るためにここに投稿したいと思っています。 –

3

は2.4.7以降では、libxml2の作ります並列スレッドが並行して安全に動作することを確実にするための規定文書。

あなたの例では、各スレッドの同じドキュメント(testdoc.xml)に対してxmlReadFileを使用しているようです。また、さらに状態:

注スレッドの安全性は、同じ文書を共有する複数のスレッドを確保することができないということは、ロックは、アプリケーション・レベルで行われなければならない...

+0

ありがとうございます。しかし、悲しいことに、私が作業している元のコードは本当に別のドキュメントを使用して、私は私のサンプルコードを修正し(そして私の質問を編集した)、リークは残っています。 –

関連する問題