Android NDK, HWASan olarak da bilinen HWAddress Sanitizer'ı destekler. NDK r21 ve Android 10 (API düzeyi 29) yüklü. HWASan, yalnızca 64 bit Cihazları etkinleştirin.
HWASan, ASan'a benzer bir bellek hatası algılama aracıdır. Klasiklere kıyasla ASan, HWASan'da:
- Benzer CPU ek yükü (~2x)
- Benzer kod boyutu ek yükü (%40 – %50)
- Çok daha küçük RAM ek yükü (%10 - %35)
HWASan, ASan ile aynı hata grubunu tespit eder:
- Yığın ve yığın arabellek taşması veya yetersizliği
- Boş olduğunda yığın kullanımı
- Kapsam dışında yığın kullanımı
- Çift serbest veya vahşi serbest
Ayrıca HWASan şunları da tespit eder:
- Döndürüldükten sonra yığın kullanımı
Sample App
Örnek uygulama Şunun için derleme varyantının nasıl yapılandırılacağını gösterir: hwasan.
Topluluk
HWAddress Sanitizer ile uygulamanızın yerel (JNI) kodunu oluşturmak için takip etmek için:
ndk-kurum
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 bir sürümle, build.gradle
cihazınızda aşağıdaki bilgileri de kullanabilirsiniz
ve CMakeLists.txt dosyasını değiştirmesi gerekmez:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_SANITIZE=hwaddress"
}
}
}
}
Bu ayar, ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false
kullanılırken çalışmaz.
Android 14 veya daha yeni sürümler: Wrap.sh ekleyin
Android 14 veya sonraki bir sürümü kullanıyorsanız şunları kullanabilirsiniz: debuggable uygulamanızı herhangi bir cihazda çalıştırmak için Wrap.sh komut dosyasını Android destekli bir cihaz. Adımları uygulamayı seçerseniz bu adımı atlayabilirsiniz başlıklı makaleyi inceleyin.
Talimatları uygulayarak
bir Wrap.sh komut dosyası paketleyin
arm64-v8a
için Wrap.sh komut dosyası takip ediliyor.
#!/system/bin/sh
LD_HWASAN=1 exec "$@"
Çalıştır
14'ten eski bir Android sürümünü çalıştırıyorsanız veya Wrap.sh eklemediyseniz komut dosyanızı çalıştırmadan önce Kurulum Talimatları'nı uygulayın.
Uygulamayı her zamanki gibi çalıştırın. Bellek hatası algılandığında uygulama
SIGABRT yazıp logcat'e ayrıntılı bir mesaj yazdırır. İletinin bir kopyası
/data/tombstones
altındaki bir dosyada bulunur ve ş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 ayırmalarının etiketleri ve CPU kayıt değerleri.
HWASan hatası hakkında daha fazla bilgi için HWASan raporlarını anlama bölümüne bakın mesaj.
Komut satırı yürütülebilir dosyaları oluşturma
Android 14 ve sonraki sürümlerde HWASan ile kullanılan yürütülebilir dosyalar derleyip çalıştırabilirsiniz daha yeni. Aşağıdakiler için Build bölümünde açıklanan yapılandırmayı kullanabilirsiniz: ndk-build veya CMake işlevini kullanın. Yürütülebilir dosyaları bir cihaza aktarın çalıştırmalı ve kabuğunu kullanarak normal şekilde çalıştırmalısınız.
libc++ kullanıyorsanız paylaşılan STL'yi kullandığınızdan emin olun ve bunu
içe aktarıldığında LD_LIBRARY_PATH
öğesini içeren dizine
çalıştırmanız gerekir.
Gradle kullanmıyorsanız nereden uygulama oluşturacağınızı öğrenmek için NDK dokümanlarına bakın komut satırını CMake ve ndk-build.
Android 13 veya önceki sürümler: Kurulum
Cihazınız Android 14 veya daha yeni bir sürümü çalıştırıyorsa bu adımı atlayıp Aşağıdaki Derleme bölümünde paketleme.sh'yi kullanma talimatlarını inceleyin. Ayrıca, bu bölümü izleyebilir ve aşağıdaki Wrap.sh parçasını görebilirsiniz.
Android 14'ten önce HWASan uygulamalarının çalışabilmesi için Android'in HWASan yapısına sahip olması gerekir. Önceden oluşturulmuş HWASan resimlerini desteklenen Pixel cihazlara yükleyebilirsiniz. Derlemeler ci.android.com adresinde bulunabilir. Burada Flash Derleme bağlantısı almak istediğiniz derlemeyi seçin. Bu işlem için telefonunuzun kod adını girin.
Doğrudan flash.android.com adresine gitmek daha kolay olabilir çünkü akışı, cihazınızın algılanmasıyla 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 şunu kullanarak bilgisayarınıza bağlayın: USB kablosu. Yeni cihaz ekle'yi tıklayın, iletişim kutusundan cihazınızı seçin ve Bağlan'ı tıklayın.
Bağlandıktan sonra, derlemeyi yapılandırmak için cihazınızı tıklayın.
Derleme kimliği seçin kutusunda aosp-master-with-phones-throttled
öğesini seçin.
sahip olduğunuz cihaz için doğru resmi otomatik olarak seçmesini sağlayan bir dal
bağlı.
Cihazınıza yüklemek için Yükle'yi tıklayın.
Gerekli kurulumla ilgili daha fazla bilgiyi Android Flash Aracı dokümanları. Alternatif olarak Kaynaktan HWASan görüntüsü oluşturma talimatları için AOSP dokümanlarına göz atın.