Adres Temizleyici'yi kullanarak Bellek Bozulması Hatalarını Ayıklama

Bu dokümanda, AGDE. Bu araçlar, teşhis edilmesi zor bellek konusunda yardımcı olabilir bozulmalarına ve üzerine yazmalarına yardımcı olur.

HWAddress Temizleyici ve Adres Temizleyici

HWAddress Sanitizer (HWASan) ve Address Sanitizer (ASan), kullandığınız bellek bozulması hata ayıklama araçlarını bellek bozulması için hata ayıklamaya yardımcı olabilir ve takip etmek için:

  • Yığın arabelleğinde taşmalar ve alt akışlar
  • Yığın arabelleğinde taşma ve düşüş
  • Yığın kullanımı kapsamı dışında
  • Çift serbest ve vahşi ücretsiz hatalar
  • Döndürüldükten sonra yığın kullanımı (yalnızca HWASan)
ziyaret edin.

HWASan veya ASan'ı yalnızca bir sorunu ayıklarken veya otomatik testin bir parçasıdır. Bu araçlar yüksek performans gösterse de kullanımları cezaya tabi olur.

Çalışma zamanı davranışı

Etkinleştirildiğinde hem HWASan hem de ASan, en az 24 saat uzunluğunda olabilir.

Bellek hatası algılanırsa uygulama SIGBART (sinyal iptali) ile kilitlenir. hatası verir ve logcat'e ayrıntılı bir ileti yazdırır. İletinin bir kopyası /data/tombstones altındaki bir dosyaya da yazıldığından emin olun.

Hata mesajı şuna benzer:

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)

Ön koşullar

Android OS'in HWASan derlemesini yükleyin

HWASan'ı kullanmak için şuradaki Kurulum talimatlarını uygulayın: Google için Android OS'in HWASan derlemesini yüklemeyle ilgili HWASan dokümanları Pixel cihazlar.

Diğer cihazlar için üretici firmaya başvurarak (varsa) işletim sistemini veya yalnızca yazılım ASan aracını kullanın.

Projenizde paylaşılan C++ Standart Kitaplığı'nı kullanın

Bilinen bir sorun nedeniyle ASan, aşağıdaki durumlarda C++ istisna işlemeyle uyumlu değildir: libc++_static kullanılıyor. libc++_shared kullanılırken bu sorun görülmez.

HWASan, kendi new ve delete operatörlerini uygulamıştır. Ancak standart kitaplık projeye statik olarak bağlıysa kullanılır.

Bu ayarı değiştirmek için C++ Standart Kitaplığını bağlama başlıklı makaleye bakın. başlıklı bölüme bakın.

Çerçeve İşaretçisi oluşturmayı etkinleştir

HWASan ve ASan, yığın izleme (stack trace) oluşturmak için hızlı kare işaretçisine dayalı bir açıcı kullanır bilgileri içerir. Bu, sizin için bunları kullanmak için C++ derleyici ayarlarınızda çerçeve işaretçisi oluşturma işlevini etkinleştirmelisiniz özellikleri. Yani kare işaretçisinin atlanması optimizasyonunu devre dışı bırakmanız gerekir.

Bu ayarı değiştirmek için bkz. Çerçeve İşaretçisini Etkinleştirme oluşturma bölümüne bakın.

Visual Studio projenizi HWASan veya ASan kullanacak şekilde yapılandırma

HWASan veya ASan'ı etkinleştirme

HWASan veya ASan'ı etkinleştirmek için Yapılandırma Özellikleri > Genel Projenizin Mülk Sayfaları.

Geçerli
belirler.

Şekil 1: Visual Studio Çözümü'nde projenin Özellikler seçeneği Gezgin penceresi.

Genel özelliklerin ve Adresin gösterildiği proje Mülk Sayfaları iletişim kutusu
Dezenfektan ayarları vurgulanıyor.

Şekil 2: Genel projedeki Adres Temizleyici (ASan) ayarı özellikler.

Projeniz için HWASan'ı etkinleştirmek üzere Adres Sanitizer (ASan) ayarını değiştirin. şu şekilde ayarlanıyor: Donanım ASan Etkin (fsanitize=hwaddress).

Projenizde ASan'ı etkinleştirmek için Adres Temizleyici (ASan) ayarını değiştirin. ASan Etkin (fsanitize=address) olarak ayarlayın.

Çerçeve İşaretçisi oluşturmayı etkinleştirme

Çerçeve İşaretçisi oluşturma işlemi, Omit Frame Pointer (Çerçeve İşaretçisini Atla) C/C++ derleyici ayarını kullanabilir ve projenizin Mülk Sayfaları'nda Yapılandırma Özellikleri > C/C++ > Optimizasyon.

C/C++ Optimizasyon özelliklerinin gösterildiği proje Mülk Sayfaları iletişim kutusu,
ve Çerçeve İşaretçisini Atla ayarları
vurgulanıyor.

Şekil 3: Çerçeve İşaretçisini Atla ayarı nerede bulunur?

HWASan veya ASan'ı kullanırken Çerçeve İşaretçisini Atla ayarını Hayır (-fno-omit-frame-pointer)

Paylaşılan kitaplık modunda C++ Standart Kitaplığı'nı bağlama

C++ Standart Kitaplığı için bağlayıcı modu ayarı şurada bulunabilir: projenin Özellik Sayfaları (Yapılandırma Özellikleri > altında) Genel, Proje Varsayılanları bölümünü inceleyin.

Projenin Mülk Sayfaları iletişim kutusunda, Genel kategorisi ve
STL ayarının kullanımı
vurgulanıyor.

Şekil 4: C++ Standart Kitaplık için bağlayıcı modu ayarını nerede bulabilirsiniz?

HWASan veya ASan'ı kullanırken C++ Standart Kitaplıklarını (.so) kullanmak için STL kullanımı. Bu değer, C++ standart kitaplığını projenize paylaşılan kitaplık olarak ekleyebilirsiniz. HWASan ve ASan'ın düzgün şekilde çalışmasını sağlayın.

Adres Temizleyici'nin kullanımı için Derleme Yapılandırması Oluşturma

HWASan veya ASan'ı geçici olarak kullanmayı tercih ederseniz yeni bir derleme yapılandırması oluşturun. Bu durum, veya bir sorunu çözmek üzere keşfedebileceksiniz.

Ancak, bu programı faydalı bulduysanız ve düzenli olarak kullanmayı planlıyorsanız, gösterildiği gibi HWASan veya ASan için yeni bir derleme yapılandırması Çaydanlık örneği. Bunu, örneğin, Birim testlerinizin bir parçası olarak veya gece boyunca duman testi yapın.

Ayrı bir derleme yapılandırması oluşturmak, çok sayıda farklı üçüncü taraf kitaplığı tüketen büyük bir proje burada bunları normalde statik olarak C++ standart kitaplığına bağlarsınız. Özel iyi bir performans sergilediğinden emin olmanıza yardımcı olabilir. her zaman doğru olmalıdır.

Derleme yapılandırması oluşturmak için projenizin Mülk Sayfaları'nda "the" Configuration Manager... düğmesini tıklayın ve Etkin çözüm yapılandırması açılır menüsünü kullanın. Ardından seçimini ve uygun bir adla yeni bir derleme yapılandırması oluşturun (örneğin, HWASan etkin) tıklayın.