背景

最近的项目代码需要做动态扫描,主要扫描是否存在动态内存申请、释放,以及内存溢出等问题。

系统:Linux(麒麟V10)
平台:aarch64(鲲鹏)

asan下载和安装

rpm包下载

安装gcc编译器时一般是可以一并安装asan工具的。如果所在服务器没有安装asan工具,则可以寻找对应编译器版本的asan的rpm包进行安装。

项目使用的gcc为7.3.0,因此我们在下面的网站找到了7.3.0对应的asan工具rpm包:

https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/base/aarch64/Packages

  • libsasan-7.3.0-20220207.45.ky10.aarch64.rpm
  • libsasan-static-7.3.0-20220207.45.ky10.aarch64.rpm

如果要更高级版本的rpm,可以在上面的地址上寻找。

rpm包安装

下载上面两个rpm包后,直接在rpm包所在路径下执行:

rpm -ivh *.rpm

安装后,在/usr/lib/gcc/aarch64-linux-gnu/7.3.0/下会找到libasan.a。
为啥不找libasan.so呢?因为如果使用动态库,就需要使用环境变量LD_PRELOAD,以确保libasan.so首先被加载。这样会导致设置后执行任何可执行程序都会进行预加载,包括linux指令。会使测试过程举步维艰 … …

因此后面我们使用libasan.a。

编译

必要的编译选项:

  • “-static-libasan -fsanitize=address -fno-onit-frame-pointer”
  • “-g”

环境变量

export ASAN_OPTIONS=halt_on_error=0:detect_leaks=1:log_path=../log/asan_err.log
  • halt_on_error=0 防止执行过程中发现内存问题导致程序中断退出
  • detect_leaks=1 检测内存泄漏
  • log_path=…/log/asan_err.log asan的日志输出到…/log/asan_err.log中

程序退出

使用kill -2(Ctrl+C)退出程序,否则asan无法输出完整的检测结果日志。
程序结束后,即可查看…/log/asan_err.log日志。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐