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: '==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 …]
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):
- Daftar utas dalam proses
- Daftar utas dalam proses
- Nilai tag memori di dekat memori yang rusak
- 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.