Подтвердить что ты не робот

Интеграция android ndk ndk-gdb с emacs?

Может ли кто-нибудь сказать мне, как запустить ndk-gdb из emacs с помощью gdb-mode? В настоящее время я запускаю его в буфере оболочки. Я бы хотел, чтобы это способ автоматической синхронизации буфера исходного файла с текущим компьютером в gdb, когда я прерываю или шагу. Что-нибудь еще, например, установка перерывов из источника, буферов, отображающих локальные локали gdb и т.д., А ключевые ссылки для команд gdb будут подливы.

Справочная информация. Я разрабатываю в GNU Emacs 23.1.90.1 (i386-apple-darwin10.5.0, NS apple-appkit-1038.35) 2010-12-15 на OSX 10.6.6 с Android-режимом, используя андроид- ndk-r5b и смешанный код java/c/С++ для целевой Android.

Android-режим и оболочка (запуск ndk-gdb) в emacs позволяют мне видеть практически все, что мне нужно, но моя настройка была бы более удобной, если бы я мог получить исходный буфер для синхронизации с отладчиком или получить эквивалент о том, что описано в EmacsWiki здесь.

FYI, в настоящее время я использую eclipse для отладки и разработки на стороне Java, но считаю его неустойчивым и трудно настраиваемым для собственной работы, несмотря на наличие sequoyah, и, кроме того, eclipse не emacs.

[приложена]

Запуск M-x gdb с ndk-gdb в качестве команды gdb (см. ниже) приводит к созданию буфера, называемого gud, с помощью текстового выражения: "(Debugger: run [initializing...])". Буфер не принимает команды gdb и не принимает команды emacs gdb - (M-s, M-n и т.д. Приводят к < >

Выход:

Current directory is /Users/jpschelter/
Android NDK installation path: /Developer/android-ndk-r5b
Using specific adb command: /Developer/android-sdk-mac_x86/platform-tools/adb
...
... ...
...
(no debugging symbols found)
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0xafd0e21c in nanosleep () from /Developer/Projects/ECS/DIGG/Projects/droid/obj/local/armeabi/libc.so
(gdb) Undefined command: "1-inferior-tty-set".  Try "help".
(gdb) Undefined command: "2-gdb-set".  Try "help".
(gdb) Undefined command: "3-gdb-set".  Try "help".
(gdb) Undefined command: "4-file-list-exec-source-files".  Try "help".
(gdb) Undefined command: "5-file-list-exec-source-file".  Try "help".
(gdb) Undefined command: "6-gdb-show".  Try "help".
(gdb) Undefined command: "7-stack-info-frame".  Try "help".
(gdb) Undefined command: "8-thread-info".  Try "help".
(gdb) Undefined command: "9-break-list".  Try "help".

Буферы, называемые *threads of*, *input/output of* и *breakpoints of*, также создаются, но являются пустыми.

Просмотр через источник gdb-mi.el моих emacs и сравнение с выходом gdb-debug-log, похоже, что gdb-mi пытается отправить эти параметры в исполняемый файл gdb, но gdb-server не отвечает на команды, как ожидалось?

Обратите внимание, что запуск Mx gud-gdb с командной строкой для ndk-gdb приводит к эквиваленту запуска ndk-gdb внутри оболочки, поэтому проблема, похоже, находится в конфигурации gdb-mode в emacs.

4b9b3361

Ответ 1

У меня была такая же проблема при запуске gdb под emacs: окно * gud * не отвечало на команды. Однако ndk-gdb хорошо работал в оболочке. Чтобы заставить его работать под интерфейсом emacs gud, мне пришлось немного изменить ndk-gdb script.

При вызове GDB (последняя строка) сделайте следующее:

$GDBCLIENT --annotate=3 -x `native_path $GDBSETUP`

Параметр --annotate = 3 является обязательным для интерфейса emacs gud, он не может работать без него (поэтому * gud * не отвечал).

Но ты на полпути. Теперь он будет работать, но только если вы вызовете ndk-gdb в буфере из файла в корне проекта (например, AndroidManifest.xml). Поскольку это очень маловероятно в большинстве случаев, потому что вы программист на C/С++, а источники, над которыми вы работаете, находятся под jni-каталогом или глубже, вам нужно сделать немного больше. Ndk-gdb script немного глючит, и он с радостью смутит вас на этом (и сам gdb тоже не поможет).

Найдите script для "PROJECT = $OPTION_PROJECT". Вы будете в длинном if... else... fi разделе, который отвечает за поиск корня проекта (если он не был задан с параметром --project, хотя это НЕ НЕ РЕШЕТ проблему я поговорим, см. ниже). После fi добавьте эту строку:

cd $PROJECT

По какой-то непонятной причине script НЕ ДОСТУПНО к корневому каталогу проекта. Это приводит к очень неправильному поведению при работе с файлом gdb.setup, где script предполагается, что он находится в корне проекта. Добавление этой строки будет исправлено.

Убедитесь, что вы вызываете ndk-gdb в emacs с помощью обычной команды:

(gdb "ndk-gdb ...")

Не используйте gud-gdb (как это ни странно, это старый способ emacs использовать gdb и не имеет ничего общего с приятным пользовательским интерфейсом, который вы ищете). Замените... своими аргументами (concat...) или что угодно. Я настоятельно рекомендую использовать параметр -project в любом случае. Если вы этого не сделаете, и вы находитесь в буфере для файла, который находится вне проекта, script не найдет корень. Хуже того, если вы находитесь в файле в другом Android-проекте, он найдет корень этого проекта (возможно, даже скопирует gdb.setup и загрузится в него перед сбоем сеанса gdb). Так что дайте этот проклятый вариант. Если вы используете набор команд emacs desktop, сделайте следующее:

(gdb (concat "ndk-gdb --project=" desktop-dirname ...))

(предполагается, что ваш .emacs.desktop находится в корне проекта, конечно).

Теперь вы можете, наконец, отлаживать с помощью gud UI, устанавливая точки останова на уровне источника. Обратите внимание, что я использую emacs 23.3.1 (gdb-ui.el), поэтому нет необходимости иметь 24 для работы.

Ответ 2

Вы пробовали это?

Добавьте android-sdk-mac_x86/платформенные инструменты и android-ndk-r5b в среду PATH. После этого запустите режим gdb с помощью ndk-gdb script.

M-x gdb
Run gdb (like this): ndk-gdb --verbose --start --project=your_NDK_project_dir