温馨提示×

centos c++内存泄漏如何排查

小樊
39
2026-10-20 12:57:40
栏目: 编程语言

在 CentOS 上排查 C++ 内存泄漏,常用手段从“快速定位”到“精细分析”有以下几个层次。下面按实战推荐顺序说明。


一、最快方式:用 Valgrind(首选)

1. 安装

yum install -y valgrind

2. 基本用法

valgrind --tool=memcheck --leak-check=full \
         --show-leak-kinds=all \
         --log-file=valgrind.log \
         ./your_program

3. 关注重点

  • definitely lost:确定泄漏
  • indirectly lost:间接泄漏
  • still reachable:程序退出时未释放(未必是 bug)

4. 优点 / 缺点

✅ 不需要改代码
✅ 定位到具体行号
❌ 程序运行慢(5–10 倍)


二、生产环境友好:AddressSanitizer(ASan)

1. 编译时开启

g++ -fsanitize=address -g -O1 -fno-omit-frame-pointer main.cpp -o app

2. 运行

./app

3. 输出示例

==12345==ERROR: AddressSanitizer: leak of 1024 byte(s)
    #0 0x... in malloc
    #1 0x... in main main.cpp:20

✅ 比 Valgrind 快
✅ 定位精准
❌ 需要重新编译


三、查看整体内存变化(先判断是不是泄漏)

1. top / ps

top -p $(pidof your_program)

关注:

  • RES 是否持续增长
  • 不释放 → 疑似泄漏

2. /proc/<pid>/status

cat /proc/$(pidof your_program)/status | grep Vm

四、运行时统计:mtrace(glibc 自带)

1. 代码里启用

#include <mcheck.h>

int main() {
    mtrace();
    // your code
    return 0;
}

2. 运行

export MALLOC_TRACE=mtrace.log
./app

3. 分析

mtrace ./app mtrace.log

✅ 轻量
❌ 只支持 malloc/free


五、第三方内存池 / 框架

如果是:

  • 长期运行服务(daemon)
  • 高频分配释放

可考虑:

  • jemalloc
yum install jemalloc
LD_PRELOAD=/usr/lib64/libjemalloc.so.1 ./app
  • tcmalloc

并可导出内存 profile。


六、常见 C++ 泄漏原因(经验总结)

  1. new 但没 delete
  2. 构造函数抛异常
  3. 容器未清空(vector, map)
  4. 智能指针循环引用(shared_ptr)
  5. 第三方库未释放资源
  6. 全局/静态对象无限增长

七、推荐排查流程(实战)

  1. ✅ top 看内存是否增长
  2. ✅ ASan 本地复现
  3. ✅ Valgrind 精确定位
  4. ✅ 修复后再次验证

如果你愿意,可以:

  • 贴 代码片段
  • 说明是 后台服务 / 短程序
  • 是否 CentOS 7 / 8 / Stream

我可以帮你定制最合适的排查方案。

0 踩