Запуск ndk-gdb с ошибкой пакета не найден на телефоне Motorola

У меня есть приложение для 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 data directory. Are you sure that
       your installed application is debuggable?

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

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

Ответ 1

run-as: Package 'net.leifandersen.mobile.android.marblemachine' is unknown

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

Редакция:

Измените ndk-gdb script, чтобы избавиться от зависимости 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 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

Ответ 2

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

Ответ 3

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

Оказалось, причина в том, что run-as не работает из-за символической ссылки/данных/данных. 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 data directory. Are you sure that
       your installed application is debuggable?

Обход - это воссоздание/данные/данные с символической ссылкой:

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 очень вводит в заблуждение.

Ответ 4

Имел аналогичную проблему и работает:

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

выводит:

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

исправить было удаление на устройстве, а затем переустановить из командной строки через:

adb install MyApkFile.apk

Ответ 5

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

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

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

Ответ 6

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

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

  • Все под/данные/данные/< ваш пакет приложений >
  • Файл с именем /data/dalvik -cache/* < ваш пакет приложений > *

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

Ответ 7

В случае, если кто-то использует Samsung Galaxy S4/... и получил 4.4.2 (последний запас акций - к настоящему времени во всех странах) - вы были ввернуты! Ошибка Samsung. Итак, root, как описано в одном из ответов выше, или получите другое устройство... Еще одно решение - вернуться к версии 4.2.2 (не 4.4.2) - до версии 4.3, которая запустила эту проблему.