我有一个使用串行通信与外部设备交互的应用程序.该设备的两个版本在实现上有所不同. - >一个由我的团队开发和测试 - >另一个版本由另一个团队开发.由于其他团队离开,我们的团队正在照顾它的维护.有一天,在测试应用程序时,我注意到应用程序在启动时占用了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读取文件信息...完成.|
| 按照未回收的字节数排序......完成.|
| 呼叫链数:3 |
| 被忽略的调用链数:0 |
| 报告的呼叫链数:3 |
| 内部呼叫链的数量:3 |
| 库调用链数:1 |
================================================== =====
|
| 3.1%=在47个分配中分配的33.6 KB垃圾
| |
| | 0X ???????? 在
| |
| | 0x081ef2b6 in
| | 在src/wrapper.c:489
| |
| | <_realloc>中的0x081ef169
| | 在src/wrapper.c:435
| |
| `-----> 0x081ef05c in
| 在src/wrapper.c:318
|
| 0.8%= 8722在35个分配中分配的垃圾字节数
| |
| | 0X ???????? 在
| |
| | 0x081ef134 in
| | 在src/wrapper.c:422
| |
| `-----> 0x081ef05c in
| 在src/wrapper.c:318
|
| 0.1%= 1144 5个分配中分配的垃圾字节数
| |
| | 0X ???????? 在
| |
| | 0x081ef1cb in
| | 在src/wrapper.c:455
| |
| `-----> 0x081ef05c in
| 在src/wrapper.c:318
|
`------------------------------------------------- -----
报告后免费(0x09cb650c)
(这可能发生在静态析构函数中.
链接时将"ccmalloc.o"放在最后(对于gcc)或
在目标文件列表前面.)
报告后免费(0x09cb68f4)
报告后免费(0x09cb68a4)
报告后免费(0x09cb6834)
报告后免费(0x09cb6814)
报告后免费(0x09cb67a4)
报告后免费(0x09cb6784)
报告后免费(0x09cb66cc)
报告后免费(0x09cb66ac)
报告后免费(0x09cb65e4)
报告后免费(0x09cb65c4)
报告后免费(0x09cb653c)
ccmalloc_report()以无效状态调用
我不知道,这意味着什么,它似乎没有表明任何内存泄漏给我?我可能错了.有没有人遇到过这种情况?链接|编辑|删除
如果你没有真正阅读手册或任何实际可用的文档(首页的手册页),Valgrind可能是一个婊子 - 但它们是值得的.
基本上,你可以用--gen-镇压=所有您的应用程序运行Valgrind的开始,然后创建每个块的镇压是从QT本身发起,然后使用抑制文件来阻止这些错误,你应该留下只在您自己的代码中出错.
此外,你可以尝试使用valgrind通过一个alleyoop前端,如果这让你更容易.
还有许多其他工具可用于检测内存泄漏,Linux Journal有关于这些内容的文章:http://www.linuxjournal.com/article/6556
最后,在某些情况下,一些静态分析工具也可以发现内存错误.