Как отладить нативный код Android на реальном устройстве - PullRequest
5 голосов
/ 10 сентября 2010

У меня возникли проблемы с медиа-бэкендом (в основном это Stagefrightplayer) в 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)

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

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

Ответы [ 7 ]

9 голосов
/ 01 ноября 2010

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

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

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

dumpstate through 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,, но не может найти конкретное сообщение об ошибке, которое вы положили туда.

2 голосов
/ 07 июля 2011

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

Подробнее см. В функции оболочки «gdbclient» системы сборки Android, предварительной сборке eabi gdb и, возможно, DDD или другойвнешний интерфейс.Затмение должно быть в порядке.

2 голосов
/ 04 июля 2011

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

-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.

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

#define ETIMEDOUT       110     /* Connection timed out */
2 голосов
/ 04 марта 2011

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

Таким образом, на основании вашего кода ошибки -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,
1 голос
/ 31 июля 2014

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

Если это чистый нативный сервис, пожалуйста, отметьте Отладка нативных приложений на платформе Android статья.

Если служба представляет собой Java-код, размещенный в процессе system_server, установите флажок Отладка служб платформы Java Java статья.

Если код, который вы хотите отлаживать, является собственной библиотекой, неявно загружаемой службой Java через JNI, проверьте Отладка собственных библиотек инфраструктуры Android статья.

1 голос
/ 10 сентября 2010

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

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

0 голосов
/ 02 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...