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)
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ı.
Şekil 1: Visual Studio Çözümü'nde projenin Özellikler seçeneği Gezgin penceresi.
Ş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.
Ş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.
Ş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