tcmalloc使用注意事项(干货)

程序有内存泄漏,但是tcmalloc生成的log文件没有检测到

1、解决问题现象

LD_PRELOAD=libtcmalloc.so HEAPCHECK=strict HEAPPROFILE=/mnt/log HEAP_PROFILE_ALLOCATION_INTERVAL=10000000 ./a.out &
每隔10s生成一个堆栈文件log.0001.heap
在这里插入图片描述
pprof-symbolize或者pprof,调用带gdb的程序生成文件,pprof-symbolize或者pprof这两个是perl语言写的脚本
./pprof-symbolize --pdf process_gdb ./log/log.0001.heap > 0001.pdf
在这里插入图片描述
Total MB: 141.5这个是通过heap文件统计的所有带堆栈的函数申请的内存
理论上tcmalloc统计到的内存申请如果找不到堆栈调用流程就不写进heap文件
heap profile: 22151: 164249907 [1023784: 406179323] @ heapprofile
164249907 这个是程序统计到的所有申请的内存 > Total MB: 141.5
164249907 这里有一部分是统计到malloc或者new的,但是没有堆栈,所以没有写进heap文件里,只统计到了总的里面
在这里插入图片描述

2、后来意外发现g++编译的可以生成堆栈信息,但是gcc编译的没有,所以只统计到总的内存

readelf -u bin 的gcc和g++编译的文件
发现对比bin文件
g++编译的有栈回溯信息,但是gcc编译的没有
所以用gcc编译的库就找不到堆栈信息,也就没有统计到详细的heap文件里
所以问题就出在编译上,后加gcc编译的时候加上参数-funwind-tables,就可以了,
有了堆栈信息,之后再去执行tcmalloc,发现可以统计到内存调用的堆栈信息了

3、pprof-symbolize修改文件

$main::opt_nodefraction = 0.005;默认统计生成pdf的时候是0.7M,把这个值改成0.01就能统计0.1M以上的堆栈信息了
实际的堆栈信息已经在heap文件里面了,只是pprof-symbolize统计的时候做了个限制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值