Cómo depurar tu proyecto

Cómo depurar fallas por errores en código nativo

Si tienes problemas para comprender una tombstone o un volcado de fallas por errores en código nativo, consulta Cómo depurar código nativo en la plataforma de Android, que es una buena introducción.

Para ver un catálogo más completo de los tipos de fallas comunes y cómo investigarlos, consulta Cómo diagnosticar fallas por errores en código nativo.

La herramienta ndk-stack puede ayudarte a simbolizar las fallas. Puedes depurarlas en Android Studio como se describe en la documentación general Cómo depurar tu app. Si prefieres usar la línea de comandos, ndk-gdb te permite adjuntar gdb o lldb desde tu shell.

Bríndales a las apps acceso directo a los seguimientos de tombstone

A partir de Android 12 (nivel de API 31), puedes acceder a la tombstone de falla por error en código nativo de tu app como unbúfer de protocolo a través del método ApplicationExitInfo.getTraceInputStream(). El búfer de protocolo se serializa con este esquema. Anteriormente, la única manera de obtener acceso a esta información era mediante Android Debug Bridge (adb).

Este es un ejemplo de cómo implementarla en la app:

ActivityManager activityManager: ActivityManager = getSystemService(Context.ACTIVITY_SERVICE);
MutableList<ApplicationExitInfo> exitReasons = activityManager.getHistoricalProcessExitReasons(/* packageName = */ null, /* pid = */ 0, /* maxNum = */ 5);
for (ApplicationExitInfo aei: exitReasons) {
    if (aei.getReason() == REASON_CRASH_NATIVE) {
        // Get the tombstone input stream.
        InputStream trace = aei.getTraceInputStream();
        // The tombstone parser built with protoc uses the tombstone schema, then parses the trace.
        Tombstone tombstone = Tombstone.parseFrom(trace);
    }
}

Cómo depurar problemas con la memoria nativa

Address Sanitizer (HWASan/ASan)

HWAddress Sanitizer (HWASan) y Address Sanitizer (ASan) son similares a Valgrind, aunque considerablemente más rápidos y con mejor compatibilidad en Android.

Son la opción más conveniente para depurar errores de memoria en Android.

Depuración de malloc

Si quieres obtener una descripción completa de las opciones integradas en la biblioteca C para depurar problemas de la memoria nativa, consulta Depuración de malloc y Cómo realizar un seguimiento de la memoria nativa usando devoluciones de llamadas de libc.

Hooks malloc

Si quieres compilar tus propias herramientas, libc de Android también admite la interceptación de todas las llamadas gratuitas o de asignación que ocurren durante la ejecución del programa. Consulta la documentación sobre malloc_hooks para obtener instrucciones de uso.

Estadísticas de malloc

Android admite las extensiones mallinfo(3) y malloc_info(3) para <malloc.h>.

La función malloc_info está disponible en Android 6.0 (Marshmallow) y versiones posteriores, y su esquema XML se documenta en el encabezado malloc.h de Bionic.

Cómo generar perfiles

Para generar perfiles de CPU de código nativo, puedes usar Simpleperf.