私は実際に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サイトから
アントニン
そのコードがその出力を生成する可能性はありません。たぶんあなたはあまりにも多くのコードをトリミングしました。 –
リークのサイズは、解析するXMLファイルに依存していますか? – AShelly
@Hans Passant:なぜこのコードがそれをやっているのかわかりませんが、それはきれいな環境です。私は他の人がバグを報告する前にそれを再現できるかどうか知りたい。 –