Интеграция Android ndk в ndk-GDB с Emacs? - PullRequest
20 голосов
/ 11 февраля 2011

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

Справочная информация.darwin10.5.0, NS apple-appkit-1038.35) 2010-12-15 на OSX 10.6.6 с android-режимом, с использованием android-ndk-r5b и смешанного кода java / c / c ++ для цели android.

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

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

[Appended]

Запуск Mx gdb с ndk-gdb в качестве команды gdb (см. ниже)) в результате получается буфер с именем gud с модельной линией со словами "(Отладчик: запустите [инициализация ...])".Буфер не принимает команды gdb и не принимает команды emacs gdb - (Ms, Mn и т. Д. Приводят к <>

Вывод:

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* также созданы, но они пусты.

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

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

Ответы [ 2 ]

4 голосов
/ 10 марта 2012

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

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

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

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

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

Поищите в скрипте «PROJECT = $ OPTION_PROJECT».Вы будете в длинном предложении if ... else ... fi, отвечающем за поиск корня проекта (если он не был задан с параметром --project, хотя это НЕ БУДЕТ решить проблему, которую япоговорим о смотри ниже).После fi добавьте эту строку:

cd $PROJECT

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

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

(gdb "ndk-gdb ...")

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

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

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

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

3 голосов
/ 24 февраля 2011

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

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

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