HWAddress Temizleyici

Android NDK, NDK r21 ve Android 10 (API düzeyi 29) ile başlayan, HWASan olarak da bilinen HWAddress Sanitizer'ı destekler. HWASan yalnızca 64 bit Kol cihazlarında kullanılabilir.

HWASan, ASan'a benzer bir bellek hatası algılama aracıdır. Klasik Asan ile karşılaştırıldığında HWASan'ın özellikleri:

  • 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 arabelleği taşması veya alt akış
  • Ücretsiz sonrasında yığın kullanımı
  • Kapsam dışında yığın kullanımı
  • Çift ücretsiz veya vahşi

Ayrıca, HWASan şunları da tespit eder:

  • İadeden sonra grup kullanımı

Sample App

Örnek uygulama, Hvasan için bir derleme varyantının nasıl yapılandırılacağını göstermektedir.

Topluluk

HWAddress Sanitizer ile uygulamanızın yerel (JNI) kodunu oluşturmak için aşağıdakileri 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 bir hedef için:

target_compile_options(${TARGET} PUBLIC -fsanitize=hwaddress -fno-omit-frame-pointer)
target_link_options(${TARGET} PUBLIC -fsanitize=hwaddress)

Android 14 veya sonraki sürümler: wrap.sh dosyasını ekleyin

Android 14 veya daha yeni bir sürümü çalıştırıyorsanız debuggable uygulamanızı Android destekli herhangi bir cihazda çalıştırmak için wrap.sh komut dosyası kullanabilirsiniz. Kurulum Talimatları'ndaki adımları uygulamayı seçerseniz 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

Android 14'ten eski bir sürümü çalıştırı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. Mesajın kopyası /data/tombstones altındaki bir dosyada bulunabilir. Bu kopya aşağıdaki gibi 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)

Bu mesajın ardından uygulamadaki canlı iş parçacıklarının listesi, yakındaki bellek tahsislerinin etiketleri ve CPU kayıt değerleri gibi ek hata ayıklama bilgileri gösterilebilir.

HWASan hata mesajları hakkında daha fazla bilgi edinmek için HWASan raporlarını anlama sayfasına göz atın.

Komut satırı yürütülebilir dosyaları derleme

Android 14 ve daha yeni sürümlerde HWASan ile desteklenen yürütülebilir dosyalar derleyip çalıştırabilirsiniz. Yürütülebilir dosyalarınız için Build (Derleme) veya CMake (Uygulama) bölümünde açıklananlarla aynı yapılandırmayı kullanabilirsiniz. Yürütülebilir dosyaları Android 14 veya daha yeni sürümleri çalıştıran bir cihaza aktarın ve kabuğu kullanarak dosyayı normal şekilde çalıştırın.

libc++ kullanıyorsanız paylaşılan STL'yi kullandığınızdan ve bunu cihaza aktardığınızdan emin olun ve ikili programınızı çalıştırırken LD_LIBRARY_PATH öğesini içeren dizine ayarlayın.

Gradle kullanmıyorsanız CMake ve ndk-build ile komut satırından nasıl derleme yapacağınızı öğrenmek için NDK belgelerine bakın.

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ı atlayabilir ve aşağıdaki Derleme bölümünde wrap.sh'i kullanma talimatlarını uygulayabilirsiniz. Ayrıca bu bölümü izleyip aşağıdakiwrap.sh'i kullanma talimatlarını atlayabilirsiniz.

HWASan, Android 14'ten önceki uygulamaları çalıştırmak için HWASan Android derlemesine ihtiyaç duyar. Önceden oluşturulmuş HWASan görüntülerini, desteklenen Pixel cihazlara yükleyebilirsiniz. Derlemeler ci.android.com adresinde bulunabilir. Burada, Flash Derlemesi bağlantısı almak istediğiniz tam derlemeye ait kareyi tıklayabilirsiniz. Bunun için telefonunuzun kod adını bilmeniz gerekir.

Flash cihaz derlemesi

Bunun yerine doğrudan flash.android.com adresine gitmek daha kolay olabilir çünkü orada 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 USB kablosuyla 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.

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

Bağlandıktan sonra, derlemeyi yapılandırmak için cihazı tıklayın. Select a build ID (Derleme kimliği seçin) kutusunda, bağladığınız cihaz için doğru resmi otomatik olarak seçmek üzere aosp-master-with-phones-throttled dalını seçin.

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

Cihazınızı yüklemek için Yükle'yi tıklayın.

Gerekli kurulum hakkında daha ayrıntılı bilgiyi Android Flash Aracı dokümanlarında bulabilirsiniz. Alternatif olarak, kaynaktan HWASan görüntüsü oluşturma talimatları için AOSP dokümanlarına bakabilirsiniz.