HWAddress Temizleyici

Android NDK, NDK r21 ve Android 10 (API düzeyi 29) sürümünden itibaren HWAddress Sanitizer'ı (HWASan olarak da bilinir) destekler. HWASan yalnızca 64 bit Arm cihazlarda kullanılabilir.

HWASan, ASan'a benzer bir bellek hatası algılama aracıdır. HWASan, klasik ASan'a kıyasla:

  • Benzer CPU ek yükü (~2 kat)
  • Benzer kod boyutu ek yükü (%40-50)
  • Çok daha az RAM yükü (%10-35)

HWASan, ASan ile aynı hata grubunu algılar:

  • Yığın ve bellek arabellek taşması veya yetersizliği
  • Heap use after free
  • Yığın kullanımının kapsamı dışında
  • Çift ücretsiz veya vahşi ücretsiz

Ayrıca, HWASan şunları da algılar:

  • İade işleminden sonra Stack kullanımı

Sample App

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

Derle

Uygulamanızın yerel (JNI) kodunu HWAddress Sanitizer ile 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 (Gradle Groovy)

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 içinde aşağıdakileri de kullanabilirsiniz ve CMakeLists.txt dosyasını değiştirmeniz gerekmez:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_SANITIZE=hwaddress"
            }
        }
    }
}

Bu özellik, ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false kullanılırken çalışmaz.

CMake (Gradle Kotlin)

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 içinde aşağıdakileri de kullanabilirsiniz ve CMakeLists.txt dosyasını değiştirmeniz gerekmez:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments += "-DANDROID_SANITIZE=hwaddress"
            }
        }
    }
}

Bu özellik, ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false kullanılırken çalışmaz.

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

Kurulum Talimatları'nı uygulayın.

Android 14 veya daha yeni bir sürüm kullanıyorsanız hata ayıklanabilir 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

Android'in 14'ten eski bir 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. Bellek hatası algılandığında uygulama SIGABRT ile kilitlenir ve logcat'e ayrıntılı bir mesaj yazdırır. Mesajın bir kopyası /data/tombstones altındaki bir dosyada bulunabilir 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)

Bu mesajın ardından, uygulamadaki etkin iş parçacıklarının listesi, yakındaki bellek ayırmalarının etiketleri ve CPU kaydı değerleri gibi ek hata ayıklama bilgileri yer alabilir.

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 donatılmış yürütülebilir dosyalar oluşturup çalıştırabilirsiniz. Yürütülebilir dosyalarınız için ndk-build veya CMake'e yönelik Build bölümünde açıklanan yapılandırmayı kullanabilirsiniz. Çalıştırılabilir 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 emin olun, bunu cihaza gönderin ve ikili dosyanızı çalıştırırken LD_LIBRARY_PATH öğesini STL'yi 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ızda Android 14 veya daha yeni bir sürüm çalışıyorsa bu adımı atlayabilir ve Derleme bölümündeki wrap.sh'yi kullanma talimatlarını uygulayabilirsiniz. Bu bölümü takip edebilir ve wrap.sh kullanma talimatlarını atlayabilirsiniz.

Android 14'ten önce, HWASan uygulamalarının çalışması için Android'in HWASan sürümü gerekir. Desteklenen Pixel cihazlara önceden oluşturulmuş HWASan görüntüleri yükleyebilirsiniz. Derlemeler ci.android.com adresinde mevcuttur. Bu adreste, Flash Build bağlantısını almak istediğiniz derlemenin karesini tıklayabilirsiniz. Bunun için telefonunuzun kod adını bilmeniz gerekir.

Cihaz derlemesi yükleme

Bunun yerine doğrudan flash.android.com adresine gitmek daha kolay olabilir. Çünkü buradaki akış, 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 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.

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

Cihazınız bağlandıktan sonra, derlemeyi yapılandırmak için cihazı tıklayın. Derleme kimliği seçin kutusunda, bağladığınız cihaz için doğru görüntüyü otomatik olarak seçmek üzere aosp-master-with-phones-throttled dalını seçin.

Flaşın yanıp söneceği cihazı seçin Flaş seçeneklerini onaylayın ve cihazı flaşlayın

Cihazınıza yazılım yüklemek için Yükle'yi tıklayın.

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