5

У меня есть проблемы с бэкэндом (главным образом, Stagefrightplayer) в Android, и я хотел бы понять, почему он порождает ошибки, которые он делает. Ошибки обычно характерны для устройств, поэтому отладки на эмуляторе недостаточно.Как отлаживать собственный код Android на реальном устройстве

Пример:

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 

Пример 2:

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

Я также получил от игрока Bork полностью и выплюнуть traces.txt.

Есть ли способ отладить то, что происходит, точно так же, как я отлаживаю Java-код? Благодарю.

+0

Это код пользователя C++, не связанный с ядром. См. Git: //android.git.kernel.org/platform/frameworks/base.git/media/jni/android_media_MediaPlayer.cpp и тому подобное. –

+0

Спасибо. Но все же: возможно ли отладить это, например? с удаленной сессией GDB? – neu242

ответ

9

Довольно много вещей, которые вы можете сделать.

Если вы считаете, что ошибка в самой рамки, а затем получить источник и копать http://source.android.com/

В противном случае, лучший отладчик для Android является DDMS, он может работать с эмулятором, но и с реальным устройством. http://developer.android.com/guide/developing/tools/ddms.html

dumpstate через adb (http://developer.android.com/guide/developing/tools/adb.html) также даст вам полный снимок того, что происходит на устройстве, но вам будет сложно получить точную точку, когда произойдет ошибка.

Хотя это все равно не даст вам отладку исходного уровня, как GDB (или я не уверен, что вы подразумеваете под своим обычным способом отладки кода Java).

Если вы действительно имеете в виду ядро ​​как ядро, вы больше не находитесь в Android, но больше в мире Linux, но я не думаю, что вам нужно зайти так далеко.

Если у вас возникли проблемы с конкретным приложением для Android (это не из источника с открытым исходным кодом и не является вашим собственным), я боюсь, что вам не повезло.

Для части MediaPlayer файл для Eclair находится в https://android.googlesource.com/platform/frameworks/base/+/eclair-release/media/java/android/media/MediaPlayer.java, но не найдено нужное сообщение об ошибке, которое вы указываете.

1

Хотя Android поддерживает удаленные сеансы GDB, это, вероятно, не будет работать для кода стороны ядра. Лучше всего использовать соединение JTAG, которое можно использовать для выполнения отладки режима ожидания. Поскольку отладка режима остановки эффективно останавливает выполнение вашего CPU, вы можете обнаружить, что это вызывает проблемы с Watchdog Timers.

В качестве альтернативы, вставка трассировки в код ядра может быть проще.

+0

Спасибо, но ... как вставить трассировку в мой код Java поможет отладить код ядра? Горе со мной, я не знаю: p – neu242

+0

Я имел в виду код ядра. – doron

0

Если вы не хотите отлаживать уровень сборки, вам, вероятно, придется самостоятельно создать ядро ​​с включенными символами отладки + отладки. Я бы подумал, что большинство ядер на небольшом устройстве не будут делать это по умолчанию, так как это делает ядро ​​намного больше. В этот момент вы можете включить отладчик ядра ...

2

Не то, чтобы это напрямую отвечало на ваш вопрос, но эта информация может быть вам полезна.

Так, исходя из вашего кода ошибки -1004, у вас была ошибка ввода-вывода, пытающаяся передать поток. Что касается кода ошибки -2147483648, вам не поможет. Вам нужно будет просмотреть весь вывод журнала из медиаплеера, чтобы узнать, почему вы получаете этот код, поскольку он не определен.Я видел, как он декодировал дроссель в кодировке видео.

Заимствованные из: /frameworks/base/include/media/stagefright/MediaErrors.h

MEDIA_ERROR_BASE = -1000,

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

Даже если вы не в состоянии отладки на уровне ядра, отслеживание по-прежнему может быть полезно использовать значение криптовальной ошибки для правильного файла заголовка (и описательного определения).

-1004 означает ERROR_IO и могут быть найдены в MediaErrors.h:
https://android.googlesource.com/platform/frameworks/base/+/eclair-release/include/media/stagefright/MediaErrors.h#32

-2147483648 вероятно UNKNOWN_ERROR, которые могут быть найдены в Errors.h:
https://android.googlesource.com/platform/frameworks/base/+/eclair-release/include/utils/Errors.h#49

Как вы можете видеть в Errors.h, она включает в себя errno.h, который содержит коды ошибок уровня ядра, /kernel/include/asm-generic/errno.h.

Например, если подключения() возвращает код ошибки -110 вы будете знать, что это из-за тайм-аута, так как он определен как:

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

Удаленная отладка (gdbserver на цели + БГД на хосте) может быть использовал для сквозного пользовательского кода C/C++, работающего на реальном оборудовании. Он предлагает все «обычные» параметры, такие как точки останова, обратная трассировка, просмотр/набор переменных, контрольные точки.

Для получения дополнительной информации см. Функцию оболочки gdbclient системы Android build, pre-build eabi gdb и, возможно, DDD или другой интерфейс. Eclipse должно быть в порядке.

1

Вы можете сделать это несколькими способами. Сначала вам нужно выяснить, какая служба, которую вы хотите отлаживать, в службе фреймворка Java, например, system_server или в чистом родном приложении, таком как поверхностный.

Если это чистое родное обслуживание, пожалуйста, проверьте Debugging android platform native applications статью.

Если услуга является кодом Java, размещенным в процессе system_server, пожалуйста, проверьте статью Debugging Android Java framework services.

Если код, который вы хотите отлаживать, является родной библиотекой, загруженной службой Java через JNI, неявно, пожалуйста, проверьте статью Debugging Android framework native libraries.

Смежные вопросы