HWASan raporlarını anlama

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: '

[...]

[0x00433ae20040,0x00433ae20060) is a small unallocated heap chunk; size: 32 offset: 5








[ … 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):

  1. İşlemdeki ileti dizilerinin listesi
  2. İşlemdeki ileti dizilerinin listesi
  3. Hatalı belleğin yanındaki bellek etiketlerinin değeri
  4. 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.