Address Sanitizer(ASan)是一个快速的内存错误检测工具。它非常快,只拖慢程序两倍左右(比起Valgrind快多了)。它包括一个编译器instrumentation模块和一个提供malloc()/free()替代项的运行时库。
从gcc 4.8开始,AddressSanitizer成为gcc的一部分。当然,要获得更好的体验,最好使用4.9及以上版本,因为gcc 4.8的AddressSanitizer还不完善,最大的缺点是没有符号信息。
但是,由于经常限于现有测试环境或生产环境的原因,目标程序的ASan版本往往会使用gcc高版本进行编译生成,但是既有环境又是受限于操作系统的低版本,因此需要将高版本的目标程序移植到低版本环境运行时,往往会启动失败,因为缺少相应的库或系统版本太低。这时需要做一些额外的配置。
- 将libasan.so.3库拷贝到目标程序的运行依赖库路径,或直接放置到目标程序同路径下;
- 如果遇到libstdc++.so库版本的问题(符号识别问题),也需要更新目标环境的libstdc++.so库文件。root下执行ll /lib64/libstdc++.so.6,查看软连接指向的版本,如果是6.0.22,则忽略以下操作;并记下该版本文件名称;cp libstdc++.so.6.0.22到/lib64/目录下,重新定位软连接:ln –snf /lib64/libstdc++.so.6.0.22 /lib64/libstdc++.so.6
然后启动目标程序,即可运行成功,这样既不需要再低版本gcc下重新安装asan进行编译,也不需要把目标环境进行逐一升级。
https://www.modb.pro/db/76403