使用jemalloc检测内存泄露

18 篇文章 0 订阅
文章详细介绍了如何安装jemalloc,包括下载源码、解压、编译和安装,并特别提到要在配置阶段启用-prof选项以生成jeprof工具。接着,它说明了启动程序时需要设置的环境变量,特别是关于libjemalloc.so.2的路径和内存分析参数。最后,文章提到了如何使用jeprof生成内存分配的SVG图形来检测内存泄漏,并处理addr2line错误的建议。
摘要由CSDN通过智能技术生成

一、安装jemalloc

1.1、下载源码

wget https://github.com/jemalloc/jemalloc/archive/refs/tags/5.3.0.tar.gz

1.2、解压源码包

tar -zxv -f 5.3.0.tar.gz

1.3、编译并安装

cd jemalloc-5.3.0
./autogen.sh 在这个文件里面加上-configure后面-enable-prof参数
sudo make
sudo make install

由于要生成jeprof工具,所以要在autogen.sh文件中-configure后面-enable-prof参数

#!/bin/sh
#autogen.sh文件  
for i in autoconf; do
    echo "$i"
    $i
    if [ $? -ne 0 ]; then
        echo "Error $? in $i"
        exit 1
    fi
done

echo "./configure --enable-autogen $@"
./configure --enable-autogen --enable-prof $@ # 在这一行加
if [ $? -ne 0 ]; then
    echo "Error $? in ./configure"
    exit 1
fi

要在执行./autogen.sh之前加上

生成的jeprof工具在jemalloc-5.3.0/bin/文件夹中

二、程序启动准备

需要export两个环境变量,libjemalloc.so.2的绝对路径和jemalloc的参数

export LD_PRELOAD=“/usr/local/lib/libjemalloc.so.2”
export MALLOC_CONF=“prof_leak:true,lg_prof_sample:0,prof:true,prof_prefix:jeprof.out,prof_final:true,lg_prof_interval:30”

这里几个参数的含义分别为:

  • prof_leak:是否打开内存卸扣报告
  • lg_prof_sample:采样内存间隔,即每间隔分配多少内存启动一次采样
  • prof:这个参数在编译的时候就指定了
  • prof_prefix:采样文件名的前缀
  • prof_final:转储最终的内存使用情况
  • lg_prof_interval:每分配多少内存转储一次

更多参数的定义参见这里.

三、程序启动

会生成prof_prefix为前缀的heap文件,例如

jeprof.out.2381114.0.f.heap
jeprof.out.2381113.0.f.heap
jeprof.out.2381112.0.f.heap
jeprof.out.2380859.10.i10.heap
jeprof.out.2380859.11.i11.heap
jeprof.out.2380859.12.i12.heap
jeprof.out.2380859.13.i13.heap
3.1、生成svg

./jemalloc-5.3.0/bin/jeprof --show_bytes --svg ${服务二进制名} ${heap文件名} > out.svg

// 查看两个heap文件的diff
./jemalloc-5.3.0/bin/jeprof --show_bytes --svg 服务二进制名 − − b a s e = {服务二进制名} --base= 服务二进制名base={heap文件名} ${heap文件名} > diff.svg

如果生成svg时,报下面错误

/usr/bin/addr2line: DWARF error: could not find variable specification at offset 5fc4
/usr/bin/addr2line: DWARF error: could not find variable specification at offset 60c0
/usr/bin/addr2line: DWARF error: could not find variable specification at offset 6137

可以在编译的时候将-g换成-pg

生成的图,树上的每个节点代表一个函数,节点数据格式:

  • 函数名 或者 类名+方法名
  • 不包含内部函数调用的内存分配 (百分比)
  • of 包含内部函数调用的内存分配 (百分比) 如果没有内部调用函数则这一项数据不显示

一般程序不需要链接jemalloc源码,只用export LD_PRELOAD环境变量就行,如果有问题,可以将malloc改为jemalloc

cc_binary(
    name = "memory_leak",
    malloc = "@com_github_jemalloc//:jemalloc",
)
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值