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

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

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

但是,我遇到了一个问题——大约一天后,我的程序内存不足。

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

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

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

最佳答案

我的解决方案是:

#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();”你应该打印整个列表(通常它应该是空的,或者填满你期望的内容)。

另一种选择: 你的内存管理变得支离 splinter ,...(upps,Alexey Frunze 就在一秒钟前在评论部分写道。)

伊迪丝:XML

我对 DOM 和 SAX 做了一个评论,我的感觉只是扩展​​这个评论:

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

是 SAX 的优秀候选者。在 DOM 中,整个 XML 将被读取并转换到内存中,如果 本身由不同大小的值构成,这会很快导致内存碎片化。可能会发生,您的操作系统的内存模型将反对分配少量内存。

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

关于c - 如何在非常慢的应用程序中查找内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12672770/

相关文章:

Javascript 内存分析 - IE6

c - 尝试使用递归反向打印链表数据时出现段错误

c - Valgrind 报告太多 malloc

java - 多个消费者引发的Kafka broker内存泄漏

debugging - 减慢 gdb 以重现错误

c++ - 未初始化的值是由堆栈分配创建的 - Qt - C++

valgrind - 我如何在不通过 valgrind 命令选项启动它的情况下对每个 Process 实例进行 valgrind memcheck

在运行时更改库加载顺序(如 LD_PRELOAD 但在执行期间)

c - C 优化编译器 (GCC) 是否能够在不使用 'const' 的情况下检测只读访问的不变值?

c++ - 检测到内存泄漏