内存常见的bug有:
1 内存泄漏
2 内存管理错误 -- new delete malloc free 使用混乱
3 读取未初始化的内存
4 缓冲区溢出 -- 使用已分配内存之外的内存! 如数组越界情况
常见的工具有:
visual leak detector
purify
valgrind (工具很多)
bound checker
对于 visual leak detector 使用:
在tool -》option -》中的vc++ directories 中加载相应的include 文件,以及lib 文件,之后
在所用的文件加入#include <vld.h> 。当程序运行时,将会有相应的内存泄露信息,以及堆栈信息提示。
并会定位相应的泄露行号。
内存使用剖析
1 先检查内存bug。
2 估计内存使用值。
3 测量内存使用值。
4 判断是否有内存占用较大使用不当。
对于内存使用值检测:
1 简单的任务管理器查看,大概估计,误差大。
2 插桩的方式,通过代码估算使用的内存。(主要是动态的,如数据结构或其他使用的。)
3 使用工具。
工具:
AQtime
massif
等。
以下补充线程的调试。
并行的问题是竞态条件(数据,代码)。
首先调试的话,会改变程序运行的时序。并不能真正反映实情。
方法如下:
(1)使用日志查看,或者插桩打印信息。
(log函数短小精悍,也还是有可能影响竞态条件。加了log,程序没有问题;去掉log,程序随机崩溃。1,可能是log函数问题。2 可能影响竞态条件。)
可用printf之后立马fflush。
(2)在代码中加断言,当本应该成立的断言出错,就可以用找到问题。
(3)注意是否是多cpu 等问题,分别测试单cpu与多cpu。
(4) 使用工具分析。
工具: (以下工具可检测死锁!)
intel 的 Thread cheaker
helgrind ( 开源) -- Valgrind 工具 (很强大!) ---Valgrind简单用法 :http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html