Запуск ndk-gdb с ошибкой пакета не найден на телефоне Motorola - PullRequest
14 голосов
/ 28 мая 2011

У меня есть приложение на C ++ для Android, которое я пытаюсь отладить с помощью ndk-gdb. Приложение использует несколько потоков, но предположительно r5 из ndk поддерживает несколько потоков. Кроме того, я даже не дохожу до того, что GDB запускается. Я запускаю команду:

ndk-gdb --start --force --verbose

Затем он находит правильный путь для NDK и SDK (или, по крайней мере, ADB), а также необходимые ABI и еще много чего.

$ ndk-gdb --start --force --verbose
Android NDK installation path: /home/leif/eclipse/android-ndk-r5b
Using default adb command: /home/leif/eclipse/android-sdk-linux_86/platform-tools/adb
ADB version found: Android Debug Bridge version 1.0.26
Using final ADB command: '/home/leif/eclipse/android-sdk-linux_86/platform-tools/adb'
Using auto-detected project path: .
Found package name: net.leifandersen.mobile.android.marblemachine
ABIs targetted by application: armeabi
Device API Level: 10
Device CPU ABIs: armeabi-v7a armeabi
Compatible device ABI: armeabi

Затем он ищет gdb-сервер и находит его, включая правильный PID, после чего запускает действие.

Но затем он сообщает, что пакет не найден:

Setup network redirection
## COMMAND: /home/leif/eclipse/android-sdk-linux_86/platform-tools/adb shell run-as <package name> lib/gdbserver +debug-socket --attach 16040
## COMMAND: /home/leif/eclipse/android-sdk-linux_86/platform-tools/adb forward tcp:5039 localfilesystem:run-as: Package '<package name>' is unknown/debug-socket

Затем выкладывается то, что вы получите, если неправильно используете adb (файл справки), а затем:

ERROR: Could not setup network redirection to gdbserver?
       Maybe using --port=<port> to use a different TCP port might help?
run-as: Package '<package name>' is unknown

Я заглянул в /data/system/packages.list, и да, мой apk наверняка там, и расположение, на которое он указывает, является правильным в файловой системе. Так что это не проблема.

В этом руководстве: http://vilimpoc.org/blog/2010/09/23/hello-gdbserver-a-debuggable-jni-example-for-android/ рекомендует удалить и переустановить, а также очистить сборку Eclipse.

Я не использовал eclipse для сборки пакета, но я все вычистил и скомпилировал с нуля, удалил и переустановил безуспешно.

У кого-нибудь были подобные проблемы, и как вы их решили? Спасибо.

Редактировать: О, и я попробовал другой порт безрезультатно, на 5039 (порт по умолчанию) все равно ничего не появляется. И, кстати, у меня нет брандмауэров, блокирующих это соединение. Я также работаю в Ubuntu 11.04.

Edit2: Хмм ... похоже, с новым ndk (r5c) сообщение об ошибке теперь тоже изменилось:

ERROR: Could not extract package's data directory. Are you sure that
       your installed application is debuggable?

И да, для debuggable в манифесте установлено значение true, а весь нативный код создается с помощью:

LOCAL_CFLAGS           := -Wall -g
LOCAL_LDFLAGS          := -Wl,-Map,xxx.map

Ответы [ 7 ]

15 голосов
/ 08 июня 2011
run-as: Package 'net.leifandersen.mobile.android.marblemachine' is unknown

Таким образом, к сожалению, ваше устройство не может использоваться с ndk-gdb, потому что run-as не работает. Если вы хотите использовать это устройство, у вас должны быть права суперпользователя.

РЕДАКТИРОВАНИЕ:

Измените скрипт ndk-gdb, чтобы избавиться от зависимости run-as. Он работает только с привилегиями root (adb shell whoami должно быть root).

--- ndk-gdb 2011-02-24 16:55:07.000000000 +0900
+++ ndk-gdb-root    2011-06-09 08:35:04.000000000 +0900
@@ -465,7 +465,7 @@
 log "Using app out directory: $APP_OUT"

 # Find the <dataDir> of the package on the device
-DATA_DIR=`adb_shell run-as $PACKAGE_NAME /system/bin/sh -c pwd`
+DATA_DIR="/data/data/$PACKAGE_NAME"
 log "Found data directory: '$DATA_DIR'"
 if [ $? != 0 -o -z "$DATA_DIR" ] ; then
     echo "ERROR: Could not extract package's data directory. Are you sure that"
@@ -543,7 +543,7 @@

 # Launch gdbserver now
 DEBUG_SOCKET=debug-socket
-run $ADB_CMD shell run-as $PACKAGE_NAME lib/gdbserver +$DEBUG_SOCKET --attach $PID &
+run $ADB_CMD shell "(cd $DATA_DIR; lib/gdbserver +$DEBUG_SOCKET --attach $PID)" &
 if [ $? != 0 ] ; then
     echo "ERROR: Could not launch gdbserver on the device?"
     exit 1
4 голосов
/ 13 ноября 2011

В run-as есть ошибка, она завершится ошибкой, если у вас установлено слишком много приложений. Я смог обойти эту проблему, удалив некоторые приложения из моего Evo 4G. Я нашел это в дискуссионных группах NDK - http://groups.google.com/group/android-ndk/browse_thread/thread/ae9e8d5fe2716ae6?pli=1

2 голосов
/ 20 октября 2012

У меня сегодня была такая же проблема с Samsung Galaxy S под управлением MIUI. ndk-gdb всегда сообщал: «Не удалось извлечь каталог данных пакета. Вы уверены, что ваше установленное приложение отлаживаемо?»

Оказалось, причина в том, что run-as не работает из-за символьной ссылки / data / data. Cyanogen используется в настроенном ПЗУ. Удаление символической ссылки и перемещение всех файлов из / datadata в / data / data решило проблему.

Cyanogen 2.3 fix:

ndk-gdb использует команду «run-as», которая сама выполняет ряд проверок в каталоге / data / data. В Cyanogen 2.3 это символическая ссылка, и run-as завершается ошибкой с загадочным сообщением, а ndk-gdb завершается ошибкой с [2]:

ERROR: Could not extract package's data directory. Are you sure that
       your installed application is debuggable?

Обходной путь - воссоздать / data / data с помощью символической ссылки:

cd /data/data /datadata.break-run-as
mkdir -m 771 /data/data/
chown system: v
mv /datadata/* /data/data/

http://en.wikibooks.org/wiki/OpenGL_Programming/Installation/Android_NDK

http://forum.cyanogenmod.com/topic/27657-run-as-not-working-due-to-datadata-symlink/

Надеюсь, это поможет другим с подобной проблемой. Проверьте, работает ли run-as должным образом или нет. Это не потому, что ваш двоичный файл не подлежит отладке. Сообщение об ошибке ndk-gdb очень обманчиво.

1 голос
/ 14 ноября 2012

Была похожая проблема и работает:

adb shell run-as com.mypackagename /system/bin/sh -c pwd

будет выводить:

run-as: Package 'com.mypackagename' has corrupt installation

Исправлено: удаление с устройства, а затем переустановка из командной строки с помощью:

adb install MyApkFile.apk
0 голосов
/ 18 января 2015

В случае, если кто-то использует Samsung Galaxy S4 / ... и получил 4.4.2 (последняя версия на данный момент во всех странах) - вы облажались! Самсунг баг. Так что root, как объяснено в одном из ответов выше, или получите другое устройство ... Другое решение состоит в том, чтобы вернуться к Android 4.2.2 (не 4.4.2) - до версии 4.3, которая начала эту проблему.

0 голосов
/ 14 января 2013

Существует еще одна возможность возникновения этой проблемы: если вы ранее установили свое приложение как системное приложение (в / system / app), удалите его, а затем снова установите как обычное приложение.В этом случае возможно, что все еще остаются некоторые файлы, к которым ваше приложение не может получить доступ, потому что у него нет разрешений.

Я решил это, удалив свое приложение и вручную удалив каждый связанный с ним фрагмент информации (с привилегиями оболочки adb и root).Насколько я знаю, это включает в себя:

  • Все в / data / data /
  • Файл с именем / data / dalvik-cache / **

После его повторной установки я снова смог отладить приложение.

0 голосов
/ 01 марта 2012

Я также столкнулся с этой проблемой и обнаружил, что она может быть вызвана короткими именами пакетов!

При тестировании в системе Android 2.2 с приложением, имеющим пакет с 3 уровнями (например, a.b.c), ndk-gdb не будет работать. Изменение пакета на 4 или более уровней (например, a.b.c.d) или запуск на Android 2.3 или более поздней версии решило проблему.

см. http://code.google.com/p/android/issues/detail?id=13965 для получения дополнительной информации.

...