c++ - 检测C++ Qt组合中的内存泄漏?

标签 c++ linux qt

我有一个使用串行通信与外部设备进行交互的应用程序。该设备有两种版本,其实现方式有所不同。
->一个由我的团队开发和测试
->其他版本由不同的团队提供。
由于其他团队已经离开,我们的团队正在维护它。前几天,在测试应用程序时,我注意到该应用程序在启动时占用了60 Mb的内存,令我感到恐惧的是,它的内存使用量开始以200Kb的块开始增加,在60小时内它的峰值达到了295 Mb,尽管响应速度并未降低和应用程序的使用。我一遍又一遍地测试,并重复了相同的内存使用模式。

该应用程序是在RHEL4上使用C++,Qt 4.2.1编写的。

我使用mtrace检查是否有任何内存泄漏,并且没有显示此类泄漏。然后,我使用了valgrind memcheck工具,但是它给出的消息是隐秘的,不是很确定,它显示了Qt图形元素中的泄漏,经仔细检查可以被拒绝。

我正在确定可以采用哪些其他工具/方法来查明这些内存泄漏的来源(如果有)。
->此外,在更大的范围内,我们如何检测和调试C++ Qt应用程序中的内存泄漏?
->我们如何检查Linux进程使用了​​多少内存?

我曾经使用gnome-system-monitor和top命令来检查应用程序使用的内存,但是我听说上述工具给出的结果不是绝对的。

编辑:

我使用ccmalloc来检测内存泄漏,这是关闭应用程序后得到的错误报告。在应用程序执行期间,没有错误消息。

| ccmalloc报告|

================================================== =====

|共有#个|已分配释放垃圾|

+ ----------- + ------------- + -------------++ --------- ---- +

|字节| 387325257 | 386229435 | 1095822 |

+ ----------- + ------------- + -------------++ --------- ---- +

|分配| 1232496 | 1201351 | 31145 |

+ ------------------------------------------------- ---- +

|支票数量:1 |

|计数:2434332 |

|检索地址的函数名称...完成。 |

|从gdb读取文件信息...完成。 |

|按未回收字节数排序...完成。 |

| call 链数量:3 |

|忽略的 call 链数量:0 |

|报告的 call 链数量:3 |

|内部 call 链数量:3 |

|图书馆电话链式店数:1 |

================================================== =====

|

| 3.1%= 33.6 KB的垃圾在47个分配中分配

| |

| | 0x ????????在

| |

| | 0x081ef2b6 in

| |在src/wrapper.c:489

| |

| | <_realloc>中的0x081ef169

| |在src/wrapper.c:435

| |

| `-----> 0x081ef05c在

|在src/wrapper.c:318

|

| 0.8%= 8722字节的垃圾在35个分配中分配

| |

| | 0x ????????在

| |

| | 0x081ef134英寸

| |在src/wrapper.c:422

| |

| `-----> 0x081ef05c在

|在src/wrapper.c:318

|

| 0.1%= 1144字节的5个分配中分配的垃圾

| |

| | 0x ????????在

| |

| | 0x081ef1cb在

| |在src/wrapper.c:455

| |

| `-----> 0x081ef05c在

|在src/wrapper.c:318

|

`------------------------------------------------- -----

报告后免费(0x09cb650c)

(静态析构函数可能会发生这种情况。

链接时,将“ccmalloc.o”放在末尾(对于gcc)或

在目标文件列表的前面。)

报告后免费(0x09cb68f4)

报告后免费(0x09cb68a4)

报告后免费(0x09cb6834)

报告后免费(0x09cb6814)

报告后免费(0x09cb67a4)

报告后免费(0x09cb6784)

报告后免费(0x09cb66cc)

报告后免费(0x09cb66ac)

报告后免费(0x09cb65e4)

报告后免费(0x09cb65c4)

报告后免费(0x09cb653c)

在无效状态中调用了ccmalloc_report()

我不知道,这意味着什么,这似乎并不表示我有任何内存泄漏?我可能是错的。你们中有人遇到过这种情况吗?
链接|编辑|删除

最佳答案

如果您不真正阅读手册或实际可用的任何文档(入门者的手册页),Valgrind可能是个a子-但是他们值得。

基本上,您可以使用--gen-suppressions = all在应用程序上运行valgrind,然后为源自QT本身的每个块创建抑制,然后使用抑制文件来阻止这些错误,您应该仅包含您自己的代码中的错误。

另外,如果这样会使您更轻松,则可以尝试通过alleyoop前端使用valgrind。

还有许多其他工具可用于检测内存泄漏,Linux Journal在此处提供了有关这些工具的文章:http://www.linuxjournal.com/article/6556

最后,在某些情况下,某些静态分析工具也可以发现内存错误。

关于c++ - 检测C++ Qt组合中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1186379/

相关文章:

c++ - 使用整数转换重载而不是 bool 转换重载

linux - Linux 中的远程 Shell

c - 控制台应用程序中的输入事件循环

c++ - 在 Qt Creator 中更改默认工作目录

c++ - 在 if 语句中需要满足不止一件事才能执行? C++

c++ - GCC如何处理变量重定义

c++ - lli: LLVM 错误: 无法选择: X86ISD::WrapperRIP TargetGlobalTLSAddress:i64

java - 用于编译 Java 代码的库的符号链接(symbolic link)

qt - QNetworkAccessManager 未使用此代码发出完成信号

qt - 如何使用 QPalette 自定义 Qpushbutton 上的文本?