Pregunta

Tengo algunos problemas con el servidor de medios (sobre todo Stagefrightplayer) en Android, y me gustaría entender por qué arroja los errores que hace. Los errores son generalmente spesific dispositivo, por lo que la depuración en un emulador no sería suficiente.

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 una manera de depurar lo que está pasando, al igual que puedo depurar el código de Java? Gracias.

¿Fue útil?

Solución

Muy pocas 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 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 será difícil para que usted pueda obtener el punto exacto en que ocurre el error.

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

Si realmente kernel media como núcleo, entonces usted no está realmente en Android más, pero más en el mundo de Linux, pero no creo que es necesario ir tan lejos.

Si tiene problemas con una aplicación específica de Android (que está fuera de la fuente abierta y no es el suyo propio), me temo que no están de suerte.

En la parte MediaPlayer, el archivo de 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 se pone ahí.

Otros consejos

No es que esto responde directamente a su pregunta, pero esta información podría ser útil para usted.

Así que en base a su código de error -1004, que ha habido un error de E / S tratando de transmitir. Por lo que el código de error -2147483648, no puede ayudarle mucho. Usted tendría que mirar a todos de la salida del registro del reproductor multimedia para ver por qué vas a encontrar que el código ya que no está definido. Lo he visto de tener el estrangulador decodificador en la codificación de vídeo.

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,

La depuración remota (gdbserver en el blanco + gdb en el anfitrión) se puede utilizar a paso a través de C / C ++ código de espacio de usuario que se ejecuta en hardware real. Ofrece todas las opciones 'habituales' como puntos de ruptura, traza, vista / variables de ajuste, Tracepoints.

Para más detalles, ver la función de Shell gdbclient 'del sistema de construcción de Android, pre-construcción GDB EABI y tal vez DDD o cualquier otro frontal. Eclipse debería estar bien.

Incluso si usted no es capaz de depurar el nivel del núcleo, el rastreo del número de error críptico en el fichero de cabecera correcta (y descriptivo definir) todavía puede ser útil.

-1004 medios 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 puede encontrar en Errors.h:
https: // androide. 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 a nivel de kernel, /kernel/include/asm-generic/errno.h.

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

#define ETIMEDOUT       110     /* Connection timed out */

A pesar de que Android hace de soporte del BGF sesiones remotas, esto probablemente no funcionará para Kernel Código lateral. Su mejor opción es utilizar un href="http://en.wikipedia.org/wiki/Joint_Test_Action_Group" rel="nofollow noreferrer"> JTAG conexión que se puede utilizar para llevar a cabo el modo Detener depuración. Desde el modo de detener la depuración efectiva detiene la ejecución de la CPU, es posible encontrar esto causa problemas con el perro guardián temporizadores.

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

A menos que desea depurar en el nivel de ensamblado, es probable que tenga para construir un kernel a sí mismo con la depuración habilitada + símbolos de depuración. Yo creo que la mayoría de los núcleos en un pequeño dispositivo que evitaría haciendo que, por defecto, ya que hace que el núcleo mucho más grande. En ese momento se podía permitir que el depurador de núcleo ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top