Как отладить приложение на Android с помощью GDBSERVER? - PullRequest
8 голосов
/ 13 января 2010

Я пытаюсь отладить собственную разделяемую библиотеку, которую мое приложение использует через JNI. Я могу легко подключиться к работающему приложению с помощью «gdbserver --attach pid», но мне нужно запустить приложение, когда я запускаю команду gdbserver.

В этой теме миллионы обращений к блогам, но ни один из них, похоже, не ясно, как вы запускаете свое приложение. Все они говорят просто набрать «gdbserver 10.0.2.2:1234 ./MyProgram», но что именно означает «MyProgram». Это MyProgram.apk? Это MyProgram.so? Это какой-то другой файл, который создается при установке приложения? Если да, то каков его путь?

Ответы [ 2 ]

4 голосов
/ 05 октября 2011

Google предоставляет официальное решение вашей проблемы: 'ndk-gdb'

Включено в НДК. IIRC, требуется, чтобы у вас была копия gdbserver в вашем APK; IIRC, это произойдет автоматически, если вы создали свой APK с помощью 'ndk-build' и указали соответствующие аргументы.

Пожалуйста, смотрите документацию Google в $ NDK / docs / NDK-BUILD.html и $ NDK / docs / NDK-GDB.html

4 голосов
/ 07 мая 2010

Хотя можно разрабатывать автономные приложения, которые можно запускать непосредственно из оболочки, как описывают другие, похоже, ваш код работает в среде приложений Android. Следовательно, у вас нет исполняемого файла, вместо этого у вас есть APK, который содержит ваши файлы классов Dalvik вместе с другими ресурсами, включая ваш собственный общий объект.

Запуск приложения в APK включает несколько шагов

  1. Процесс system_server получает намерение запросить ваше приложение.
  2. Процесс zygote велит отключить новый процесс и запустить метод вашего класса.
  3. Ваше приложение запускается в новом процессе.

Хотя вы не можете запустить APK напрямую, передавая исполняемый файл в gdbserver, довольно просто запустить его из оболочки с помощью команды am.

$ adb -d shell
# am
usage: am [subcommand] [options]

    start an Activity: am start [-D] <INTENT>
        -D: enable debugging

    send a broadcast Intent: am broadcast <INTENT>

    start an Instrumentation: am instrument [flags] <COMPONENT>
        -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)
        -e <NAME> <VALUE>: set argument <NAME> to <VALUE>
        -p <FILE>: write profiling data to <FILE>
        -w: wait for instrumentation to finish before returning

    start profiling: am profile <PROCESS> start <FILE>
    stop profiling: am profile <PROCESS> stop

    <INTENT> specifications include these flags:
        [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
        [-c <CATEGORY> [-c <CATEGORY>] ...]
        [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
        [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
        [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
        [-n <COMPONENT>] [-f <FLAGS>] [<URI>]


# am start -n com.android.browser/.BrowserActivity
Starting: Intent { cmp=com.android.browser/.BrowserActivity }
#

Как только ваше приложение запустится, используйте gdbserver --attach <pid>, как и раньше. Если вам повезло, ваше приложение ждет некоторого взаимодействия с пользователем, прежде чем вызывать ваш нативный код, чтобы дать вам возможность присоединить и установить точки останова в GDB.

...