菜鸟笔记
提升您的技术认知

linux下内存检测工具:asan-ag真人游戏

linux下内存检测工具:asan

asanaddress-sanitizier早先是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才会生效;若未设置此选项,则内存出错即报错退出

asan_cflags = -fsanitize=address -fsanitize-recover=address

 

# -fno-stack-protector:去使能栈溢出保护

# -fno-omit-frame-pointer:去使能栈溢出保护

# -fno-var-tracking:默认选项为-fvar-tracking,会导致运行非常慢

# -g1:表示最小调试信息,通常debug版本用-g-g2

asan_cflags = -fno-stack-protector -fno-omit-frame-pointer -fno-var-tracking -g1

1.2 ld链接选项

asan_ldflags = -fsanitize=address -g1

如果使用gcc链接,此处可忽略。

2asan运行选项

2.1 asan_options设置

asan_optionsaddress-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=0:detect_leaks=1:malloc_context_size=15:log_path=/home/xos/asan.log:suppressions=$supp_file

 

除了上述常用选项,以下还有一些选项可根据实际需要添加:

# detect_stack_use_after_return=1:检查访问指向已被释放的栈空间

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

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

asan_options=${asan_options}:verbosity=0:handle_segv=1:allow_user_segv_handler=1:detect_stack_use_after_return=1:fast_unwind_on_fatal=1:fast_unwind_on_check=1:fast_unwind_on_malloc=1:quarantine_size=4194304

lsan_optionsleaksanitizier运行选项的环境变量,而leaksanitizierasan内存泄漏检测模块,常用运行选项有:

# exitcode=0:设置内存泄露退出码为0,默认情况内存泄露退出码0x16

# use_unaligned=44字节对齐

export lsan_options=exitcode=0:use_unaligned=4

3、总结

实际开发环境中,可能存在gcc版本低,使用asan做内存检查时,需要链接libasan.so库的情况。其次,平台软件通常都会内部实现一套内存操作接口,为使用asan工具,需要替换成glibc提供的接口。此时,可以通过ld_preload环境变量解决这类问题。

export ld_preload= libasan.so.2:libprelib.so   #vos_malloc --> malloc

ps:
1、安装llvm 3.1以上版本

2、编译参数附加

-fsanitize=address

3、设置环境变量参数

export asan_symbolizer_path=/usr/local/bin/llvm-symbolizer

export asan_options=symbolize=1

4、运行程序,如果出错,addresssanitizer会给出详细的报告.

网站地图