# 背景
为提高版本的稳定性,在app灰度时做asan测试
其中一个技术点是实现asan的无崩溃检测方案。但按文档操作发现不生效。
正常ASAN的配置方法查看 <https://developer.android.com/ndk/guides/asan>
为了实现asan的无崩溃测试方案,跟着文档开启halt_on_error=0,但是测试中发现
halt_on_error=0不生效,故深入调查。可直接看结论
# 文档的错误说明
阅读文档说明
<https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html>
要开启无崩溃方案,需要在so编译时添加sanitize-recover参数,但文档说默认是打开recover的

<https://github.com/google/sanitizers/wiki/AddressSanitizerFlags>
但是配置这编译参数发现还是有区别
## 不同参数的汇编差异对比
在demo中编译过asan so,看看不同参数的区别
## noasan
没有开启asan工具,测试代码不崩溃,没有插桩,没有主动abort的代码

## asan-recover
demo加了sanitize-recover,发现也会崩溃

这个崩溃和文档说明不符,明明是跳转到__asan_report_load1_noabort函数了,为什么还崩呢。

跟着崩溃堆栈找到就运行了41行,但是我们不应该跑到41行的,因为halt_on_error已经被设置为0了,检查发现是wrap.sh没有打包到apk里,导致值配置失效。
解决了这个问题后后面还崩,反编译看汇编代码

原来写文件失败也会崩
配置正确的路径后-fsanitize-recover=address终于能按正确的逻辑继续跑asan而不崩溃了 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fsanitize=address -fsanitize-recover=address -fno