问题标签 [memory-leak-detector]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1381 浏览

c++ - 如何追捕内存泄漏 valgrind 说不存在?

我有一个程序,它接受来自套接字的数据,进行一些质量控制并对其进行其他条件调整,然后将其写入命名管道。我在上面运行了 valgrind 并修复了所有最初存在的内存泄漏。然后,我在一个系统上创建了一个“演示”环境,其中运行了 32 个该程序的实例,每个实例都被提供独特的数据,并且每个都输出到它自己的管道。我们对其进行了测试,一切看起来都很好。然后我尝试通过将数据发送速率提高到荒谬的速率来对其进行压力测试,一开始事情看起来还不错……但是我的程序一直在消耗越来越多的内存,直到我没有剩余资源为止。

我转向 valgrind 并运行完全相同的设置,除了每个程序在 valgrind 中运行时使用泄漏检查 = full。发生了一些奇怪的事情。首先,内存确实泄漏了,但只是到了每个程序都消耗了我 0.9% 的内存的程度(以前最大的内存占用了我 6% 的内存)。随着 valgrind 的运行,程序的 CPU 成本猛增,我现在处于 100% cpu 且平均负载很大,因此可能缺乏可用 CPU 导致程序运行缓慢,以至于泄漏需要很长时间才能显现. 当我尝试停止这些程序时,valgrind 没有显示直接内存泄漏,它显示了一些潜在的内存泄漏,但我检查了它们,我认为它们中的任何一个都不代表真正的内存泄漏;除此之外,当程序消耗超过 100 MB 时,可能的内存泄漏仅显示为几千字节。valgrind 报告的可达(非泄漏)内存也在 KB 范围内,因此 valgrind 似乎认为我的程序正在消耗 Top 所说的它们正在使用的内存的一小部分。

我已经进行了一些其他测试并得到了奇怪的结果。一个程序,即使以我原来的内存泄漏检测速度的三倍运行,似乎从来没有消耗超过 0.9% 的内存,两个程序分别泄漏了 1.9% 和 1.3% 的内存,但没有更多,就好像泄漏的内存量及其泄漏率在某种程度上取决于我的程序一次运行的实例数;这是没有意义的,每个实例都应该 100% 独立于其他实例。

我还发现,如果我运行 32 个实例而只有一个实例在 valgrind 中运行,则 valgrinded 实例(如果我说是的话,那就是一个词!)会泄漏内存,但速度比在 valgrind 之外运行的实例要慢。valgrind 实例仍然会说我没有直接泄漏,并且报告的内存消耗比 Top 显示的要少得多。

对于可能导致此结果的原因,以及为什么 valgrind 拒绝了解内存泄漏,我感到很困惑。我认为它可能是一个外部库,但我并没有真正使用任何外部库;只是基本的 C++ 函数/对象。我还认为可能是写入输出管道的数据快速导致缓冲区无限增长,但是 1)应该有一个这样的缓冲区可以增长的上限,以及 2)一旦内存泄漏,如果我删除数据输入速率为零,内存保持消耗,而不是慢慢下降到合理的数量。

谁能给我一个提示我应该从这里看哪里?我完全不知道为什么内存会这样。

谢谢。

0 投票
1 回答
519 浏览

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

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

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

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

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

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

0 投票
1 回答
415 浏览

c++ - USP10.DLL 中的内存泄漏

我在我的一个应用程序(通过 PINVOKE 使用 C++ dll 的 .NET 应用程序)上运行了调试诊断工具 v1.2,它显示以下警告:

usp10.dll 负责 9.25 MB 的未完成分配。以下是前 2 个内存消耗函数:usp10!MapFullFile+14:9.19 MBytes 的未完成分配。usp10!AllocateCMAPtables+e6:18.50 KB 的未完成分配。

我不知道这个 USP10.DLL 是从哪里来的。谷歌告诉我这是一些渲染 unicode-encoded text 的服务。任何想法为什么我看到这个警告?

0 投票
3 回答
3825 浏览

visual-c++ - `static char THIS_FILE[] = __FILE__;` 有什么意义?

有什么意义static char THIS_FILE[] = __FILE__;

简介:它有什么作用?它从何而来?

MFC 是微软的 Windows 原生类库,有一个DEBUG_NEW宏可以跟踪内存分配和它们发生的位置(在用户代码中)。

为此,VS 向导将以下代码块放入每个 cpp 文件中:(不在头文件中)

并且调试新宏定义为(in afx.h):

整个机器将产生有意义的泄漏检测输出,例如:

那么,又是什么问题呢?

让我感到困惑的是THIS_FILEchar 数组的用途。机器没有意义。如果他们定义DEBUG_NEW为:

他们可以将它放在标题中并完成它,而不是ifdef在每个文件中都有那个块。

那么,有什么意义THIS_FILE呢?

(顺便说一句,这正是 MS 的 CRT 所做的,malloc并且_malloc_dbg调试宏在标头中定义crtdbg.h为:

)

再说一遍,为什么在 MFC 宏中以复杂的方式完成,DEBUG_NEW而简单的方式可以工作(更好)???


更新:哈!我最近注意到 VS2005 向导没有将定义THIS_FILE放入生成的 cpp 文件中。

调查一下,似乎 MS 前段时间决定不再需要它了,afxtempl.h如下定义:

尽管如此,我想问题仍然是一样的,为什么它是必要的。(而且我想当时内存要求的答案是非常有效的。)


0 投票
1 回答
70 浏览

activex - 一旦 firebreath 测试页面 activex 关闭,Leakdetector 就会报告泄漏

我在启用泄漏检测器选项的情况下编译了 Firebreath。该场景正在加载测试页面,单击页面上的链接并关闭选项卡和浏览器。然后泄漏检测器收集所有泄漏,输出在这里

我不能从这个日志中做出正面或反面。是真的泄漏吗?

0 投票
2 回答
54895 浏览

performance - 用于检查内存泄漏的 Perfmon 计数器

我想检查我的服务中的内存泄漏问题。我尝试了以下一组性能计数器。

  1. .NET CLR 内存\# 所有堆中的字节数
  2. .NET CLR 内存\第 2 代堆大小
  3. .NET CLR 内存\# GC 句柄
  4. .NET CLR 内存\# 的固定对象
  5. .NET CLR 内存\# 总提交字节数
  6. .NET CLR 内存\# 总保留字节数
  7. .NET CLR 内存\大对象堆大小

我从这里提到了上面的集合

还参考了以下集合:

  1. 内存/可用字节
  2. 内存/提交的字节
  3. 处理/私有字节
  4. 进程/页面文件字节
  5. 进程/句柄计数

我从这里提到了上面的集合

是否有任何参数/标准或任何其他最佳方法来识别内存泄漏的性能计数器?
有人可以建议我设置一组计数器来检查内存泄漏吗?或以上设置涵盖内存泄漏?

0 投票
1 回答
11874 浏览

python - 使用熊猫数据框的内存泄漏

pandas.DataFrame在多线程代码中使用(实际上是DataFrame被调用的自定义子类Sound)。我注意到我有内存泄漏,因为我的程序的内存使用量逐渐增加超过 1000 万,最终达到我的计算机内存的 ~100% 并崩溃。

我使用objgraph尝试跟踪此泄漏,并发现实例的数量MyDataFrame一直在增加,而它不应该:其run方法中的每个线程都创建一个实例,进行一些计算,将结果保存在一个文件中并退出......所以不应该保留任何引用。

使用objgraph我发现内存中的所有数据帧都有类似的参考图:

在此处输入图像描述

我不知道这是否正常……看起来这就是将我的对象保存在内存中的原因。任何想法,建议,见解?

0 投票
2 回答
5231 浏览

c++ - 有没有人能够在使用共享 DLL 的 Windows 64 位应用程序上集成 tcmalloc?

我有一个 64 位 Visual Studio 2010(单线程)C++ Windows 应用程序,我正在尝试将 tcmalloc 与之集成,并且在使用我们的任何动态链接的 dll 时遇到问题。我将 tcmalloc 链接为静态库。在应用程序开始使用我们共享的 dll 之一之前,tcmalloc 工作得很好。我将解决方案构建为 64 位调试应用程序。所有 dll 与 CRT 库的 C/C++ 调试版本(MSVCP100D.dll 和 MVCR100D.dll)的链接。

下面是失败的代码示例。tcmalloc 被调用来分配所有的内存,但是当 delete 被调用时,应用程序崩溃了。我真的很困惑,因为当我在主可执行文件中创建一个函数并将代码复制到那里时,完全相同的代码可以正常工作。

如果有人对在这种情况下使用 tcmalloc 有任何经验,我将不胜感激您的反馈。这对我来说是个谜。它是 dll 的内存模型问题(不同的堆??)?我不知道。在我看来,他们使用的是同一个堆。

对不起,如果这篇文章太长。我试图提供尽可能多的信息。

谢谢你。

布鲁斯

更新:作为测试,我将崩溃的共享 dll 更改为静态库,并且一切正常,直到应用程序使用不同的 dll。因此,无论出于何种原因,tcmalloc 都需要一些额外的步骤来处理共享 dll。我可以使用 tcmalloc 制作我们所有的 dll 的静态库来进行内存分析,但如果知道还需要做什么才能将共享 dll 与 tcmalloc 一起使用,那真的很高兴。

DLL 头文件方法声明:__declspec(dllexport) static std::string GetExecutablePath();

//.cpp 实现

临时字符串销毁时调用的方法:

在将 tcmalloc 重建为共享 DLL 后,它现在在尝试释放内存时会在不同的地方崩溃。

afxmem.cpp:

dbgheap.c:

0 投票
4 回答
1177 浏览

c++ - C++ 内存泄漏未正确显示

我正在使用_CrtDumpMemoryLeaks(); 从 stdlib.h 和 crtdbg.h 来检测内存泄漏,但我注意到我的代码中有一些奇怪的地方。

如果我做:

但是,如果我这样做:

自从我的程序退出(就在_CrtDumpMemoryLeaks()之后)并且仍然有一个未删除的新字符后,我不应该收到警告吗?

如何检测这些内存泄漏?

另外,使用上面的相同示例,如果我添加代码:

这会从类内部删除新的字符以防止内存泄漏,还是我也应该在charPointer上调用 delete ?

0 投票
1 回答
1348 浏览

c++ - 无法在控制台上看到内存泄漏

我正在使用 Visual Studio 2010,我尝试使用 VC 提供的 CRT 库来解决内存泄漏问题。但我无法在控制台上看到内存泄漏打印输出。代码库:

无法得到原因。