Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Memahami laporan HWASan

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Saat alat HWASan mendeteksi bug memori, proses diakhiri dengan abort(), dan laporan dicetak ke stderr dan logcat. Seperti semua crash bawaan di Android, kesalahan HWASan dapat ditemukan di bawah /data/tombstones .

Dibandingkan dengan crash asli biasa, HWASan membawa informasi tambahan di bidang "Batalkan pesan" di dekat bagian atas batu nisan. Lihat contoh kerusakan berbasis tumpukan di bawah ini (untuk bug tumpukan, lihat catatan di bawah untuk bagian khusus tumpukan).

Contoh laporan

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
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 …]

Ini sangat mirip dengan laporan AddressSanitizer . Tidak seperti itu, hampir semua bug HWASan adalah "tag-mismatch", yaitu akses memori di mana tag pointer tidak cocok dengan tag memori yang sesuai. Ini bisa jadi salah satunya

  • akses di luar batas pada stack atau heap
  • gunakan setelah bebas di heap
  • gunakan setelah return on stack

Bagian

Penjelasan masing-masing bagian dari laporan HWASan adalah sebagai berikut:

Kesalahan Akses

Berisi informasi tentang akses memori yang buruk, termasuk:

  • Jenis Akses ("BACA" vs. "TULIS")
  • Ukuran akses (berapa banyak byte yang dicoba untuk diakses)
  • Nomor utas akses
  • Penunjuk dan tag memori (untuk debugging lanjutan)

Akses Stack Trace

Stack trace dari akses memori yang buruk. Lihat bagian Simbolisasi untuk melambangkan.

Menyebabkan

Penyebab potensial untuk akses yang buruk. Jika ada beberapa kandidat, mereka dicantumkan dalam urutan kemungkinan menurun. Mendahului info rinci tentang penyebab potensial. HWASan dapat mendiagnosis penyebab berikut:

  • gunakan-setelah-bebas
  • stack tag-mismatch: ini bisa berupa stack use-after-return / use after-scope, atau di luar batas
  • heap-buffer-overflow
  • global-overflow

Informasi Memori

Menjelaskan apa yang diketahui HWASan tentang memori yang sedang diakses, dan mungkin berbeda berdasarkan jenis bug.

Jenis Bug Menyebabkan Format Laporan
ketidakcocokan tag gunakan-setelah-bebas
<address> is located N bytes inside of M-byte region [<start>, <end>)
  freed by thread T0 here:
heap-buffer-overflow Perhatikan bahwa ini juga bisa menjadi underflow.
<address> is located N bytes to the right of M-byte region [<start>, <end>)
  allocated here:
tumpukan tag-ketidakcocokan Stack report tidak membedakan antara overflow/underflow dan use-after-return bug. Selain itu, untuk menemukan alokasi stack yang menjadi sumber kesalahan, diperlukan langkah simbolisasi offline. Lihat bagian Memahami laporan tumpukan di bawah ini.
bebas-tidak valid gunakan-setelah-bebas Ini adalah bug gratis ganda.
<address> is located N bytes inside of M-byte region [<start>, <end>)
  freed by thread T0 here:
tidak dapat menggambarkan alamat Entah bebas liar (bebas dari memori yang belum dialokasikan sebelumnya), atau bebas ganda setelah memori yang dialokasikan dikeluarkan dari buffer gratis HWASan.
0x… adalah memori bayangan HWAsan. Ini benar-benar gratis, karena aplikasi berusaha membebaskan memori yang ada di dalam HWASan.

Pelacakan Tumpukan Dealokasi

Jejak tumpukan di mana memori didealokasi. Hanya ada untuk bug bebas-pakai atau bebas-tidak valid. Lihat bagian Simbolisasi untuk melambangkan.

Pelacakan Tumpukan Alokasi

Jejak tumpukan di mana memori dialokasikan. Lihat bagian Simbolisasi untuk melambangkan.

Informasi Debugging Lanjutan

Laporan HWASan juga menampilkan beberapa informasi debug lanjutan, termasuk (secara berurutan):

  1. Daftar utas dalam proses
  2. Daftar utas dalam proses
  3. Nilai tag memori di dekat memori yang rusak
  4. Dump dari register pada titik akses memori

Pembuangan Tag Memori

Dump memori tag dapat digunakan untuk mencari alokasi memori terdekat dengan tag yang sama dengan tag penunjuk. Ini bisa mengarah ke akses di luar batas dengan offset besar. Satu tag sesuai dengan 16 byte memori; tag penunjuk adalah 8 bit teratas dari alamat. Dump memori tag dapat memberikan petunjuk, misalnya berikut ini adalah buffer overflow di sebelah kanan:

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  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..
(perhatikan lari 6 × 16 = 96 byte tag "iklan" di sebelah kiri yang cocok dengan tag penunjuk).

Jika ukuran alokasi bukan kelipatan 16, sisa ukuran akan disimpan sebagai tag memori dan tag akan disimpan sebagai tag butiran pendek . Dalam contoh di atas tepat setelah alokasi tag iklan dicetak tebal, kami memiliki alokasi tag 5c 5 × 16 + 4 = 84 byte.

Tag memori kosong (mis. tags: ad/ 00 (ptr/mem) ) biasanya menunjukkan bug stack-use-after-return.

Daftar Dump

Dump register dalam laporan HWASan sesuai dengan instruksi aktual yang melakukan akses memori yang tidak valid. Ini diikuti oleh register dump lain dari penangan sinyal Android biasa - abaikan yang kedua , ini diambil saat HWASan memanggil abort() dan tidak relevan dengan bug.

Simbolisasi

Untuk mendapatkan nama fungsi dan nomor baris dalam pelacakan tumpukan (dan mendapatkan nama variabel untuk bug use-after-scope), diperlukan langkah simbolisasi offline.

Pengaturan pertama kali: instal llvm-symbolizer

Untuk melambangkan, sistem Anda harus memiliki llvm-symbolizer terpasang dan dapat diakses dari $PATH. Di Debian, Anda dapat menginstalnya menggunakan sudo apt install llvm .

Dapatkan file simbol

Untuk simbolisasi, kami memerlukan binari yang tidak dilucuti yang berisi simbol. Di mana ini dapat ditemukan tergantung pada jenis bangunan:

Untuk build lokal , file simbol dapat ditemukan di out/target/product/<product>/symbols/ .

Untuk build AOSP (mis. di-flash dari Flashstation ), build tersebut dapat ditemukan di Android CI . Di "Artefak" untuk build, akan ada file `${PRODUCT}-symbols-${BUILDID}.zip`.

Untuk build internal dari organisasi Anda, periksa dokumentasi organisasi Anda untuk mendapatkan bantuan mendapatkan file simbol.

Melambangkan

hwasan_symbolize –-symbols <DECOMPRESSED_DIR>/out/target/product/*/symbols < crash

Memahami Stack Report

Untuk bug yang terjadi pada variabel stack, laporan HWASan akan berisi detail seperti ini:

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)
  [...]
	

Agar bug stack dapat dipahami, HWASan melacak frame stack yang terjadi di masa lalu. Saat ini, HWASan tidak mengubahnya menjadi konten yang dapat dipahami manusia dalam laporan bug, dan memerlukan langkah simbolisasi tambahan.

Penyelesaian masalah

"HWAddressSanitizer tidak dapat menjelaskan alamat lebih detail."

Terkadang HWASan dapat kehabisan ruang untuk informasi tentang alokasi memori sebelumnya. Dalam hal ini, laporan hanya akan berisi satu pelacakan tumpukan untuk akses memori langsung, diikuti dengan catatan:

  HWAddressSanitizer can not describe address in more detail.

Dalam beberapa kasus, hal ini dapat diatasi dengan menjalankan pengujian beberapa kali. Pilihan lainnya adalah meningkatkan ukuran riwayat HWASan. Ini dapat dilakukan secara global di build/soong/cc/sanitize.go (cari hwasanGlobalOptions ), atau di lingkungan proses Anda (coba adb shell echo $HWASAN_OPTIONS untuk melihat pengaturan saat ini).

"bug bersarang di utas yang sama"

Ini berarti ada bug saat membuat laporan kerusakan HWASan. Hal ini biasanya disebabkan oleh bug pada runtime HWASan, harap laporkan bug dan berikan petunjuk tentang cara mereproduksi masalah tersebut jika memungkinkan.