memory_check_tools

ASan

AddressSanitizer 的缩写。

官方资料:https://github.com/google/sanitizers/wiki/AddressSanitizer

常规用法

分为三步: 1. 添加编译选项,配合-g使用效果更价

1
2
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize=undefined -fsanitize=leak -fsanitize=address -fsanitize-recover=address -lasan")
add_compile_options(-fno-omit-frame-pointer -fsanitize=undefined -fsanitize=leak -fsanitize=address -fsanitize-recover=address -lasan)
支持

  1. 目标程序运行前需要预加载 libasan.so

    1
    export LD_PRELOAD=/usr/lib/gcc/aarch64-linux-gnu/7/libasan.so

  2. 通过环境变量对 asan 进行配置

    1
    2
    3
    export ASAN_OPTIONS=halt_on_error=0   #和-fsanitize-recover=address配合使用,遇到 error 仍然向下执行

    export ASAN_OPTIONS=halt_on_error=0:verbosity=1 #设置多个选项

选项含义

编译选项

官方flag 文档:https://github.com/google/sanitizers/wiki/AddressSanitizerFlags

runtime选项

ASAN_OPTIONS所支持的选项,通过help 查看

1
export ASAN_OPTIONS=help=1    #查看帮助

asan 输出分析

alt text chatgpt: Addressable (可寻址的): 表示可以被访问和修改的内存区域。在这里用 "00" 表示。

Partially addressable (部分可寻址的): 表示只有部分字节可以被访问和修改。在这里用 "01" 到 "07" 表示。

Heap left redzone (堆左侧红区): 在堆分配的内存块的左侧,用于检测堆溢出。标记为 "fa"。

Freed heap region (已释放的堆区域): 表示已经被释放的堆内存。标记为 "fd"。

Stack left redzone (栈左侧红区): 在栈分配的内存块的左侧,用于检测栈溢出。标记为 "f1"。

Stack mid redzone (栈中间红区): 在栈分配的内存块的中间,用于检测栈溢出。标记为 "f2"。

Stack right redzone (栈右侧红区): 在栈分配的内存块的右侧,用于检测栈溢出。标记为 "f3"。

Stack after return (返回后的栈): 用于检测函数返回后对栈的访问。标记为 "f5"。

Stack use after scope (作用域结束后的栈使用): 表示在变量作用域结束后对栈的访问。标记为 "f8"。

Global redzone (全局变量红区): 用于检测对全局变量的溢出。标记为 "f9"。

Global init order (全局变量初始化顺序): 用于检测全局变量的初始化顺序问题。标记为 "f6"。

Poisoned by user (用户引起的中毒): 表示由用户引起的内存污染。标记为 "f7"。

Container overflow (容器溢出): 表示容器类型(比如数组、列表等)的溢出。标记为 "fc"。

Array cookie (数组饼干): 用于检测数组的越界访问。标记为 "ac"。

Intra object redzone (对象内红区): 在对象内部,用于检测对象成员之间的溢出。标记为 "bb"。

ASan internal (ASan 内部): ASan(AddressSanitizer)内部使用的标记。标记为 "fe"。

Left alloca redzone (alloca 左侧红区): 在使用 alloca 函数分配的内存块的左侧,用于检测溢出。标记为 "ca"。

Right alloca redzone (alloca 右侧红区): 在使用 alloca 函数分配的内存块的右侧,用于检测溢出。标记为 "cb"。

Shadow gap (影子间隙): 用于对齐。标记为 "cc"。

valgrind

valgrind --tool=memcheck --trace-children=yes --leak-check=full --show-leak-kinds=all --keep-debuginfo=yes --log-file=leak.log bin_path

源码编译 & 安装

https://www.cnblogs.com/Kingfans/p/16594998.html

执行时问题

  • Ubuntu: valgrind: failed to start tool 'memcheck' for platform 'amd64-linux': No such file or directory

https://stackoverflow.com/questions/64813183/ubuntu-valgrind-failed-to-start-tool-memcheck-for-platform-amd64-linux-no

解决方法: export VALGRIND_LIB="/usr/lib/valgrind"


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!