宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

虽然地址分析器asan )以前是LLVM的特性,但它加入了GCC 4.8,并在GCC 4.9之后加入了对ARM平台的支持。 因此,如果使用GCC 4.8或更高版本的ASAN,则不需要安装第三方库,并且可以通过在编译时指定CFLAGS编译来打开交换机。

1、编译选项1.1 Gcc编译选项# -fsanitize=address :打开内存越界检测

# -fsanitize-recover=address :典型守护进程为了确保稳定性,在发生错误时会继续运行,而不是简单地退出。 要在使用此选项支持内存错误后继续运行程序,必须重叠设置ASAN_OPTIONS=halt_on_error=0。 如果未设置此选项,内存错误将因错误而退出。 此选项支持gcc 6.1/clang 5.0或更高版本)。 使用时关闭halt_on_error

asan _ cflags=-fsanitize=address-fsanitize-recover=address

# -fno-stack-protector :启用堆栈溢出保护

# -fno-omit-frame-pointer :启用堆栈溢出保护

# -fno-var-tracking :缺省选项为-fvar-tracking,其运行速度非常慢

# -g1 :指示最小调试信息,通常调试版本使用-g即-g2

asan _ cflags=-fno-stack-protector-fno-omit-frame-pointer-fno-var-tracking-G1

1.2 Ld链接选项asan _ ldflags=-fsanitize=address-G1

如果使用的是gcc链接,则可以在此处忽略。

2、ASAN运行选项2.1 ASAN_OPTIONS设置ASAN_OPTIONS是Address-Sanitizier的运行选项环境变量。

# halt_on_error=0:检测到存储器错误并继续运行

# detect_leaks=1:有效内存泄漏检测

# malloc_context_size=15 :如果发生内存错误,显示的调用栈的层数为15

# log _ path=/home/xos/asan.log :内存检查问题日志保存文件路径

# suppressions=$SUPP_FILE:掩码打印中的某些内存错误

export asan _ options=halt _ on _ error=0: use _ sigaltstack=03360 detect _ leaks=13360 malloc _ context _ siii

除了上面列出的常规选项外,还有一些选项可以根据实际需要添加。

# detect _ stack _ use _ after _ return=1:检查对释放的堆栈区域的访问

# handle_segv=1:处理段错误; 也可以添加handle_SIGILL=1来处理sigill信号

# quarantine_size=4194304:内存cache可缓存free内存大小4M

asan _ options=$ { asan _ options } 3360 verbosity=0: handle _ segv=1: allow _ user _ segv _ handler=133:

2.2 LSAN_OPTIONS设置LSAN_OPTIONS是LeakSanitizier的执行可选环境变量,LeakSanitizier是ASAN的内存泄漏检测模块,典型的执行选项如下:

# exitcode=0:将内存泄漏结束代码设置为0,默认为内存泄漏结束代码0x16

# use_unaligned=4:4字节对齐

export lsan _ options=exit code=0: use _ unaligned=4

3、总结实际开发环境,gcc版本较低,使用asan进行内存检查时可能需要链接libasan.so库。 其次,平台软件通常在内部实现一组内存操作接口,要使用asan工具,必须将其替换为glibc提供的接口。 在这种情况下,LD_PRELOAD环境变量可以解决这些问题。

export LD _ preload=libasan.so.2: libp relib.so # vos _ malloc– malloc