valgrind是linux下优秀的程序检查工具,优秀软件开发人员必备的瑞士军刀。其有很多工具包可以使用,具体可以参考官方文档和网络其他文章,本文仅限介绍用其进行内存泄漏、内存越界和程序性能优化。
linux centOS 6 下可以通过yum安装valgrind
yum install valgrind
1. 内存泄漏检查和内存越界检查,执行以下命令,其中test为需要检查的程序名
检查程序test需要以-g调试参数编译,才能报告内存问题的准确代码位置。
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --vgdb=no ./test
执行完后,会得到相信的统计结果,主要分4大类:
1. 肯定丢失的内存块统计 【definitely】类
2. 不直接丢失的内存块 【indirectly】类
3. 可能丢失的内存块统计 [possibly]类
4. 怀疑丢失的内存块统计 [suppressed]类
5. 内存Error,也即内存越界或野指针访问行为 [12 errors from 12 contexts], 尤其要注意:invalid write问题,回导致程序运行内存被非法写入,导致不可预知错误。
实际使用的统计摘要如下
==24593== definitely lost: 10 bytes in 1 blocks ==24593== indirectly lost: 0 bytes in 0 blocks ==24593== possibly lost: 0 bytes in 0 blocks ==24593== still reachable: 0 bytes in 0 blocks ==24593== suppressed: 0 bytes in 0 blocksERROR SUMMARY: 12 errors from 12 contexts (suppressed: 4 from 4) 然后根据这几个关键字,搜索打印的相信信息,根据打印的堆栈信息找到代码位置,修改相应的逻辑错误即可,当报错为0时,程序体检通过! 健康的程序输出应该是: ==13247== HEAP SUMMARY: ==13247== in use at exit: 0 bytes in 0 blocks ==13247== total heap usage: 0 allocs, 0 frees, 0 bytes allocated ==13247== ==13247== All heap blocks were freed -- no leaks are possible ==13247== ==13247== For counts of detected and suppressed errors, rerun with: -v ==13247== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 8 from 6) 2. 定位性能问题,进行优化,主要根据是内存分配释放函数的调用次数,多线程加锁函数的调用次数(互斥次数),以及关键耗时函数的调用次数, 可以根据valgrind的调用次数统计来进行问题分析。建议加上第2个参数--separate-threads=yes,对不同线程进行分类输出,运行完毕会为每个线程生成一个统计文件然后分别查看每个线程的运行情况: 生成的线程运行统计文件为当前目录下的callgrind.out.pid-threadid,针对每个线程运行日志,运行以下命令: callgrind_annotate callgrind.out.xxxx-yy 可以得到此线程的性能报告,每个函数在运行期间执行了多少条指令数,实际可归结于函数调用的次数。这样就可以根据情况优化处理逻辑了,比方说减少内存分配释放次数,减少互斥函数调用次数等。 不断修改,不断查询分析报告比较修改前后的调用次数情况,然后结合top命令的cpu占比,进行优化结果确认。valgrind --tool=callgrind --separate-threads=yes ./test