稍高一些的gcc版本都自带asan了,挺方便的
一、编译
在你的makefile(没有makefile就在gcc后面加就行)中添加以下选项并进行编译
LIBS += -lasan
CXXFLAGS += -fsanitize=address -fno-stack-protector -fno-var-tracking -fno-omit-frame-pointer
二、运行
1.如果直接在终端运行 ./程序名 会提示你(不一定相同,但下列步骤是一样的)
==10987==ASan runtime does not come first in initial library list; you should either link runtime to your application or manually preload it with LD_PRELOAD.
2.你可以find / -name "libasan.so"找到动态库路径 (libasan.so名字会随gcc版本改变,我用gcc 10的时候是libasan.so.6)
3.终端输入下列命令
LD_PRELOAD=/usr/lib/gcc/x86_64-linux-gnu/5/libasan.so ./你的程序名
3.1 可能会报错./程序名: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by ./你的程序名) 没有则忽略
3.2 终端输入看有没有需要的GLIBCXX_3.4.26
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
3.3 没有则按以下操作(可直接输3,3不行再1 2 3操作一遍)
sudo rm -rf /var/lib/apt/lists/* -vf
sudo apt-get update
sudo apt-get install libstdc++6
3.4 再按3.2检查有没有
4、asan需要程序正常退出才起作用(我是在主循环中加入exit的判断,用来结束程序)
内存泄露打印会在你运行程序终端打印出来,没有打印表示没检查到问题,每一个错误就是一 个堆栈,很容易找到问题所在