Cuando la herramienta HWASan detecta un error de memoria, el proceso finaliza con abort() y se imprime un informe en stderr y logcat. Como todos los fallos nativos en Android, los errores de HWASan se pueden encontrar en /data/tombstones
.
En comparación con los bloqueos nativos habituales, HWASan incluye información adicional en el campo "Mensaje de cancelación" cerca de la parte superior de la lápida. Vea un ejemplo de falla basada en el montón a continuación (para errores de pila, consulte la nota a continuación para las secciones específicas de la pila).
Informe de ejemplo
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 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 …]
Esto es muy similar a un informe de AddressSanitizer . A diferencia de estos, casi todos los errores de HWASan son "etiquetas no coincidentes", es decir, un acceso a la memoria donde una etiqueta de puntero no coincide con la etiqueta de memoria correspondiente. Este podría ser uno de
- acceso fuera de límites en la pila o el montón
- usar después gratis en el montón
- usar después de regresar a la pila
Secciones
A continuación se presenta una explicación de cada una de las secciones del informe HWASan:
Error de acceso
Contiene información sobre el acceso incorrecto a la memoria, que incluye:
- Tipo de acceso ("LEER" versus "ESCRIBIR")
- Tamaño de acceso (cuántos bytes se intentó acceder)
- Número de hilo del acceso.
- Etiquetas de puntero y memoria (para depuración avanzada)
Acceder al seguimiento de la pila
Seguimiento de pila del acceso incorrecto a la memoria. Consulte la sección Simbolización para simbolizar.
Causa
La posible causa del mal acceso. Si hay varios candidatos, se enumeran en orden de probabilidad descendente. Precede a la información detallada sobre la causa potencial. HWASan puede diagnosticar las siguientes causas:
- uso después de la liberación
- discordancia de etiqueta de pila: esto puede ser uso de pila después de devolución/uso después del alcance, o fuera de límites
- desbordamiento del búfer de montón
- desbordamiento global
Información de la memoria
Describe lo que HWASan sabe sobre la memoria a la que se accede y puede diferir según el tipo de error.
Tipo de error | Causa | Formato de informe |
---|---|---|
etiqueta no concuerda | uso después de la liberación | <address> is located N bytes inside of M-byte region [<start>, <end>) freed by thread T0 here: |
desbordamiento del búfer de montón | Tenga en cuenta que esto también puede ser un desbordamiento insuficiente.<address> is located N bytes to the right of M-byte region [<start>, <end>) allocated here: | |
etiqueta de pila no coincide | Los informes de pila no diferencian entre errores de desbordamiento/desbordamiento insuficiente y de uso después de devolución. Además, para encontrar la asignación de pila que es la fuente del error, se requiere un paso de simbolización fuera de línea. Consulte la sección Comprender los informes de pila a continuación. | |
libre de inválidos | uso después de la liberación | Este es un error doblemente gratuito. Si esto sucede al cerrar el proceso, puede significar una infracción de ODR .<address> is located N bytes inside of M-byte region [<start>, <end>) freed by thread T0 here: |
no puedo describir la dirección | Ya sea un wild free (libre de memoria que no se había asignado antes), o un doble free después de que la memoria asignada fuera expulsada del buffer libre de HWASan. | |
0x… es la memoria oculta de HWAsan. | Definitivamente es una descarga gratuita, ya que la aplicación intentaba liberar memoria interna de HWASan. |
Seguimiento de pila de desasignación
Seguimiento de pila de dónde se desasignó la memoria. Solo está presente para errores de uso después de la liberación o de la liberación no válida. Consulte la sección Simbolización para simbolizar.
Seguimiento de la pila de asignación
Seguimiento de pila de dónde se asignó la memoria. Consulte la sección Simbolización para simbolizar.
Información de depuración avanzada
El informe HWASan también incluye información de depuración avanzada, que incluye (en orden):
- La lista de hilos en el proceso.
- La lista de hilos en el proceso.
- El valor de las etiquetas de memoria cercanas a la memoria con fallas.
- El volcado de los registros en el punto de acceso a la memoria.
Volcado de etiquetas de memoria
El volcado de memoria de etiquetas se puede utilizar para buscar asignaciones de memoria cercanas con la misma etiqueta que la etiqueta del puntero. Estos podrían indicar un acceso fuera de límites con un gran desplazamiento. Una etiqueta corresponde a 16 bytes de memoria; la etiqueta del puntero son los 8 bits superiores de la dirección. La etiqueta de volcado de memoria puede dar pistas; por ejemplo, lo siguiente es un desbordamiento del búfer a la derecha:
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 .. .. .. .. .. .. .. .. .. .. .. .. .. ..(tenga en cuenta la ejecución de 6 × 16 = 96 bytes de etiquetas "anuncios" a la izquierda que coinciden con la etiqueta del puntero).
Si el tamaño de una asignación no es múltiplo de 16, el resto del tamaño se almacenará como etiqueta de memoria y la etiqueta se almacenará como una etiqueta granular corta . En el ejemplo anterior, justo después del anuncio etiquetado de asignación en negrita, tenemos una asignación de 5 × 16 + 4 = 84 bytes de la etiqueta 5c.
Una etiqueta de memoria cero (por ejemplo, tags: ad/ 00 (ptr/mem)
) generalmente indica un error de uso de la pila después del retorno.
Registrar volcado
El volcado de registros en los informes HWASan corresponde a la instrucción real que realizó el acceso no válido a la memoria. Le sigue otro volcado de registros del controlador de señales normal de Android; ignore el segundo , se toma cuando HWASan llama a abort() y no es relevante para el error.
Simbolización
Para obtener nombres de funciones y números de línea en los seguimientos de la pila (y obtener nombres de variables para errores de uso después del alcance), se necesita un paso de simbolización fuera de línea.
Configuración por primera vez: instale llvm-symbolizer
Para simbolizar, su sistema debe tener llvm-symbolizer instalado y accesible desde $PATH. En Debian, puedes instalarlo usando sudo apt install llvm
.
Obtener archivos de símbolos
Para la simbolización, necesitamos binarios sin eliminar que contengan símbolos. Dónde se pueden encontrar depende del tipo de compilación:
Para compilaciones locales , los archivos de símbolos se pueden encontrar en out/target/product/<product>/symbols/
.
Para las compilaciones de AOSP (por ejemplo, actualizadas desde Flashstation ), las compilaciones se pueden encontrar en Android CI . En los "Artefactos" de la compilación, habrá un archivo `${PRODUCT}-symbols-${BUILDID}.zip`.
Para compilaciones internas de su organización, consulte la documentación de su organización para obtener ayuda para obtener archivos de símbolos.
Simbolizar
hwasan_symbolize –-symbols <DECOMPRESSED_DIR>/out/target/product/*/symbols < crash
Comprender los informes de pila
Para los errores que ocurren con las variables de la pila, el informe HWASan contendrá detalles como este:
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) [...]
Para permitir que se comprendan los errores de pila, HWASan realiza un seguimiento de los marcos de pila que ocurrieron en el pasado. Actualmente, HWASan no transforma esto en contenido comprensible para los humanos en el informe de error y requiere un paso de simbolización adicional.
Violaciones ODR
Algunos errores de uso después de la liberación informados por HWASan también pueden indicar una violación de la regla de una definición (ODR). Una infracción de ODR ocurre cuando la misma variable se define varias veces en el mismo programa. Esto también significa que la variable se destruye varias veces, lo que puede provocar el error de uso después de la liberación.
Después de la simbolización, las violaciones de ODR muestran un uso después de la liberación con __cxa_finalize
, tanto en la pila de acceso no válido como en la pila "liberado aquí". La pila "previamente asignada aquí" contiene __dl__ZN6soinfo17call_constructorsEv
y debe apuntar a la ubicación en su programa que define la variable más arriba en la pila.
Una razón por la que se puede violar el ODR es cuando se utilizan bibliotecas estáticas. Si una biblioteca estática que define un global de C++ está vinculada a varias bibliotecas compartidas o ejecutables, es posible que acaben existiendo varias definiciones del mismo símbolo en el mismo espacio de direcciones, lo que provocará un error ODR.
Solución de problemas
"HWAddressSanitizer no puede describir la dirección con más detalle".
A veces, HWASan puede quedarse sin espacio para información sobre asignaciones de memoria pasadas. En ese caso, el informe contendrá solo un seguimiento de la pila para el acceso inmediato a la memoria, seguido de una nota:
HWAddressSanitizer can not describe address in more detail.
En algunos casos, esto se puede resolver ejecutando la prueba varias veces. Otra opción es aumentar el tamaño del historial de HWASan. Esto se puede hacer globalmente en build/soong/cc/sanitize.go
(busque hwasanGlobalOptions
), o en su entorno de proceso (pruebe adb shell echo $HWASAN_OPTIONS
para ver la configuración actual).
Esto también puede suceder si la memoria a la que se accede no está asignada o asignada por un asignador que no reconoce a HWASan. En este caso, la etiqueta mem
que aparece en el encabezado del fallo generalmente será 00
. Si tiene acceso a la lápida completa, puede resultar útil consultar el volcado de mapas de memoria para averiguar a qué asignación (si corresponde) pertenece la dirección.
"error anidado en el mismo hilo"
Esto significa que hubo un error al generar el informe de fallas de HWASan. Esto generalmente se debe a un error en el tiempo de ejecución de HWASan; presente un error y proporcione instrucciones sobre cómo reproducir el problema si es posible.