HWAddress Temizleyici

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 içe aktarıldığında LD_LIBRARY_PATH öğesini içeren dizine çalıştırmayı deneyin.

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.

Cihaz derlemesini Flash

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.

Yanıp sönecek cihaz algıla Bağlanılacak cihazı seçin

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ı.

Yanıp sönecek cihazı seçin Flaş seçeneklerini onaylayın ve cihazı yanıp söndür

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.