【C++】 linux内存分析工具对比小总结,valgrind、gperftools、ASAN

所有工具使用,项目的编译都要 -g,把调试信息带上。

具体每个工具的使用这里就不介绍了,自行查相关资料。

一、启用分析的方法区别:
       valgrind 是外挂方式启动;
       gperftools 也可外挂方式(LD_PRELOAD预载入动态链接库就行,且可用信号量触发分析,所以线上项目可以预挂着);
       ASAN(LSAN)需要重新编译。


二、各工具特点:
valgrind  能检测内存越界、野指针、泄漏等各种内存问题, 大项目速度慢,比较影响测试体验。 内存泄漏要进程关闭时才输出。

gperftools   能检测内存泄漏(进程关闭时),
    另外也可做内存分配的性能分析,可以设置每100M 或每10秒等方式dump heap情况,然后做对比差异, 还可用dot工具导出调用开销分析图(便于定位运行时内存的泄漏,还挺好用的)。     
    它也能做代码性能分析, 可以用信号量触发,截取一段时间做分析,很方便压测时定位具性能问题, 最后可用dot工具导出性能分析图。 (比 g++ 自带的 gprof性能分析方便很多:不用另外编译可外挂式、可中途开启分析,所以不推荐gprof)

ASAN 能做内存越界野指针等问题分析, 还有泄漏的分析(关进程时才输出),   优势是速度快,性能影响不大。   若只做内存泄漏,可以只开LSAN。


三、在几个关注功能上的优劣比较:
大的项目问题:valgrind 太慢,不推荐。  gperftools在分析内存时大的项目也会慢一点 ,不过还过得去。
关于内存泄漏:以上3个工具 都能检测,哪个更好不好说, 要分析运行时内存变化肯定是gperftools好。
关于野指针、越界检测:valgrind和ASAN都可以能打印日志指出哪里分配 哪里释放 哪里又被用到了, gperftools好像tcmalloc 也能检测越界什么不过这边项目没用到过不做评价。
内存检测的影响程序性能:asan影响最小,速度快,只不过要单独开关编译才行。

四、这边项目采用的方案:
所以这边项目基本是 gperftools和asan结合用的, 
一个内部测试服打开ASAN编译的,这样平时如果有内存问题直接就宕机去查问题(关于要不要让它宕,问题比较多,容易影响内部开发测试进度, 后期内存问题比较少出现了,建议开)。 
其他普通用debug或release,也会开-g,  需要时可用  gperftools 分析性能瓶颈或者内存占用大的问题。
 


附:
顺带说一下用过的C++静态代码检测工具:
CppCheck比较有名,不过有些问题不一定能检测出来,有些风格的问题也意义不大,可能这边不太会用或配置。
TscanCode 腾讯出的,比较贴合这边 C++游戏服器一些场景问题,能指出不少代码隐患,比较推荐。
clang 自带的Clang Static Analyzer 也还行,可以每天定时让其编一遍,生成一份网页报告,不过检测出来的问题比较少。
 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值