作者:Jeff Pan
转载请联系作者(kevinjjp@gmail.com)或在下方留言,侵权必究。
四种内存检测方法
1. VS2017 推荐指数:未知
(未使用过)
2. sanitizer1 推荐指数: ★★★★★
- 
    包括address, memory, leak等多种sanitizer检测工具 
- 
    在使用gcc或者clang编译时,加入额外编译选项 "-fsanitize=leak"
- 
    memsanitizer和leaksanitizer只能够在clang中使用 
- 
    能够准确检测出任何memory leak或者error 
- 
    如果需要定位到源文件,需要指定以下环境: (否则只会定位到内存地址) export ASAN_OPTIONS=symbolize=1export ASAN_SYMBOLIZER_PATH=$(which llvm-symbolizer)export MSAN_OPTIONS=symbolize=1export MSAN_SYMBOLIZER_PATH=$(which llvm-symbolizer)export LSAN_OPTIONS=symbolize=1export LSAN_SYMBOLIZER_PATH=$(which llvm-symbolizer)
- 
    优点: 定位准确, 检查全面 
- 
    缺点: 需要重新编译可执行文件 
3. DocMemory2 推荐指数: ★★★☆☆
- windows平台下的内存检测工具
- Usage: docMemory.exe program.exe args
- 优点: 可以对任何可执行文件使用
- 缺点: 定位不一定准确
4. valgrind3 推荐指数: ★★★★☆
- linux平台下的内存检测工具包含多种tool包
    - massif
        - Usage: valgrind --tool=massif ./target args
- 输出: massif.id.out文件, 使用ms_print massif.id.out即可打印出结果
- 作用: 检测runtime时的内存消耗。
- 如果是debug版本的程序,可以直接定位到行。
 
- Usage: 
- memcheck
        - Usage: valgrind --tool=memcheck --leak-check=full ./target args
- 输出:内存泄漏、越界的代码位置
- 作用:检测内存泄漏或者内存越界。
- 如果是debug版本的程序,可以直接定位到行。
- Note:still reacheable部分可以忽略。
- 常见问题:
            - 
                malloc, calloc 与free不配对提前return或者goto使用时,造成possible leak 
- 
                free 多次同一内存free未初始化的内存 
- 
                如果使用了tcmalloc4 代替原始的malloc, 会使得valgrind失效 
 
- 
                
 
- Usage: 
 
- massif
        
- 
    优点: 可以对任何可执行文件使用, 可视化图像显示内存使用 
- 缺点: 常常会有误报, 受编译环境影响较大
总结
工程开发中,在测试阶段,应该在debug版本中强制加入sanitizer选项,以便及时发现内存问题。 对于用户端,应该在上线前,使用第三种检测方式确保没有内存问题。
