linux-多线程内存泄漏问题查找方法

如果可以安装valgrind,建议使用valgrind

多线程情况下,可根据不同线程申请内存的地址分布规律去查找内存泄漏,此方法比较麻烦。

1.执行下面命令检测内存变化存在变动的内存起始地址
while true; do pmap -x $(pidof your_bin) > test1; echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; diff test2 test1; sleep 1; pmap -x $(pidof your_bin) > test2; echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; diff test1 test2; sleep 1; done

2.观察一段时间内是否存在某个地址的内存值一直在增加(第一列值是一次申请的内存大小,第二列是实际使用内存大小,第三列是被修改的内存大小)
3.若某个地址的内存一直在增加,说明这个地址可能存在内存泄漏(一个地址的内存有一个上限,一般是64M,超过后系统会申请新的地址再,新分配内存时会在这个新空间内分配)
4.每个线程申请新内存时都会在不同的内存段内分配直到这个内存段用完会新开辟一个内存段,所以可以根据起始地址的内存变化量定位到具体线程。

5.使用gdb attach到进程后 t 到某一个线程 ,设置除当前线程外的其他线程都锁住
set scheduler-locking on (off 解除锁定)
然后继续运行,观察内存变化,若存在某个地址的内存一直在增加,则说明这个线程在这个地址上内存可能有泄漏
6.使用5的方法遍历检测所有线程,若线程间存在互斥就比较麻烦,只能多遍历几遍发现步骤3中的地址在跑某个线程时有内存变化,说明就是这个线程存在内存泄漏

如果malloc用的不频繁的线程可以试着在malloc那里打断点
b __libc_malloc :给所有线程的malloc打断点
b __libc_malloc thread 线程编号 :给指定线程的malloc打断点

posted on 2022-07-19 17:41  DuoRuaiMi4567  阅读(633)  评论(0编辑  收藏  举报