AddressSanitizer(簡稱 ASan)是 Google 開發的高效記憶體錯誤檢測工具,類似 Valgrind 但採用編譯期插桩技術。它能檢測:
編譯時加入 -fsanitize=address,編譯器會:
malloc、free、memcpy 等替換為 ASan 版本這使檢測開銷極低(典型 2x 慢down、記憶體 2-3x),遠優於 Valgrind 的 20-50x。
啟用只需添加編譯/鏈接旗標 -fsanitize=address,優化等級建議 -O1 或更高(-O0 會漏報部分錯誤)。
Android 4.2+ 內建 ASan(源碼在 external/compiler-rt/lib/asan)。僅 eng 版預設編譯。使用步驟:
Android.mk 添加 LOCAL_ADDRESS_SANITIZER := truelibasan_preload.so 和 asanwrapper模式一:asanwrapper 啟動
asanwrapper /system/bin/xxx --options
模式二:LD_PRELOAD 注入(通用)
分析 asanwrapper.cc 可見其本質:設置環境變量 LD_PRELOAD=/system/lib/libasan_preload.so 並 execv 目標程式。因此對於 APK,只需在 app_process 的 Android.mk 開啟 ASan,再用 asan_device_setup.sh 配置設備即可。
llvm-symbolizer 或 addr2line 將報錯地址轉為源碼行號__attribute__((no_sanitize_address)) 標註誤報函數,或編寫 .sanitizer_ignore 文件-fsanitize=address,undefined 同時開啟 UBSan(未定義行為檢測)ASan 以「編譯期插桩 + 影子記憶體」實現了極致的性能/檢測力平衡,已成為 C/C++ 專案 CI 流水線的標配。Android 開發者更應善用其系統級整合,徹底消滅記憶體類 Crash。