如何在非常慢的应用程序中找到内存泄漏?

时间:2012-10-01 11:54:53

标签: c memory-leaks valgrind memory-leak-detector

我有一个用C语言编写的程序,它使用Berkeley-Db,glib-2和libxml-2。它是一个搜索索引器,它使NLP具有语法和语义分析,并将概念结构存储在搜索索引中而不是单词中。

但是,我有一个问题 - 大约一天后,我的程序内存不足。

当我尝试在valgrind下运行我的程序时,它在非常缓慢,在我看来,比正常运行慢10倍。

我检查内存泄漏的所有尝试(在valgrind下进行了数周左右)并未显示任何泄漏。

有没有人知道在这种情况下可以帮助我的一些工具?

1 个答案:

答案 0 :(得分:2)

我的解决方案是:

#define malloc(size) mymalloc(size, __FILE__, __FUNCTION__, __LINE__)
... (realloc, calloc, free)

void *mymalloc(size_t size, char *file, char *function, int line)
{
  void *data = malloc(size);
  addList(data, size, file, function, line);
  return data;
}

void myfree(void *data)
{
  removeList(data);
  free(data);
}

void debugalloc()
{
  printList();
}

removeList()将搜索"数据"在全局列表中删除它,或发出警告。使用" debugalloc();"你应该打印整个清单(通常它应该是空的,或者充满了你期望的那样)。

另一个选项: 你的记忆管理变得支离破碎,...(upps,Alexey Frunze在评论部分写了一段时间。)

EDITH :XML

我对DOM和SAX做了评论,我只想扩展这个评论:

<head><data>...</data><data>...</data>......<data>...</data></head>

是SAX的绝佳候选人。在DOM中,整个XML将被读取并转换成存储器,如果&lt;可以很快地导致碎片存储器。数据&gt;本身具有不同大小的值。可能会发生这种情况,你的操作系统的内存模式将会对少量内存进行操作。

使用SAX,您只需将部分数据加载到内存中,并在消耗后立即将其删除。但是,您的实现必须从遍历Document转变为一种具有馈送(&lt; data&gt;)和消费/处理(&lt; / data&gt;)的状态机。