转储内存以查找 C++ 应用程序中的内存泄漏

Posted

技术标签:

【中文标题】转储内存以查找 C++ 应用程序中的内存泄漏【英文标题】:Dump Memory for Finding Memory Leak in C++ Application 【发布时间】:2019-01-15 08:40:37 【问题描述】:

在 linux 中给定一个 active/live 进程,我如何转储内存以分析内存泄漏?

我通常使用 valgrind,但不幸的是,valgrind 使应用程序运行速度非常慢,无法完成与其他服务器上的其他进程的初始化。

post 中的一个尝试答案建议区分 /proc/[PID]/smaps 以定位正在增长的内存区域。

我试过了,差异包含:

+02511000-2eb548000 rw-p 00000000 00:00 0                                 [heap]
+Size:           12206300 kB
+Rss:            12105644 kB
+Pss:            12105644 kB

然后我尝试使用 gdb 附加到实时进程并执行:

(gdb) dump memory ./dump_outputfile.dump 0x02511000 0x2e2548000
./dump_outputfile.dump: Success.

然后,我分离并意识到转储文件是空的,也就是零字节。

我错过了什么吗?

【问题讨论】:

(gdb) dump memory ./dump_outputfile.dump 0x02511000 0x2e2548000 你确定地址吗?您要转储的区域约为 11Gb! 是的,这就是为什么我试图转储并弄清楚发生了什么。既然是 11GB,那么基于转储的情况一定很明显。 如果您转储较小的内存范围,追加什么?只是为了尝试 @bruno 好电话——如果我转储 200MB,它可以工作。谢谢!如果你能找到极限,那就太好了! 好的,所以我取消了我的答案,以加强其他读者的可见性,请在您知道最大尺寸时将其放在答案的备注中。我在 gdb 文档中没有看到限制,你必须做一些尝试 【参考方案1】:

(gdb) 转储内存 ./dump_outputfile.dump 0x02511000 0x2e2548000

你确定地址吗?

您要转储的区域大约是 11Go !

这对 gdb 来说太多了吗?尝试更小的尺寸

当然要检查您是否有足够的可用磁盘空间用于结果

【讨论】:

以上是关于转储内存以查找 C++ 应用程序中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

Valgrind - 打开 Windows 内存转储

如何查找 Java 内存泄漏

如何在eclipse中使用MAT查找内存泄漏

Javascript的内存泄漏分析

使用 VS Code 在 C++ 应用程序中查找内存泄漏

OpenGL VBO 会泄漏内存吗?