在 Linux 下排查 C++ 程序内存问题,通常分为几类场景:内存泄漏、内存越界、内存占用高、OOM、性能问题。下面按「工具 + 方法 + 实战思路」系统讲一下。
| 问题 | 典型表现 |
|---|---|
| 内存泄漏 | 进程 RES 持续增长 |
| 内存越界 | 偶发 crash / 数据错乱 |
| 内存占用高 | 启动就大 / 峰值高 |
| OOM | 系统 kill 进程 |
| 碎片问题 | 内存没泄漏但 RSS 不降 |
top
或
ps -o pid,rss,vsz,comm -p <pid>
实时监控:
watch -n 1 ps -o pid,rss,vsz,comm -p <pid>
cat /proc/<pid>/status
关注:
cat /proc/<pid>/maps
看内存映射区域(堆、栈、so)
valgrind --tool=memcheck --leak-check=full ./your_program
优点:
缺点:
适合:
编译时加:
-g -fsanitize=address -fno-omit-frame-pointer
运行:
./your_program
优点:
缺点:
export HEAPPROFILE=/tmp/heap
./your_program
工具:
pprof --pdf your_program heap > heap.pdf
适合:
MALLOC_CONF=prof:true,prof_active:true
jeprof --pdf ./your_program jeprof.* > out.pdf
能检测:
示例错误:
ERROR: AddressSanitizer: heap-buffer-overflow
valgrind --tool=memcheck ./app
gdb ./app core
bt
pmap -x <pid>
cat /proc/<pid>/smaps
看:
使用:
perf record -g -p <pid>
perf report
看内存分配热点函数
✅ 必查点:
new/delete 不匹配std::vector resize 滥用ASan + UBSan
Valgrind
tcmalloc / jemalloc + profiler
你可以告诉我:
我可以直接给你 可执行的排查步骤或脚本。