Dr. Memory 是一款 开源、跨平台的内存调试工具,支持 Windows、Linux 和 macOS,能检测:
-
内存泄漏(Memory Leaks)
-
未初始化访问(Uninitialized Reads)
-
越界访问(Out-of-Bounds Accesses)
-
非法内存操作(Invalid Heap Arguments)
安装 Dr. Memory
Windows
-
从 官网下载 安装包(
.msi
)。 -
运行安装程序,并 添加 Dr. Memory 到系统 PATH。
Linux (Ubuntu/Debian)
sudo apt install drmemory
macOS (Homebrew)
brew install drmemory
2. 基本使用方法
(1) 命令行运行
drmemory -- your_program.exe [args]
示例:
drmemory -- ./myapp arg1 arg2
(2) 检测内存泄漏
#include <stdlib.h>
int main() {
int* leak = (int*)malloc(sizeof(int)); // 未释放,内存泄漏
return 0;
}
运行:
drmemory -- ./leak_example
输出:
Error #1: LEAK 4 bytes
# 0 replace_malloc [d:\drmemory\replace\malloc.c:258]
# 1 main [leak_example.cpp:4]
-
LEAK 4 bytes
:泄漏 4 字节内存。 -
调用堆栈:显示泄漏发生在
main()
第 4 行。
检测其他内存错误
(1) 未初始化内存访问
int main() {
int* ptr = (int*)malloc(sizeof(int));
printf("%d", *ptr); // 读取未初始化的内存!
free(ptr);
return 0;
}
输出:
Error #1: UNADDRESSABLE ACCESS
# 0 main [uninit_read.cpp:4]
(2) 越界访问
int main() {
int* arr = (int*)malloc(10 * sizeof(int));
arr[10] = 42; // 越界写入(合法索引是 0-9)
free(arr);
return 0;
}
输出:
Error #1: INVALID HEAP ARGUMENT
# 0 main [out_of_bounds.cpp:3]
(3) 重复释放
int main() {
int* ptr = (int*)malloc(sizeof(int));
free(ptr);
free(ptr); // 重复释放!
return 0;
}
输出:
Error #1: DOUBLE FREE
# 0 main [double_free.cpp:5]
高级用法
(1) 生成报告文件
drmemory --logdir ./logs -- your_program.exe
-
日志会保存在
./logs
目录。
(2) 只检测特定错误类型
drmemory --check_leaks -- your_program.exe # 只检测泄漏
drmemory --check_uninit -- your_program.exe # 只检测未初始化访问
(3) 忽略第三方库的误报
在项目根目录创建 suppress.txt
,添加要忽略的错误:
# 忽略 ntdll.dll 的某些错误
name=ntdll.dll
然后运行:
drmemory --suppress suppress.txt -- your_program.exe
与 Valgrind 对比
功能 | Dr. Memory | Valgrind |
---|---|---|
支持平台 | Windows/Linux/macOS | Linux/macOS |
检测内存泄漏 | ✅ | ✅ |
检测越界访问 | ✅ | ✅ |
检测未初始化 | ✅ | ✅ |
GUI 支持 | ❌ | ❌ |
性能影响 | 较慢(约 10x) | 极慢(约 20x) |
实际案例
案例 1:检测 STL 容器的泄漏
#include <vector>
int main() {
std::vector<int>* vec = new std::vector<int>(); // 未释放
return 0;
}
运行:
drmemory -- ./stl_leak
输出:
Error #1: LEAK 24 bytes
# 0 replace_operator_new [d:\drmemory\replace\new.c:143]
# 1 main [stl_leak.cpp:4]
案例 2:检测 OpenMP 多线程泄漏
#include <omp.h>
#include <stdlib.h>
int main() {
#pragma omp parallel
{
int* ptr = (int*)malloc(sizeof(int)); // 每个线程泄漏 4 字节
}
return 0;
}
运行:
drmemory -- ./omp_leak
输出:
Error #1: LEAK 4 bytes (x8 threads) # 总共泄漏 32 字节
常见问题
Q1: Dr. Memory 不显示源码行号?
-
确保编译时 启用调试信息(
-g
):g++ -g leak_example.cpp -o leak_example
Q2: 如何检测 Release 版本的内存问题?
-
即使优化(
-O2
),Dr. Memory 仍可工作,但行号可能不准确。
Q3: 如何减少性能影响?
-
使用
--quiet
减少输出:drmemory --quiet -- your_program.exe
总结
-
Dr. Memory 是跨平台的内存调试利器,适合检测 泄漏、越界、未初始化访问。
-
Windows 开发者首选(Valgrind 不支持 Windows)。
-
使用方法:
drmemory -- your_program.exe
-
最佳实践:
-
开发阶段:定期用 Dr. Memory 检查内存问题。
-
CI/CD 集成:在自动化测试中运行 Dr. Memory。
-
结合智能指针(
std::unique_ptr
)减少手动内存管理错误。
-
推荐工作流:
# 编译(启用调试信息) g++ -g myapp.cpp -o myapp # 检测内存问题 drmemory -- ./myapp # 生成报告 drmemory --logdir ./logs -- ./myapp