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

Bu belgede, AGDE'yi kullanırken özel hata ayıklama araçlarının nasıl etkinleştirileceği gösterilmektedir. Bu araçlar, teşhis edilmesi zor bellek bozulmalarına ve hataların üzerine yazmaya yardımcı olabilir.

HWAddress Temizleyici ve Adres Temizleyici

HWAddress Sanitizer (HWASan) ve Address Sanitizer (ASan), bellek bozulmasında hata ayıklamaya ve aşağıdaki gibi hataların üzerine yazmaya yardımcı olan bellek bozulması hata ayıklama araçlarıdır:

  • Yığın arabelleği taşmaları ve altları
  • Yığın arabelleği taşmaları ve alt akışları
  • Kapsamın dışında yığın kullanımı
  • Çift ücretsiz ve joker karaktersiz hatalar
  • İadeden sonra yığın kullanımı (yalnızca HWASan)

HWASan veya ASan'ı yalnızca bir sorun için hata ayıklarken veya otomatik testin bir parçası olarak etkinleştirmenizi öneririz. Bu araçlar yüksek performans gösterseler de kullanımları cezaya neden olur.

Çalışma zamanı davranışı

Etkinleştirildiğinde hem HWASan hem de ASan, uygulamanızın çalışma zamanının tamamında bellek bozulması olup olmadığını otomatik olarak kontrol eder.

Bir bellek hatası algılanırsa uygulama SIGBART (sinyal iptali) hatasıyla kilitlenir ve logcat'e ayrıntılı bir mesaj yazdırır. Mesajın bir kopyası da /data/tombstones altındaki bir dosyaya yazılır.

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ükleme

HWASan'ı kullanmak için HWASan dokümanlarındaki Kurulum talimatlarını uygulayarak Google Pixel cihazlar için Android OS'in HWASan derlemesini yükleyin.

Diğer cihazlar için, varsa işletim sisteminin HWASan derlemesini edinmek için üreticinizle iletişime geçin veya yalnızca yazılım amaçlı ASan aracını kullanın.

Projenizde paylaşılan C++ Standart Kitaplığını kullanma

Bilinen bir sorun nedeniyle ASan, libc++_static kullanılırken C++ istisna işleme ile uyumlu değil. libc++_shared kullanılırken bu sorun görülmez.

HWASan, new ve delete operatörleri için ayrı bir uygulamaya sahiptir. Standart kitaplık projeye statik olarak bağlıysa bu operatörler kullanılamaz.

Bu ayarı değiştirmek için bu dokümanın C++ Standart Kitaplığını Bağlama bölümüne bakın.

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

HWASan ve ASan, bellek ayırma ve ayırma etkinlikleri için yığın izleme bilgileri oluşturmak üzere kare işaretçiye dayalı hızlı bir açıcı kullanır. Bu nedenle, bu özellikleri kullanmak için C++ derleyici ayarlarınızda çerçeve işaretçisi oluşturmayı etkinleştirmeniz gerekir. Yani kare işaretçisi atlama optimizasyonunu devre dışı bırakmanız gerekir.

Bu ayarı değiştirmek için bu dokümanın Çerçeve İşaretçisi oluşturmayı etkinleştirme 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 projenizin Mülk Sayfaları'nda Yapılandırma Özellikleri > Genel'e gidin.

Geçerli proje için Visual Studio Çözüm Gezgini özellikler menüsü.

Şekil 1: Visual Studio Solution Gezgin penceresindeki projenin Özellikler seçeneği.

Genel özelliklerin gösterildiği ve Adres Temizleyici ayarlarının vurgulandığı proje Özellik Sayfaları iletişim kutusu.

Şekil 2: Genel proje özelliklerindeki Adres Temizleyici (ASan) ayarı.

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

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

Çerçeve İşaretçisi oluşturma özelliği etkinleştiriliyor

Çerçeve İşaretçisi oluşturma işlemi, Omit Frame Pointer C/C++ derleyici ayarı tarafından kontrol edilir ve projenizin Özellik Sayfaları'nda Yapılandırma Özellikleri > C/C++ > Optimizasyon altından bulunabilir.

C/C++ Optimizasyon özelliklerinin gösterildiği ve Çerçeve İşaretçisini Hariç Tut ayarlarının vurgulandığı proje Özellik Sayfaları iletişim kutusu.

3. Şekil: Çerçeve İşaretçisini Hariç Tut ayarı nerede bulunur.

HWASan veya ASan kullanırken Çerçeve İşaretçisini Hariç Tut ayarını Hayır (-fno-omit-frame-pointer) olarak ayarlayın.

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

C++ Standart Kitaplığı için bağlayıcı modu ayarını, projenizin Mülk Sayfaları'ndaki Yapılandırma Özellikleri > Genel bölümündeki Proje Varsayılanları bölümünde bulabilirsiniz.

Genel kategorisinin seçili olduğu ve STL kullanımı ayarının vurgulandığı proje Özellik Sayfaları iletişim kutusu.

4. Şekil: C++ Standart Kitaplığı için bağlayıcı modu ayarının bulunduğu yer.

HWASan veya ASan kullanırken STL'nin kullanımı'nı C++ Standart Kitaplıkları Kullan (.so) olarak ayarlayın. Bu değer, C++ standart kitaplığını projenize paylaşılan kitaplık olarak bağlar. Bu, HWASan ve ASan'ın düzgün çalışması için gereklidir.

Adres Temizleyici kullanımı için Derleme Yapılandırması oluşturma

HWASan veya ASan'ı geçici olarak kullanmayı tercih ediyorsanız yalnızca bu yapılandırmaların kullanımıyla ilgili yeni bir derleme yapılandırması oluşturmak istemeyebilirsiniz. Örneğin, projeniz küçükse, özelliği keşfediyorsanız ya da test sırasında keşfettiğiniz bir sorun nedeniyle karşı karşıya kalabilirsiniz.

Ancak bu aracı kullanışlı bulursanız ve düzenli olarak kullanmayı planlıyorsanız Teapot örneğinde gösterildiği gibi HWASan veya ASan için yeni bir derleme yapılandırması oluşturabilirsiniz. Örneğin, birim testlerinizin bir parçası olarak veya oyununuzun geceleri duman testleri sırasında Adres Temizleyici'yi düzenli olarak çalıştırıyorsanız bunu yapabilirsiniz.

Ayrı bir derleme yapılandırması oluşturmak, normalde bunları C++ standart kitaplığına statik olarak bağladığınız çok sayıda farklı üçüncü taraf kitaplığı kullanan büyük bir projeniz varsa özellikle faydalı olabilir. Özel derleme yapılandırmaları, proje ayarlarınızın her zaman doğru kalmasını sağlamaya yardımcı olabilir.

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