2010-09-10 16 views
5

Tengo algunos problemas con el backend de medios (principalmente Stagefrightplayer) en Android, y me gustaría entender por qué arroja los errores que hace. Los errores suelen ser específicos del dispositivo, por lo que la eliminación de errores en un emulador no sería suficiente.Cómo depurar código nativo de Android en un dispositivo real

Ejemplo:

I/AwesomePlayer( 147): mConnectingDataSource->connect() returned -1004 
V/MediaPlayerService( 147): [332] notify (0x272830, 100, 1, -1004) 
E/MediaPlayer(24881): error (1, -1004) 
E/MediaPlayer(24881): Error (1,-1004) 
W/PlayerListener(24881): Received error: what = 1, extra = -1004 

Ejemplo 2:

E/MediaPlayer( 941): error (1, -2147483648) 

también he conseguido que el jugador bork por completo y escupir un traces.txt.

¿Hay alguna manera de depurar lo que está sucediendo, al igual que depuro el código de Java? Gracias.

+0

Eso viene del código de usuario de C++, nada que ver con el kernel. Ver git: //android.git.kernel.org/platform/frameworks/base.git/media/jni/android_media_MediaPlayer.cpp y similar. –

+0

Gracias. Pero aún así: ¿Es posible depurar esto, p. con una sesión GDB remota? – neu242

Respuesta

9

Bastantes cosas que puede hacer.

Si cree que el error está en el propio marco, a continuación, obtener la fuente y cavar http://source.android.com/

De lo contrario, el mejor depurador para Android es DDMS, se puede trabajar con el emulador, sino también con el dispositivo real. http://developer.android.com/guide/developing/tools/ddms.html

dumpstate a través de adb (http://developer.android.com/guide/developing/tools/adb.html) también le dará una instantánea completa de lo que está sucediendo en el dispositivo, pero le será difícil obtener el punto exacto cuando ocurra el error.

Aunque eso todavía no le dará la depuración de nivel de fuente como lo haría GDB (o no estoy seguro de lo que quiere decir con su forma habitual de depurar el código de Java).

Si realmente quieres decir kernel como núcleo, entonces ya no estás en Android sino en Linux pero no creo que necesites llegar tan lejos.

Si tiene problemas con una aplicación específica de Android (que está fuera del código abierto y no es su propia), me temo que no tiene suerte.

Para la parte MediaPlayer, el archivo para Eclair se encuentra en https://android.googlesource.com/platform/frameworks/base/+/eclair-release/media/java/android/media/MediaPlayer.java, pero no puede encontrar el mensaje de error específico que usted pone allí.

1

Aunque Android admite sesiones de GDB remotas, probablemente esto no funcionará para Kernel Side Code. Su mejor opción es utilizar una conexión JTAG que se pueda usar para realizar la depuración de modo de parada. Debido a que la eliminación del modo de detención detiene efectivamente la ejecución de la CPU, es posible que esto cause problemas con los temporizadores de vigilancia.

Alternativamente, insertar el rastreo en el código del núcleo puede ser más fácil.

+0

Gracias, pero ... ¿cómo va a insertar el rastreo en mi código de Java para ayudar a depurar el código del kernel? Desnudo conmigo, soy ignorante: p – neu242

+0

Quise decir en el código kernel. – doron

0

A menos que desee depurar en el nivel de ensamblaje, probablemente tendrá que construir un núcleo usted mismo con los símbolos de depuración + depuración habilitados. Creo que la mayoría de los núcleos en un dispositivo pequeño evitarían hacerlo de forma predeterminada, ya que hace que el kernel sea mucho más grande. En ese momento, puede habilitar el depurador del kernel ...

2

No es que esto responda directamente a su pregunta, pero esta información podría serle útil.

Por lo tanto, según su código de error -1004, tenía un error de E/S tratando de transmitir. En cuanto al código de error -2147483648, no puede ayudarte mucho. Tendría que mirar toda la salida de registro del reproductor de medios para ver por qué está recibiendo ese código, ya que no está definido.Lo he visto por tener el decodificador atascado en la codificación de video.

Tomado de: /frameworks/base/include/media/stagefright/MediaErrors.h

MEDIA_ERROR_BASE = -1,000,

ERROR_ALREADY_CONNECTED = MEDIA_ERROR_BASE, 
ERROR_NOT_CONNECTED  = MEDIA_ERROR_BASE - 1, 
ERROR_UNKNOWN_HOST  = MEDIA_ERROR_BASE - 2, 
ERROR_CANNOT_CONNECT = MEDIA_ERROR_BASE - 3, 
ERROR_IO    = MEDIA_ERROR_BASE - 4, 
ERROR_CONNECTION_LOST = MEDIA_ERROR_BASE - 5, 
ERROR_MALFORMED   = MEDIA_ERROR_BASE - 7, 
ERROR_OUT_OF_RANGE  = MEDIA_ERROR_BASE - 8, 
ERROR_BUFFER_TOO_SMALL = MEDIA_ERROR_BASE - 9, 
ERROR_UNSUPPORTED  = MEDIA_ERROR_BASE - 10, 
ERROR_END_OF_STREAM  = MEDIA_ERROR_BASE - 11, 
2

Incluso si usted no es capaz de depurar en el nivel del núcleo, el seguimiento el número de error críptico en el archivo de encabezado correcto (y la definición descriptiva) aún puede ser útil.

-1004 significa ERROR_IO y se pueden encontrar en MediaErrors.h:
https://android.googlesource.com/platform/frameworks/base/+/eclair-release/include/media/stagefright/MediaErrors.h#32

-2147483648 probablemente es UNKNOWN_ERROR que se pueden encontrar en Errors.h:
https://android.googlesource.com/platform/frameworks/base/+/eclair-release/include/utils/Errors.h#49

Como se puede ver en Errors.h, que incluye errno.h que incluye códigos de error de nivel de kernel, /kernel/include/asm-generic/errno.h.

Por ejemplo, si connect() devuelve el -110 código de error que se sabe que es debido a un tiempo de espera ya que se define como:

#define ETIMEDOUT  110  /* Connection timed out */ 
2

La depuración remota (gdbserver en el blanco + GDB en el host) puede ser Usó para paso a través del código de usuario C/C++ que se ejecuta en hardware real. Ofrece todas las opciones "habituales" como puntos de interrupción, traza inversa, variables de visualización/configuración, puntos de referencia.

Para obtener más información, consulte la función de shell 'gdbclient' del sistema de compilación de Android, pre-build eabi gdb y tal vez DDD u otro frontend. Eclipse debería estar bien.

1

Puede hacerlo de dos maneras diferentes. Lo primero que necesita saber es que el servicio que desea depurar está en el servicio de framework de Java, como system_server o en aplicaciones nativas puras como Surfaceflinger.

Si se trata de un servicio nativo puro, consulte el artículo Debugging android platform native applications.

Si el servicio es código Java alojado en el proceso system_server, consulte el artículo Debugging Android Java framework services.

Si el código que desea depurar es una biblioteca nativa cargada por el servicio de Java a través de JNI implícitamente, consulte el artículo Debugging Android framework native libraries.

Cuestiones relacionadas