pre
- 一个古老的windows项目查内存泄漏相关问题
vld windows 安装
- 下载:vld-2.5.1-setup.exe
- 实测 vs2019、vs2022 均可用,注意载入的 lib 是 win32/win64 就好
- 默认目录:
C:\Program Files (x86)\Visual Leak Detector
project 载入:
- c/c++ -> general -> additional include directories:
C:\Program Files (x86)\Visual Leak Detector\include
- c/c++ -> general -> debug information format:
Program Database(/Zi)
- linker -> input -> additional dependencies:
C:\Program Files (x86)\Visual Leak Detector\lib\Win64\vld.lib
- linker -> Debugging -> generate debug info:
(/Debug: Full)
- 注意:如果是在 vs 运行状态下安装 vld,需要重启 vs;否则工程运行会报错找不到
vld.dll
类似的问题
代码修改:
main
函数所在 cpp 文件最上面添加#include <vld.h>
- 如果是使用
stdafx.h
的项目,在stdafx.h
里最前面添加 - 重定向
stdout
到文件,以便查看最后的输出 - 手动开启 vld,这样方便非debug模式显式的关闭 vld
1
2
3
4
5
6
7
8// main 函数开始的地方:
freopen("vld-output.txt", "w", stdout);
// 显式开启vld
VLDEnable();
// main 函数结束的地方
fflush(stdout);
linux 环境还是 libasan/tcmalloc 更好用
libasan
- 物料:gcc 版本自带(高版本)
- makefile 示例: (注意CXXFLAGS, LINKFLAGS都需要带这个参数)
1
2
3ASANFLAGS := -fsanitize=leak -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls
CXXFLAGS += $(ASANFLAGS)
LINKFLAGS += $(ASANFLAGS)
tcmalloc
物料:google gpreftools 工具包
makefile 示例: (注意: 加到最后)
1
LINKFLAGS += -ltcmalloc
tips: 线程数量超过12左右启动会慢
方式1: 直接开, 结束进程后会给出解析heap文件的指令
1
2
3
4
5# 开启
env HEAPCHECK=normal ./memory-leak-test
# 结果
pprof ./memory-leak-test "/tmp/memory-leak-test.23613._main_-end.heap" --stack --inuse_objects --lines --heapcheck --edgefraction=1e-10 --nodefraction=1e-10 --text > tcmalloc-mlt.output.txt方式2: 查运行时泄漏
- 分配内存,占用内存参数都设置的很大,避免自己打heap
- 设置了信号量12打印一次
- 有两个文件了可以对比分析
1
2
3
4
5# 启动
env HEAPCHECK=normal HEAPPROFILE=./mlt.prof HEAP_PROFILE_ALLOCATION_INTERVAL=107374182400 HEAP_PROFILE_INUSE_INTERVAL=1073741824000 HEAPPROFILESIGNAL=12 ./memory-leak-test
# 结果
pprof --text --stack memory-leak-test mlt.prof.0002.heap --base=mlt.prof.0001.heap > tcmalloc-mlt.output.txt
一些常见的内存泄漏问题:(AI 辅助生成)
1 | // ---------------- tips ---------------- |