Android NDK, NDK r21 ve Android 10 (API düzeyi 29) ile birlikte HWASan olarak da bilinen HWAddress Sanitizer'ı destekler. HWASan yalnızca 64 bit Arm cihazlarda kullanılabilir.
HWASan, ASan'a benzer bir bellek hatası algılama aracıdır. Klasik ASan'a kıyasla HWASan'da:
- Benzer CPU yükü (~2x)
- Benzer kod boyutu yükü (%40 - 50)
- Çok daha küçük RAM yükü (%10 - 35)
HWASan, ASan ile aynı hata grubunu algılar:
- Yığın ve yığın arabelleği taşması veya eksikliği
- Ücretsiz kullanımdan sonra yığın kullanımı
- Kapsamın dışında grup kullanımı
- Çift serbest veya serbest serbest
HWASan ayrıca şunları da algılar:
- Döndürülen öğelerin yığın kullanımı
Sample App
Örnek uygulamada, hwasan için derleme varyantının nasıl yapılandırılacağı gösterilmektedir.
Topluluk
Uygulamanızın yerel (JNI) kodunu HWAddress Sanitizer ile derlemek için şunları yapın:
ndk-build
Application.mk
dosyanızda:
APP_STL := c++_shared # Or system, or none, but not c++_static.
APP_CFLAGS := -fsanitize=hwaddress -fno-omit-frame-pointer
APP_LDFLAGS := -fsanitize=hwaddress
CMake
Modülünüzün build.gradle
dosyasında:
android {
defaultConfig {
externalNativeBuild {
cmake {
# Can also use system or none as ANDROID_STL, but not c++_static.
arguments "-DANDROID_STL=c++_shared"
}
}
}
}
CMakeLists.txt dosyanızdaki her hedef için:
target_compile_options(${TARGET} PUBLIC -fsanitize=hwaddress -fno-omit-frame-pointer)
target_link_options(${TARGET} PUBLIC -fsanitize=hwaddress)
NDK 27 veya daha yeni sürümlerde, build.gradle
dosyanızda aşağıdakileri de kullanabilirsiniz ve CMakeLists.txt dosyasını değiştirmeniz gerekmez:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_SANITIZE=hwaddress"
}
}
}
}
Bu yöntem, ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false
kullanıldığında çalışmaz.
Android 14 veya sonraki sürümler: wrap.sh dosyasını ekleyin
Android 14 veya sonraki bir sürümü kullanıyorsanız hata ayıklama yapılabilir uygulamanızı Android destekli herhangi bir cihazda çalıştırmak için wrap.sh komut dosyası kullanabilirsiniz. Kurulum Talimatları'ndaki adımları uygulamayı seçtiyseniz bu adımı atlayabilirsiniz.
arm64-v8a
için aşağıdaki wrap.sh komut dosyasını eklemek üzere wrap.sh komut dosyasını paketleme talimatlarını uygulayın.
#!/system/bin/sh
LD_HWASAN=1 exec "$@"
Çalıştır
14'ten eski bir Android sürümünü kullanıyorsanız veya wrap.sh komut dosyası eklemediyseniz uygulamanızı çalıştırmadan önce Kurulum Talimatlarını uygulayın.
Uygulamayı her zamanki gibi çalıştırın. Bir bellek hatası algılandığında uygulama SIGABRT ile kilitlenir ve logcat'e ayrıntılı bir mesaj yazdırır. İletinin bir kopyasını /data/tombstones
altındaki bir dosyada bulabilirsiniz. İleti şu şekilde görünür:
ERROR: HWAddressSanitizer: tag-mismatch on address 0x0042a0826510 at pc 0x007b24d90a0c
WRITE of size 1 at 0x0042a0826510 tags: 32/3d (ptr/mem) in thread T0
#0 0x7b24d90a08 (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x2a08)
#1 0x7b8f1e4ccc (/apex/com.android.art/lib64/libart.so+0x198ccc)
#2 0x7b8f1db364 (/apex/com.android.art/lib64/libart.so+0x18f364)
#3 0x7b8f2ad8d4 (/apex/com.android.art/lib64/libart.so+0x2618d4)
0x0042a0826510 is located 0 bytes to the right of 16-byte region [0x0042a0826500,0x0042a0826510)
allocated here:
#0 0x7b92a322bc (/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so+0x212bc)
#1 0x7b24d909e0 (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x29e0)
#2 0x7b8f1e4ccc (/apex/com.android.art/lib64/libart.so+0x198ccc)
Mesajın ardından uygulamadaki canlı iş parçacıklarının listesi, yakındaki bellek tahsislerinin etiketleri ve CPU kaydedici değerleri gibi ek hata ayıklama bilgileri gelebilir.
HWASan hata mesajları hakkında daha fazla bilgi için HWASan raporlarını anlama başlıklı makaleyi inceleyin.
Komut satırı yürütülebilir dosyaları oluşturma
Android 14 ve sonraki sürümlerde HWASan ile enstrümante edilmiş yürütülebilir dosyalar derleyebilir ve çalıştırabilirsiniz. ndk-build için Derleme bölümünde açıklanan yapılandırmayla aynı yapılandırmayla veya yürütülebilir dosyalarınız için CMake ile aynı yapılandırmayla derleme yapabilirsiniz. Yürütülebilir dosyaları Android 14 veya sonraki sürümlerin yüklü olduğu bir cihaza aktarın ve kabuğu kullanarak normal şekilde çalıştırın.
libc++ kullanıyorsanız paylaşılan STL'yi kullandığınızdan, cihaza gönderdiğinizden ve ikili dosyanızın çalıştırıldığı sırada LD_LIBRARY_PATH
değerini STL'yi içeren dizine ayarladığınızdan emin olun.
Gradle kullanmıyorsanız CMake ve ndk-build ile komut satırından nasıl derleyeceğinizi öğrenmek için NDK belgelerine bakın.
Android 13 veya önceki sürümler: Kurulum
Cihazınızda Android 14 veya daha yeni bir sürüm yüklüyse bu adımı atlayabilir ve Derleme bölümündeki wrap.sh'yi kullanmayla ilgili talimatları uygulayabilirsiniz. Bu bölümü takip edip wrap.sh'yi kullanma talimatlarını atlayabilirsiniz.
Android 14'ten önce, HWASan uygulamalarının çalışabilmesi için Android'in HWASan derlemesi gerekir. Hazır HWASan resimlerini desteklenen Pixel cihazlara yükleyebilirsiniz. Derlemeler ci.android.com adresinde bulunur. Burada, Flash Derleme bağlantısı almak istediğiniz derlemenin karesini tıklayabilirsiniz. Bunun için telefonunuzun kod adını bilmeniz gerekir.
Bunun yerine doğrudan flash.android.com adresine gitmek daha kolay olabilir. Burada, işlem cihazınızı algılayarak başlar ve yalnızca kullanabileceğiniz derlemeleri gösterir. Aşağıdaki resimlerde bu araçtaki kurulum akışı gösterilmektedir.
Cihazınızda geliştirici modunu etkinleştirin ve bir USB kablosu kullanarak cihazınızı bilgisayarınıza bağlayın. Yeni cihaz ekle'yi tıklayın, iletişim kutusundan cihazınızı seçin ve Bağlan'ı tıklayın.
Cihazınız bağlandıktan sonra derlemeyi yapılandırmak için cihazınızı tıklayın.
Bağlı olduğunuz cihaz için doğru resmin otomatik olarak seçilmesi amacıyla Bir derleme kimliği seçin kutusunda aosp-master-with-phones-throttled
dalını seçin.
Cihazınızı flaşlamak için Yükle'yi tıklayın.
Gerekli kurulum hakkında daha fazla bilgiyi Android Flash Tool dokümanlarından edinebilirsiniz. Alternatif olarak, kaynaktan HWASan resmi oluşturmayla ilgili talimatlar için AOSP dokümanlarını inceleyebilirsiniz.