一、升级GCC版本
由于GCC自4.8始才开始支持ASAN地址消毒器,但支持得不够完善,功能也不完备,笔者一向尽量使用最新版本,故而此文选择了GCC 10.2.0版本。
建议先至官网 Index of /software/gcc/releases/选择gcc-10.2.0.tar.gz下载。由于不是本文讲述的重点,此处略去GCC编译安装步骤,有兴趣的同学可自行google之。
二、脚本编写
1.增加asan配置选项
1)于srs/auto/options.sh脚本里增加如下代码
1)于srs/auto/setup_variables.sh脚本里增加如下代码
其中本文所使用的ASAN_OPTIONS环境变量为:
export ASAN_OPTIONS=halt_on_error=0:quarantine_size_mb=1024:thread_local_quarantine_size_kb=512:log_path=/mnt/asan.log:alloc_dealloc_mismatch=1:new_delete_type_mismatch=1:detect_stack_use_after_return=1:check_initialization_order=1:handle_segv=1:report_globals=1:sleep_before_dying=5:print_stats=0:strict_init_order=1:detect_invalid_pointer_pairs=2:suppressions=$SUPP_FILE:detect_container_overflow=1:detect_odr_violation=2:verbosity=0:detect_deadlocks=1:color=always:allocator_may_return_null=1:detect_leaks=1:dump_instruction_bytes=1
2) 打开ASAN地址消毒器开关
在CXXFLAGS里打开ASAN地址消毒器开关:-fsanitize=address -fsanitize-recover=address -fno-omit-frame-pointer。最后静态链接libasan.a库配置编译即可。
-fsanitize=address:asan地址消毒器开关;
-fsanitize-recover=address:结合ASAN_OPTIONS环境变量中halt_on_error=0使用,可使得ASAN在检测到内存问题后程序可继续运行,而不崩溃或闪退。
三、编译运行
1)执行configure文件
进入到srs代码根目录,执行source configure --with-asan命令
2)编译
等待configure文件执行完毕后,执行make -j4编译,可以看到已经成功链接了libasan.a静态库,如下图所示:
四、分析检测结果
如上文所示,ASAN_OPTIONS环境变量里配置了log_path=/mnt/asan.log,程序运行过程中如果被ASAN检测到内存问题,变会dump到该文件里,文件命名规则为asan.log.pid,如图:
可以看到ASAN有检测到内存泄漏,接下来就是对比着代码进行分析确认。
ASAN于GCC10.2.0版本上小试牛刀,大功告成!