天天看點

Android native ASAN 排查記憶體洩漏

一、概述

android 對native - c/c++ 的調試和排查是比較難受的一件事。我看周遭做window , linux 甚至ios的調試排查起c的代碼都比較友善。習慣了app開發去熟悉native是各種痛苦,最主要是排查問題上。後續有時間打算整理下native 的錯誤排查使用:address2line,ndk-stack,bugreport。該篇主要想寫下ASAN排查記憶體問題。

ASAN是谷歌的一個項目,支援不少平台:https://github.com/google/sanitizers/wiki/AddressSanitizer 網上blog也很多,講原理的和講搭建的都有。但是跑起來就是各種問題,跑起來直接不能使用的也多。其中比較有效的可以參考這篇blog:

https://blog.csdn.net/taohongtaohuyiwei/article/details/123117882

該篇主要想介紹幾個搭建環境的時候死活跑不通的坑。

二、環境搭建

環境搭建比較簡單,可以直接參見Android官網:https://developer.android.com/ndk/guides/asan?hl=zh-cn 就是搭建出來的大機率沒法使用。

可以參考:[https://blog.csdn.net/taohongtaohuyiwei/article/details/123117882]這篇blog裡的demo

三、Android-ASAN的大坑

3.1、jni jstring傳遞報錯

Android官網打開第一行:

警告:在 Android 11 之後的 AOSP master 中,棄用了 arm64 上的平台開發 ASan,改為使用 HWASan。
           

1、沒錯的谷歌現在推薦64位的使用HWASan ,那問題來了,HWASan要自己刷系統還要是pixel手機。這接入成本就有點大,我沒有pixel手機是以沒法嘗試。

2、使用Android12 和Android13的手機去跑64位的帶ASAN的包,包是可以編譯出來,也可以運作。但是使用JNI 傳參jstring 會報記憶體隻讀直接沒法往下走了【ASAN 是識别到記憶體有問題就會直接crash 然後列印對應堆棧】

3、折中解決:因為手頭上的手機版本都比較高,我們編譯的庫都是arm64的,目前隻想到了使用arm7的so帶asan,使用arm7來排查問題。解決了問題再編譯arm64

【使用android8.0的手機直接跑arm64是可以的】