我有一个使用串行通信与外部设备进行交互的应用程序。该设备有两种版本,其实现方式有所不同。
->一个由我的团队开发和测试
->其他版本由不同的团队提供。
由于其他团队已经离开,我们的团队正在维护它。前几天,在测试应用程序时,我注意到该应用程序在启动时占用了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/