Cuando la herramienta HWASan detecta un error de memoria, el proceso finaliza con abort()
.
se imprime un informe en stderr y logcat. Como sucede con todas las fallas por error en código nativo en Android, los errores de HWASan pueden ser
que se encuentran en /data/tombstones
.
En comparación con las fallas por errores en código nativo normales, HWASan incluye información adicional en el campo "Anular mensaje" cerca de la parte superior de la lápida. Consulta el siguiente ejemplo de falla basada en el montón a continuación (para errores de pila, consulta la nota que aparece más abajo para ver 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 “no coinciden con las etiquetas”, es decir, un acceso a la memoria en el que la etiqueta de un puntero sí lo hace. no coinciden con la etiqueta de memoria correspondiente. Este podría ser uno de
- acceso fuera de los límites en la pila o en el montón
- usar después de la liberación en el montón
- usar después de devolver en la pila
Secciones
A continuación, se incluye una explicación de cada una de las secciones del informe de HWASan:
Error de acceso
Contiene información sobre el acceso inadecuado a la memoria, en la que se incluye lo siguiente:
- Tipo de acceso ("LECTURA" frente a "ESCRITURA")
- Tamaño de acceso (cuántos bytes se intentó acceder)
- Número de subproceso del acceso
- Etiquetas de puntero y memoria (para depuración avanzada)
Cómo acceder al seguimiento de pila
Seguimiento de pila del acceso deficiente a la memoria Consulta la sección Simbolización para simbolizar.
Causa
La posible causa del mal acceso. Si hay varios candidatos, son en orden de probabilidad descendente. Antecede a la información detallada sobre el causa posible. HWASan puede diagnosticar las siguientes causas:
- uso después de la liberación
- Discrepancias en las etiquetas de la pila: esto puede ser uso después de la devolución / uso después del alcance, o fuera de los 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 (puede diferir) según el tipo de error.
Tipo de error | Causa | Formato del informe |
---|---|---|
no coincide la etiqueta | 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 | Ten en cuenta que esto también puede ser un subdesbordamiento.
<address> is located N bytes to the right of M-byte region [<start>, <end>) allocated here: |
|
falta de coincidencia entre etiquetas de pila | Los informes de pila no diferencian entre desbordamiento o subdesbordamiento y usar después de devolver. En para encontrar la asignación de pila que es la fuente del error sin conexión el paso de simbolización es obligatorio. Consulta el artículo Conceptos básicos sobre los informes de pilas. a continuación. | |
libre-no válido | uso después de la liberación | Este es un error doble libre. Si esto sucede durante el cierre del proceso, esto puede significar un
Incumplimiento del ODR.
<address> is located N bytes inside of M-byte region [<start>, <end>) freed by thread T0 here: |
no se puede describir la dirección | Puede ser un archivo libre (sin memoria que no se haya asignado antes) o doble libre después de que se expulsó la memoria asignada del búfer libre de HWASan. | |
0x... es la memoria paralela de HWAsan. | Esto es muy gratis, ya que la app intentaba liberar de memoria que está internas a HWASan. |
Seguimiento de pila de la ubicación del acuerdo
Seguimiento de pila del lugar donde se desasignó la memoria. Solo disponible para usar después de la liberación o errores no válidos. Consulta la sección de simbolización para simbolizar.
Seguimiento de pila de asignación
Seguimiento de pila del lugar en el que se asignó la memoria Consulta la sección de simbolización para simbolizar.
Depuración avanzada Información
El informe de HWASan también incluye información de depuración avanzada, incluida la (en orden):
- La lista de subprocesos en el proceso
- La lista de subprocesos en el proceso
- El valor de las etiquetas de memoria cercanas a la memoria con errores
- El volcado de los registros en el punto de acceso a la memoria
Volcado de etiqueta de memoria
El volcado de memoria de etiqueta se puede usar para buscar asignaciones de memoria cercanas con la misma etiqueta. como puntero etiqueta. Estas podrían señalar un acceso fuera de los 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. El volcado de memoria de la etiqueta puede dar pistas, para En el siguiente ejemplo, se muestra un desbordamiento de búfer hacia 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 .. .. .. .. .. .. .. .. .. .. .. .. .. ..(ten en cuenta la ejecución de 6 × 16 = 96 bytes de etiquetas "ad" 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 será almacenado como etiqueta de memoria y la etiqueta se almacenarán como un archivo de gránulos. En el ejemplo anterior, justo después de la asignación en negrita etiquetada anuncio, tienen un 5 × 16 + 4 = asignación de 84 bytes de la etiqueta 5c.
Una etiqueta de memoria cero (p. ej., tags: ad/00 (ptr/mem)
) suele indicar un
un error de stack-use-after-return.
Registrar volcado
El volcado de registros en los informes de HWASan corresponde a la instrucción real que realizó el no válido memoria el acceso a los datos. Le sigue otro volcado de registro del controlador de señales de Android normal. : ignorar el segundo, se toma cuando HWASan lo llama abort() y no es relevante para el error.
Simbolización
Para obtener nombres de funciones y números de línea en seguimientos de pila (y obtener nombres de variables para usar después del alcance) errores), se requiere un paso de simbolización sin conexión.
Primera configuración: instala llvm-symbolizer
Para simbolizar, tu sistema debe tener instalado llvm-symbolizer y ser accesible desde $PATH. En Debian, también puedes
instálalo con sudo apt install llvm
.
Cómo obtener archivos de símbolos
Para la simbolización, necesitamos objetos binarios sin eliminar que contengan símbolos. La ubicación de estos según el tipo de compilación:
Para las compilaciones locales, los archivos de símbolos se pueden encontrar en
out/target/product/<product>/symbols/
Para las compilaciones del AOSP (p.ej., se escribe en la memoria flash de Flashstation), el archivo
puedes encontrar las compilaciones en Android CI. En la sección “Artefactos” para el
compilar,
habrá un archivo ${PRODUCT}-symbols-${BUILDID}.zip
.
Para obtener información sobre las compilaciones internas de tu organización, consulta su documentación para obtener ayuda. obtener archivos de símbolos.
Simbolizar
hwasan_symbolize –-symbols <DECOMPRESSED_DIR>/out/target/product/*/symbols < crash
Conceptos básicos sobre los informes de pilas
Para los errores que se producen con las variables de pila, el informe de HWASan contendrá detalles como los siguientes:
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 entiendan los errores de pila, HWASan realiza un seguimiento de los marcos de pila que ocurrieron en el pasado. Por el momento, HWASan no lo transforma en contenido comprensible para los humanos en el informe de errores. requiere un paso de simbolización adicional.
Incumplimiento de la ODR
Algunos errores de uso después de la liberación informados por HWASan también pueden indicar un incumplimiento de la regla de definición única (ODR). Un incumplimiento de ODR ocurre cuando se define la misma variable varias veces en el mismo programa. Esto también significa que la variable se destruye varias veces, lo que puede generar la de usar después de liberar.
Después de la simbolización, las infracciones del ODR muestran un uso después de la liberación con __cxa_finalize
,
en la pila de acceso no válido y en una pila. La ruta de acceso “asignada previamente
aquí" contiene __dl__ZN6soinfo17call_constructorsEv
y debe
en la ubicación del programa que define la variable más alta en la pila.
Uno de los motivos por los que se puede incumplir el ODR es cuando se usan bibliotecas estáticas. Si una biblioteca estática que define un C++ global está vinculada a varias bibliotecas compartidas, o ejecutables, es posible que múltiples definiciones del mismo símbolo existan en la misma dirección espacio, lo que provocará un error de ODR.
Solución de problemas
HWAddressSanitizer no puede describir la dirección con más detalle
A veces, HWASan puede quedarse sin espacio para obtener información sobre asignaciones de memoria anteriores. En ese caso, el informe contendrá un solo seguimiento de 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 HWASan
el tamaño del historial. Esto se puede hacer globalmente
build/soong/cc/sanitize.go
(busca
hwasanGlobalOptions
) o en tu entorno de proceso (prueba
adb shell echo $HWASAN_OPTIONS
para ver la configuración actual).
Esto también puede ocurrir si la memoria a la que se accedió no está asignada o si la asigna un agente
asignador. En este caso, la etiqueta mem
que se incluye en el encabezado de la falla, por lo general, será
00
Si tienes acceso a la lápida completa, puede ser útil consultar el
el volcado de mapas de memoria para averiguar a qué asignación (si corresponde) pertenece la dirección.
Error anidado en el mismo subproceso
Esto significa que se produjo un error cuando se generaba el informe de fallas de HWASan. Por lo general, esto se debe a un error en el tiempo de ejecución de HWASan, informa un error y proporcionar instrucciones sobre cómo reproducir el problema, si es posible.