在C++ Qt中检测内存泄漏结合起来了吗?

roc*_*oll 2 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读取文件信息...完成.|

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

| 呼叫链数: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()以无效状态调用

我不知道,这意味着什么,它似乎没有表明任何内存泄漏给我?我可能错了.有没有人遇到过这种情况?链接|编辑|删除

ras*_*ani 5

如果你没有真正阅读手册或任何实际可用的文档(首页的手册页),Valgrind可能是一个婊子 - 但它们是值得的.

基本上,你可以用--gen-镇压=所有您的应用程序运行Valgrind的开始,然后创建每个块的镇压是从QT本身发起,然后使用抑制文件来阻止这些错误,你应该留下只在您自己的代码中出错.

此外,你可以尝试使用valgrind通过一个alleyoop前端,如果这让你更容易.

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

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