杭州百度网站建设,2019年开公司做网站可以吗,深圳公司注册中介,黄冈市建设信息网站简介
谷歌有一系列Sanitizer工具#xff0c;可用于排查程序中内存相关的问题。常用的Sanitizer工具包括#xff1a;
Address Sanitizer#xff08;ASan#xff09;#xff1a;用于检测内存使用错误。Leak Sanitizer#xff08;LSan#xff09;#xff1a;用于检测内存…简介
谷歌有一系列Sanitizer工具可用于排查程序中内存相关的问题。常用的Sanitizer工具包括
Address SanitizerASan用于检测内存使用错误。Leak SanitizerLSan用于检测内存泄漏。Thread SanitizerTSan用于检测多线程间的数据竞争和死锁。Memory SanitizerMSan用于检测使用未初始化内存的行为。 本文重点介绍ASan工具的使用。
ASAN工具作用
ASan工具可以检测出程序不可理使用内存的行为主要包括 注ASan内部包含LSan故ASan也可以用来检测内存泄漏相关问题。 ASAN工具原理
在编译时ASan会替换malloc/free接口在程序申请内存时ASan会额外分配一部分内存影子内存来标识改内存的状态在程序使用内存时ASan会额外进行判断确认该内存是否可以被访问并在访问异常时给出错误信息。
ASAN工具安装
ASan已经集成在GCC 4.8中但GCC 4.9及以上版本才支持 Address Sanitizer 的所有功能。 可知当前GCC版本已支持ASan故无须再安装。
ASAN工具使用
GCC编译选项 -fsanitizeaddress开启内存越界检测 -fsanitize-recoveraddress一般后台程序为保证稳定性不能遇到错误就简单退出而是继续运行采用该选项支持内存出错之后程序继续运行需要叠加设置ASAN_OPTIONShalt_on_error0才会生效若未设置此选项则内存出错即报错退出 -fno-stack-protector去使能栈溢出保护 -fno-omit-frame-pointer去使能栈溢出保护 ASAN调试示例
测试示例一
测试程序 1 #include stdio.h2 #include stdlib.h3 #include string.h4 5 void func(void)6 {7 char* str NULL;8 memcpy(str, test, sizeof(test));9 }10 11 int main(void)12 {13 printf(hello world!\n);14 15 func();16 17 return 0;18 }按如下方式编译并执行测试
lxlx-virtual-machine:~/asan$ gcc main.c -fsanitizeaddress -fsanitize-recoveraddress -fno-stack-protector -fno-omit-frame-pointer
lxlx-virtual-machine:~/asan$
lxlx-virtual-machine:~/asan$ ./a.out
hello world!
ASAN:DEADLYSIGNAL6880ERROR: AddressSanitizer: SEGV on unknown address 0x000000000001 (pc 0x7fd7df251255 bp 0x7ffc24aea420 sp 0x7ffc24ae9b88 T0)
6880The signal is caused by a WRITE memory access.
6880Hint: address points to the zero page.#0 0x7fd7df251254 (/lib/x86_64-linux-gnu/libc.so.60xbb254)#1 0x7fd7df6006ce (/usr/lib/x86_64-linux-gnu/libasan.so.40x796ce)#2 0x5637740ca9b1 in func (/home/lx/asan/a.out0x9b1)#3 0x5637740ca9c9 in main (/home/lx/asan/a.out0x9c9)#4 0x7fd7df1b7c86 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.60x21c86)#5 0x5637740ca8a9 in _start (/home/lx/asan/a.out0x8a9)AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/lib/x86_64-linux-gnu/libc.so.60xbb254)
6880ABORTING可知测试结果符合分析预期。
参考
https://blog.csdn.net/qq_15437629/article/details/114440930