Cómo interpretar los informes de HWASan

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

[...]

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








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

  1. La lista de subprocesos en el proceso
  2. La lista de subprocesos en el proceso
  3. El valor de las etiquetas de memoria cercanas a la memoria con errores
  4. 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.