HWASan aracı bir bellek hatası algıladığında işlem abort()
ile sonlandırılır ve
stderr ve logcat'e bir rapor yazdırılır. Android'deki tüm yerel kilitlenmeler gibi HWASan hataları da
/data/tombstones
altında bulundu.
HWASan, normal yerel kilitlenmelere kıyasla "Mesajı iptal et" alanında daha fazla bilgi içerir bir planı var. Aşağıda yığın tabanlı örnek bir kilitlenme örneği görebilirsiniz (stack hatalarla ilgili olarak yığına özel bölümler için aşağıdaki nota bakın).
Örnek rapor
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: 'google/flame_hwasan/flame:Tiramisu/MASTER/7956676:userdebug/dev-keys' Revision: 'DVT1.0' ABI: 'arm64' Timestamp: 2019-04-24 01:13:22+0000 pid: 11154, tid: 11154, name: sensors@1.0-ser >>> /vendor/bin/hw/android.hardware.sensors@1.0-service <<< signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr -------- Abort message: '==9569==ERROR: HWAddressSanitizer: tag-mismatch on address 0x00433ae20045 at pc 0x00623ae2a9cc READ of size 1 at 0x00433ae20045 tags: 5b/83 (ptr/mem) in thread T0 #0 0x7240450c68 (/system/lib64/vndk-sp-R/libcutils.so+0x8c68) #1 0x723dffd490 (/vendor/lib64/sensors.ssc.so+0x34490) #2 0x723e0126e0 (/vendor/lib64/sensors.ssc.so+0x496e0) [...] [0x00433ae20040,0x00433ae20060) is a small unallocated heap chunk; size: 32 offset: 5 Cause: use-after-free 0x00433ae20045 is located 5 bytes inside of 10-byte region [0x00433ae20040,0x00433ae2004a) freed by thread T0 here: #0 0x72404d1b18 (/system/lib64/libclang_rt.hwasan-aarch64-android.so+0x10b18) #1 0x723af23040 (/vendor/lib64/libgralloccore.so+0x5040) #2 0x723af23fa4 (/vendor/lib64/libgralloccore.so+0x5fa4) [...] previously allocated here: #0 0x72404ce554 (/system/lib64/libclang_rt.hwasan-aarch64-android.so+0xd554) #1 0x7240115654 (/apex/com.android.runtime/lib64/bionic/libc.so+0x43654) #2 0x7240450ac8 (/system/lib64/vndk-sp-R/libcutils.so+0x8ac8) [...] hwasan_dev_note_heap_rb_distance: 1 1023 hwasan_dev_note_num_matching_addrs: 0 hwasan_dev_note_num_matching_addrs_4b: 0 Thread: T0 0x006a00002000 stack: [0x007fc1064000,0x007fc1864000) sz: 8388608 tls: [0x00737702ffc0,0x007377033000) Memory tags around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1f80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1f90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fa0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 =>0x006f33ae2000: 08 00 08 00 [83] 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Tags for short granules around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1ff0: .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. =>0x006f33ae2000: 72 .. d0 .. [..] .. .. .. .. .. .. .. .. .. .. .. 0x006f33ae2010: .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. See https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html#short-granules for a description of short granule tags Registers where the failure occurred (pc 0x00623ae2a9cc): x0 0000007fc18623ec x1 5b0000433ae20045 x2 0000000000000013 x3 ffffffffffffffff x4 ffffffffffffffff x5 0000007fc1861da3 x6 6f7420676e696f47 x7 45522061206f6420 x8 0000000000000000 x9 0200006b00000000 x10 00000007fc18623f x11 5b0000433ae20040 x12 6f64206f7420676e x13 0a44414552206120 x14 0000000000000010 x15 ffffffffffffffff x16 000000737169ac94 x17 0000000000000007 x18 0000007377bd8000 x19 0000007fc1862498 x20 0200006b00000000 x21 0000007fc18624a8 x22 0000000000000001 x23 0000000000000000 x24 0000000000000000 x25 0000000000000000 x26 0000000000000000 x27 0000000000000000 x28 0000000000000000 x29 0000007fc1862410 x30 000000623ae2a9d0 sp 0000007fc18623d0 SUMMARY: HWAddressSanitizer: tag-mismatch (/system/lib64/vndk-sp-R/libcutils.so+0x8c68) [ … regular crash dump follows …]
Bu, AddressSanitizer raporuna çok benzer. Bunların aksine, hemen hemen tüm HWASan hataları “etiket uyuşmazlığı”dır, yani işaretçi etiket karşılık gelen bellek etiketiyle eşleşmez. Bu özelliklerden biri,
- yığın veya yığın üzerinde sınırların dışında erişim
- yığın üzerinde ücretsiz sonra kullan
- yığından sonra kullanım
Bölümler
HWASan raporunun her bir bölümünün açıklamasını aşağıda bulabilirsiniz:
Erişim hatası
Aşağıdakiler de dahil olmak üzere hatalı bellek erişimiyle ilgili bilgileri içerir:
- Erişim Türü ("OKUMA" ve "YAZMA")
- Erişim boyutu (erişilmeye çalışılan bayt sayısı)
- Erişimin ileti dizisi numarası
- İşaretçi ve bellek etiketleri (gelişmiş hata ayıklama için)
Yığın izlemeye erişim
Hatalı bellek erişiminin yığın izlemesi. Aşağıdakileri yapmak için Semboller bölümüne bakın temsil eder.
Neden
Kötü erişimin olası nedeni. Birden fazla aday varsa, şunlardır: çoktan aza doğru sıralayabilirsiniz. olası nedendir. HWASan aşağıdaki nedenleri teşhis edebilir:
- ücretsiz sonra kullan
- yığın etiketi uyuşmazlığı: Bu, iadeden sonra yığın kullanım / kapsam sonrası kullanım şeklinde olabilir. sınırların dışında
- yığın-arabellek taşması
- genel taşma
Bellek bilgileri
HWASan'ın erişilen bellekle ilgili bildiklerini açıklar ve farklı olabilir. CANNOT TRANSLATE hata türü.
Hata Türü | Neden | Rapor Biçimi |
---|---|---|
etiket uyuşmazlığı | ücretsiz sonra kullan |
<address> is located N bytes inside of M-byte region [<start>, <end>) freed by thread T0 here: |
yığın-arabellek taşması | Bunun da bir eksik olabileceğini unutmayın.
<address> is located N bytes to the right of M-byte region [<start>, <end>) allocated here: |
|
yığın etiket uyuşmazlığı | Yığın raporları, taşma/alt akış ve hatalarından kaçının. İçinde hatanın kaynağı olan yığın ayırmayı bulmak için çevrimdışı gerekli olduğunu unutmayın. Bkz. Yığın raporlarını anlama bölümüne bakın. | |
geçersiz | ücretsiz sonra kullan | Bu, çifte ücretsiz bir hatadır. İşlemin kapatılması sırasında böyle bir durum,
ODR ihlali.
<address> is located N bytes inside of M-byte region [<start>, <end>) freed by thread T0 here: |
adres açıklayamaz | Ya son derece ücretsiz (daha önce ayrılmamış belleksiz) ya da çift ücretsiz HWASan'ın boş arabelleğinden çıkarıldıktan sonra kullanılabilir. | |
0x... HWAsan gölge belleğidir. | Uygulama ücretsiz olarak sunulduğu için bu, kesinlikle yani dahili bir destek birimidir. |
Anlaşma konumu yığın izlemesi
Belleğin ayrıldığı yeri gösteren yığın izleme (stack trace). Yalnızca ücretsiz sonra kullan olmasını sağlayın. Sembolize etmek için Semboller bölümüne bakın.
Ayırma yığın izlemesi
Belleğin ayrıldığı yerin yığın izlemesi. Sembolize etmek için Semboller bölümüne bakın.
Gelişmiş hata ayıklama Bilgi
HWASan raporu, aşağıdakiler de dahil olmak üzere bazı gelişmiş hata ayıklama bilgileri içerir: (sırayla):
- İşlemdeki ileti dizilerinin listesi
- İşlemdeki ileti dizilerinin listesi
- Hatalı belleğin yanındaki bellek etiketlerinin değeri
- Bellek erişimi noktasında kayıtların dökümü
Bellek etiketi dökümü
Etiket belleği dökümü, aynı etiketle yakındaki bellek ayırmalarını aramak için kullanılabilir olarak işaretçi kapanış etiketinin hemen öncesine yapıştırın. Bunlar, büyük bir ofsetle sınır dışında erişime işaret edebilir. Bir etiket 16'ya karşılık gelir bayt hafıza kapasitesi; işaretçi etiket adresin en üstteki 8 bitidir. Etiket belleği dökümü, ipuçları verebilir, şunun için: aşağıdaki örnek, sağa doğru bir arabellek taşmasıdır:
tags: ad/5c (ptr/mem) [...] Memory tags around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1ff0: 0e 0e 0e 57 20 20 20 20 20 2e 5e 5e 5e 5e 5e b5 =>0x006f33ae2000: f6 f6 f6 f6 f6 4c ad ad ad ad ad ad [5c] 5c 5c 5c 0x006f33ae2010: 5c 04 2e 2e 2e 2e 2e 2f 66 66 66 66 66 80 6a 6a Tags for short granules around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1ff0: ab 52 eb .. .. .. .. .. .. .. .. .. .. .. .. .. =>0x006f33ae2000: .. .. .. .. .. .. .. .. .. .. .. .. [..] .. .. .. 0x006f33ae2010: .. 5c .. .. .. .. .. .. .. .. .. .. .. .. .. ... (Soldaki, işaretçi etiketiyle eşleşen 6 × 16 = 96 baytlık "reklam" etiketinin çalıştırılmasına dikkat edin).
Ayırmanın boyutu 16'nın katı değilse boyutun geri kalanı depolandı olarak memory etiketi ve etiket, bir kısa video granül etiketi. Yukarıdaki örnekte kalın harflerle yazılmış ayırma etiketinden hemen sonra reklam, 5 var × 16 + 4 = Etiket 5c'nin 84 baytlık dağılımı.
Sıfır bellek etiketi (ör. tags: ad/00 (ptr/mem)
) genellikle bir
yığın kullanım hatası.
Dökümü kaydet
HWASan raporlarındaki kayıt dökümü, geçersiz hafıza erişim. Ardından, normal Android sinyal işleyiciden başka bir kayıt dökümü izler. - yoksay ikincisi ise, HWASan abort() işlevini çağırdığında ve hatası.
Sembol
.Yığın izlemelerde işlev adlarını ve satır numaralarını almak (ve kapsam sonrası kullanım için değişken adları almak) yazılım hatası varsa) çevrimdışı simgeselleştirme adımı gereklidir.
İlk kurulum: llvm-symbolizer'ı yükleme
Simgeselleştirmek için, sisteminizde llvm-symbolizer yüklü ve $PATH yolundan erişilebilir olmalıdır. Debian'da
sudo apt install llvm
kullanarak yükleyebilirsiniz.
Sembol dosyaları edinme
Simgeleştirme için semboller içeren sadeleştirilmemiş ikili programlar gerekir. Bunların nerede bulunabileceğine bağlı olarak seçin:
Yerel derlemeler için sembol dosyaları şurada bulunabilir:
out/target/product/<product>/symbols/
.
AOSP derlemeleri için (ör. Flashstation üzerinden alınan)
derlemeler Android CI üzerinde bulunabilir. "Artifacts" (Yapılar) bölümünde -
geliştirme
bir ${PRODUCT}-symbols-${BUILDID}.zip
dosyası olacak.
Kuruluşunuzdaki dahili derlemeler ile ilgili olarak yardım için kuruluşunuzun dokümanlarına göz atın alıyorum.
Sembol
hwasan_symbolize –-symbols <DECOMPRESSED_DIR>/out/target/product/*/symbols < crash.
Yığın raporlarını anlama
Yığın değişkenlerinde oluşan hatalar için HWASan raporu aşağıdaki gibi ayrıntılar içerir:
Cause: stack tag-mismatch Address 0x007d4d251e80 is located in stack of thread T64 Thread: T64 0x0074000b2000 stack: [0x007d4d14c000,0x007d4d255cb0) sz: 1088688 tls: [0x007d4d255fc0,0x007d4d259000) Previously allocated frames: record_addr:0x7df7300c98 record:0x51ef007df3f70fb0 (/apex/com.android.art/lib64/libart.so+0x570fb0) record_addr:0x7df7300c90 record:0x5200007df3cdab74 (/apex/com.android.art/lib64/libart.so+0x2dab74) [...]
HWASan, yığın hatalarının anlaşılması için geçmişte gerçekleşen yığın çerçevelerinin kaydını tutar. Şu anda HWASan, hata raporunda bunu kullanıcıların anlayabileceği içeriğe dönüştürmemektedir. ek bir simgeselleştirme adımı gerektirir.
ODR ihlalleri
HWASan tarafından bildirilen bazı ücretsiz sonrası kullanım hataları da Tek Tanımlama Kuralı (ODR) ihlaline işaret edebilir. ODR ihlali, aynı değişken aynı programda birden çok kez tanımlandığında gerçekleşir. Bu aynı zamanda, değişkenin birden çok kez yok edilmesi anlamına gelir. Bu da kullanım hatası.
Sembolleştirmeden sonra ODR ihlalleri, __cxa_finalize
ile ücretsiz sonra kullanım durumunu gösteriyor.
hem geçersiz erişim yığınında hem de "burada serbest bırakıldı" yığını. Daha önce tahsis edilen
burayı" yığın __dl__ZN6soinfo17call_constructorsEv
içeriyor ve
programınızda, yığında daha üstte yer alan değişkeni tanımlayan konuma gidin.
ODR'nin ihlal edilmesinin bir nedeni, statik kitaplıkların kullanılmasıdır. Bir C++ global programını tanımlayan statik bir kitaplık birden fazla paylaşılan kitaplıka bağlıysa veya aynı adreste birden fazla tanım bulunabilir ve çalıştırılabilir boşluğa neden olur. Bu da ODR hatasına neden olur.
Sorun giderme
HWAddressSanitizer, adresi daha ayrıntılı açıklayamıyor
Bazen HWASan'da, geçmiş bellek ayırmaları hakkında bilgi için yer kalmayabilir. Böyle bir durumda rapor, anında bellek erişimi için yalnızca bir yığın izleme (stack trace) ve ardından bir not içerir:
HWAddressSanitizer can not describe address in more detail.
Bazı durumlarda bu sorun, testi birkaç kez çalıştırarak çözülebilir. Diğer bir seçenek de HWASan
geçmiş boyutu. Bu, tüm dünyadaki
build/soong/cc/sanitize.go
(
hwasanGlobalOptions
) veya işlem ortamınızda (deneyin)
geçerli ayarları görmek için adb shell echo $HWASAN_OPTIONS
) tıklayın.
Bu durum, erişilen bellek eşlenmediyse veya HWASan duyarlı olmayan bir
ayırıcıdır. Bu durumda, kilitlenme başlığında listelenen mem
etiketi genellikle
00
. Mezar taşına tam erişiminiz varsa şuraya danışmanız faydalı olabilir:
adresin hangi eşlemeye (varsa) ait olduğunu bulmak için bellek haritaları dökümünü kullanır.
Aynı iş parçacığına yerleştirilmiş hata
Bu, HWASan kilitlenme raporu oluşturulurken bir hata oluştuğu anlamına gelir. Bunun nedeni genellikle HWASan çalışma zamanı, lütfen hata bildiriminde bulunun ve mümkünse sorunun nasıl yeniden üretileceğine ilişkin talimatlar sağlayın.