Cómo leer y analizar logcat de Android y seguimientos de pila
En general, en el trabajo diario, básicamente se puede depurar una gran cantidad de código en eclipse+ndk, pero si necesita usar dispositivos de hardware específicos, como dispositivos de reproducción multimedia que no se pueden simular, solo puede usar el hardware (caja o teléfono móvil). En este momento, el único método de depuración es utilizar logcat para generar información de registro para analizar el problema.
¿Cuándo se generará un archivo de registro? Los archivos de registro generalmente se generarán en las siguientes situaciones.
1. El programa sale con una excepción no causada
2. El programa se ve obligado a cerrar Forzar el cierre (FC para abreviar)
3. para abreviar)), generalmente si no hay procesamiento en el hilo principal durante más de 5 segundos, se producirá ANR
Generación manual
Ingrese a la consola e ingrese: comando logcat. a la salida
Parte 1
1. Introducción a las herramientas de análisis
a.cat /proc/meminfo muestra información básica de la memoria
- ----- INFORMACIÓN DE MEMORIA (/ proc/meminfo) ------
MemTotal: 285184 kB
MemFree: 106360 kB
Buffers: 0 kB
En caché: 60036 kB
SwapCached: 0 kB
Activo: 98160 kB
Inactivo: 49100 kB
Activo(anón): 87260 kB
Inactivo(anón): 288 kB
Activo(archivo): 10900 kB
Inactivo(archivo): 48812 kB
Inevitable: 0 kB
Mbloqueado: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Sucio: 0 kB
p>Escritura: 0 kB
AnonPages: 87240 kB
Mapeado: 26500 kB
Shmem : 324 kB
Slab: 13340 kB
SReclamable: 1672 kB
SUnreclaim: 11668 kB
KernelStack: 2160 kB
PageTables: 5600 kB
NFS_Unstable: 0 kB
Rebote: 0 kB
WritebackTmp: 0 kB
CommitLimit: 142592 kB
Committed_AS: 1065600 kB
VmallocTotal: 417792 kB
VmallocUsed: 137700 kB
VmallocChunk: 254980 kB
Céntrate en los siguientes valores:
MemTotal: 285184 kB //Tamaño total de la memoria física
MemFree: 106360 kB //Cuánta memoria disponible
Búfers: 0 kB //Caché del disco Tamaño de la memoria
En caché: 60036 kB
# libre
gratis
total de búferes compartidos gratuitos utilizados
Mem: 285184 178884 106300 0 0
Swap: 0 0 0
Total: 285184 178884 106300
Existe tal pensamiento en Linux esa memoria no necesita usarse en vano No, por lo que almacena en caché y almacena en caché algunos datos tanto como sea posible para facilitar el siguiente uso.
Pero, de hecho, estos recuerdos se pueden utilizar inmediatamente.
Así que memoria libre=free+buffers+cached=total-used
También hay varios comandos disponibles:
/proc/meminfo Información sobre el uso de memoria de la máquina
/proc/pid/maps pid es el número de proceso, que muestra la dirección virtual ocupada por el proceso actual.
/proc/pid/statm Memoria ocupada por el proceso
b Ver información del proceso
------CPU INFO (top -n 1. -d 1 -m 30 -t) ------
Puede mostrar el uso de recursos de cada proceso en el sistema en tiempo real, similar al Administrador de tareas de Windows
c , Algunas herramientas operativas proporcionadas por Android
------ PROCRANK (procrank) ------
------ PROCMEM (procmem) --- - --
------ SHOWMAP (showmap) ------
... No los enumeraré uno por uno Amigos que estén interesados. Puedes ir y echar un vistazo
El código de esta herramienta se encuentra en android/system/extras
d, herramienta de visualización de memoria virtual
---. --- ESTADÍSTICAS DE LA MEMORIA VIRTUAL ( /proc/vmstat) ------
------ VMALLOC INFO (/proc/vmallocinfo) ------
2. Información de tiempo, también es la información que analizamos principalmente
El formato es el siguiente:
------ REGISTRO DEL SISTEMA (logcat -b system -v tiempo -d *:v) ----- -
$:logcat -b sistema -v tiempo -d *:v
01-02 08:00:02.570 I /SystemServer( 957): Administrador de notificaciones
01-02 08:00:02.570 I/SystemServer( 957): Monitor de almacenamiento del dispositivo
01-02 08:00:02.580 I/ SystemServer( 957): Administrador de ubicación
01-02 08:00:02.580 I/SystemServer( 957): Servicio de búsqueda
01-02 08:00:02.590 I/SystemServer( 957): Servicio DropBox
01-02 08:00:02.590 I/SystemServer(957): Servicio de papel tapiz
3. se utiliza para rastrear procesos e hilos específicos. Excelente lugar.
------ SEGUIMIENTOS DE VM JUSTO AHORA (/data/anr/traces.txt.bugreport: 2011-01-15 16:49:02) ------
------ VM TRACES AL ÚLTIMO ANR (/data/anr/traces.txt: 2011-01-15 16:49:02) ------
El formato es el siguiente:
----- pid 1516 en 1970-01-02 08:03:07 -----
Línea cmd: com.ipanel.join. tienda de aplicaciones
p>HILOS DALVIK:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
" main" prio=5 tid=1 NATIVO
| group="main" sCount=1 dsCount=0 obj=0x4001f188 self=0xd028
| sysTid=1516 nice=0 sched= 3/0 cgrp= [fopen-error:2] handle=-1345017744
Parte 2
Cómo analizar la información del registro
1. información
p>
"error" "failxx" "E/" y otros mensajes de error
Resuelva estos problemas primero
2.
Ver palabras clave similares a "Construir huella digital:"
I/DEBUG (692): *** *** *** *** *** *** ** * *** *** *** *** *** *** *** *** ***
I/DEBUG (692): Generar huella digital: 'generic/generic/ generic:2.3 1/GRH78/eng.userdev-rd6-input.20120221.113348:eng/test-keys'
I/DEBUG (692): pid: 694, tid: 694 >>> /system /bin/mediaserver <<<
I/DEBUG (692): señal 11 (SIGSEGV), código 1 (SEGV_MAPERR), dirección de error 00000inicio del módulo de entrada -->
010
Para esta información, puede ver el análisis de la biblioteca dinámica:
.android.server.UsbObserver.init(UsbObserver.java:131)
E /UsbObserver( 957): en com.android.server.UsbObserver.
E/UsbObserver( 957): en com.android.server.ServerThread.run( SystemServer.java:419)
I/SystemServer(957): Servicio UI Mode Manager
Esto se puede resolver buscando directamente el código java y analizando su implementación
4. Problema de ANR
p>
Busque la palabra clave "ANR" para localizar rápidamente lo relevante.
Información clave del evento.
La información clave del evento se encuentra a continuación:
I/dalvikvm( 1014): Escribí seguimientos de pila en '/data/anr/traces.txt'
I/Process ( 957): Enviando señal PID: 1124 SIG: 9
Especifique qué paquete java tiene el problema
E/ActivityManager( 957): ANR en com.ipanel .join .appstore
Se produjo el siguiente error con el proceso número 957: Problema de transmisión en el paquete com.ipanel.join.appstore
Motivo ANR:
E/ActivityManager( 957): Motivo: Difusión de la intención { act=android.appwidget.action.APPWIDGET_UPDATE cmp=com.ipanel.join.appstore/.widget.SmallWidget1 (tiene extras) }
Esto es la llamada de pila del archivo ANR
I/dalvikvm(1014): Escribí seguimientos de pila en '/data/anr/traces.txt'
De acuerdo con el análisis de información de registro anterior, debería ser al recibir un mensaje de transmisión Se agotó el tiempo de espera
Analicemos la información de la máquina virtual nuevamente, abramos /data/anr/traces.txt y extraigamos /data/anr/traces.txt a través de adb.
Cada párrafo aquí son todos un hilo. Por supuesto, todavía miramos el hilo principal con el hilo número 1. A través del análisis, encontramos que el problema clave es el siguiente:
Busque la palabra clave "DALVIK THREADS" para localizar rápidamente el registro de información de la máquina virtual de esta aplicación
---- - pid 1516 en 1970 -01-02 08:03:07 -----
Línea cmd: com.ipanel.join.appstore
HILOS DALVIK:
. . .
en com.ipanel.join.appstore.widget.AbsSmallWidget.getRemoteViews(AbsSmallWidget.java:56)
De hecho, de esta frase:
en org .apache.harmony.luni.platform.OSNetworkSystem.connect(Método nativo)
Básicamente, se confirma que el socket ->conexión de conexión ha agotado el tiempo de espera, lo que provoca que el hilo principal no responda en 5 segundos y provocando un error ANR. El tiempo de espera de conexión predeterminado es 75 segundos.
De hecho, la solución es utilizar un método sin bloqueo para conectarse.
También se puede ver por el uso de la CPU que la ejecución en el kernel está bloqueada
E/ActivityManager(957): 75% TOTAL: 4,7% usuario + 70% kernel
5. Error al ejecutar DexOpt
W/dalvikvm( 1803): DexOpt: --- END 'SettingsProvider.apk' --- status=0x000a, proceso fallido
E/dalvikvm(1803): No se puede extraer+optimizar DEX desde '/system/app/SettingsProvider.apk'
. . . .
android.app.ActivityThread.installProvider(ActivityThread.java:3557)
E/SystemServer( 1803): en android.app.ActivityThread.getProvider(ActivityThread.java:3356)
A juzgar por la impresión anterior, se produjo un error al descomprimir u optimizar el archivo apk extraer+optimizar DEX
1. No hay ningún error de número mágico. Esta razón no tiene nada que ver con las operaciones atómicas (esta es una solución rápida). bloquear y desbloquear funciones de operación ligera)
2. Se produjo un error al ejecutar dexopt
Se descubrió que el disco duro del servidor se quedó sin espacio, lo que provocó que no se pudiera descomprimir el archivo. sistema cuando no había espacio
6. El sistema falla de forma predeterminada o aleatoriamente después del inicio
Ocurre este error:
12-01 08:11:56.027 : WARN/SharedBufferStack( 312): se agotó el tiempo de espera de waitForCondition (LockCondition) (identidad=19, estado=0 La CPU puede estar vinculada al intentarlo nuevamente.
12-01 08:11:57.315: WARN/). SharedBufferStack(312): se agotó el tiempo de espera de waitForCondition(LockCondition) (identidad=19, estado=0). La CPU puede estar vinculada al intentarlo nuevamente.
12-01 08:11:59.318: WARN/SharedBufferStack(312). ): se agotó el tiempo de espera de waitForCondition (LockCondition) (identidad = 19, estado = 0). Es posible que la CPU esté vinculada al intentarlo nuevamente.
12-01 08:12:03.332: WARN/SharedBufferStack(312): waitForCondition. (LockCondition) se agotó el tiempo de espera (identidad=19, estado=0). La CPU puede estar vinculada al intentarlo nuevamente.
12-01 08:12:05.329: WARN/SharedBufferStack(312): waitForCondition(LockCondition). Se agotó el tiempo de espera (identidad = 19, estado = 0). Es posible que la CPU esté vinculada al intentarlo nuevamente.
12-01 08:12:07.216: ADVERTENCIA/KeyCharacterMap(312): No hay teclado para la identificación 0 p>
12-01 08:12:07.216: WARN/KeyCharacterMap(312): Uso del mapa de teclas predeterminado: /system/usr/keychars/qwerty.kcm.bin