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)
目标程序运行前需要预加载 libasan.so
1
export LD_PRELOAD=/usr/lib/gcc/aarch64-linux-gnu/7/libasan.so
通过环境变量对 asan 进行配置
1
2
3export 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 输出分析
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 协议 ,转载请注明出处!