2011-02-11 23 views
20

¿Alguien puede decirme cómo ejecutar ndk-gdb desde dentro de emacs usando gdb-mode? Actualmente lo estoy ejecutando en un shell buffer. Lo que me gustaría tener es una forma de sincronizar automáticamente un buffer de archivos fuente con la pc actual en gdb cuando rompo o paso. Algo más, como establecer saltos desde el origen, los búferes que muestran gdb locales, etc., y los atajos de teclas para los comandos de gdb serían gravy.Integración de ndk-gdb de android ndk con emacs?

Antecedentes: Estoy desarrollando en GNU Emacs 23.1.90.1 (i386-apple-darwin10.5.0, NS apple-appkit-1038.35) de 2010-12-15 en OSX 10.6.6 con modo android, usando android -ndk-r5b y código mixto java/c/C++ para un destino de Android.

Android-mode y shell (ejecutando ndk-gdb) dentro de emacs me permiten ver casi todo lo que necesito, pero mi configuración sería más conveniente si pudiera obtener un buffer fuente para sincronizar con el depurador, o obtener el equivalente a lo que se describe en EmacsWiki here.

FYI, Actualmente estoy usando eclipse para la depuración y desarrollo del lado de Java, pero es inestable y difícil de configurar para el trabajo nativo, a pesar de la disponibilidad de sequoyah, y además, eclipse no es emacs.

[Appended]

Ejecución de GDB Mx con NDK-BGF que el comando gdb (ver más abajo) se traduce en un buffer llamado Bueno sin contar con decir una modeline "(depurador: ejecutar [... inicialización]) ". El búfer no acepta comandos de GDB, ni acepta comandos de Emacs GDB - (MS, Mn, etc. resultado en <>

Salida:

 
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". 

tampones llamados *threads of*, *input/output of* y *breakpoints of* también se crean, pero están vacías.

navegación a través de la fuente de gDB-mi.el de mis emacs, y comparando con el gDB-debug-log de salida, parece que gDB-mi está intentando enviar estos parámetros para un ejecutable de gDB, pero el servidor gdb no responde ing a los comandos como se esperaba?

Tenga en cuenta que ejecutar Mx gud-gdb con la línea de comando para ndk-gdb parece dar como resultado el equivalente de ejecutar ndk-gdb dentro de un shell, por lo que el problema parece estar dentro de la configuración de gdb-mode en emacs .

+0

Así que mi interpretación aquí es que ndk-gdb se ejecuta correctamente, pero que '** gdb-mode ** de emacs está interpretando comandos y no se está comunicando correctamente con ** gdb-server **, que es el lado del host de la conexión de depuración. – forksandhope

Respuesta

3

¿Has probado esto?

Agregue android-sdk-mac_x86/platform-tools y android-ndk-r5b al entorno PATH. Después de eso, inicie el modo gdb con el script ndk-gdb.

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

bueno, curiosamente mi variable de entorno PATH no está siendo recogida por emacs-gdb .. Tengo que hacer esto '/ Desarrollador/android-ndk-r5b/ndk-gdb --verbose --start --adb =/Desarrollador/android-sdk-mac_x86/platform-tools/adb --project =/Developer/Projects/testproj 'para que ndk-gdb funcione correctamente. – forksandhope

+0

Como verá en mis ediciones anteriores, sí, he intentado ejecutar gdb de esa manera, y no da como resultado una conexión útil entre emacs y el ejecutable gdb-server que se ejecuta ndk-gdb. ** ¿Esto funciona para usted? ** En caso afirmativo, ¿ha realizado alguna configuración específica para que funcione? – forksandhope

+0

Probé varias versiones de Emacs, la versión 23.2 (9.0) funciona, pero la versión 24.0.50 (9.0) no funciona igual que su situación (comando no definido: "1-inferior-tty-set"). No tengo archivos .emacs, no estoy seguro de la diferencia. –

4

que tenían el mismo problema cuando se ejecuta GDB bajo Emacs: el * * Bueno sin contar ventana no estaba respondiendo a los comandos. Sin embargo, ndk-gdb funcionaba bien en un shell. Para hacerlo funcionar bajo la interfaz de usuario emacs gud, tuve que modificar un poco el script ndk-gdb.

de guardia para GDB (última línea), haga lo siguiente:

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

La opción --annotate = 3 es obligatoria para emacs interfaz gud, no puede trabajar sin él (por eso * Bueno sin contar * no era respondiendo).

Pero estás a medio camino. Ahora funcionará, pero solo si invocas ndk-gdb mientras estás en un búfer desde un archivo en la raíz del proyecto (como AndroidManifest.xml). Dado que esto es muy improbable la mayor parte del tiempo porque usted es un programador de C/C++ y las fuentes en las que está trabajando están bajo el directorio jni o más profundo, necesita hacer un poco más. La secuencia de comandos ndk-gdb es un poco problemática y te confundirá felizmente con esta (y la propia gdb tampoco ayudará mucho).

Busque en el guión "PROJECT = $ OPTION_PROJECT". Estarás en una cláusula larga si ... else ... fi que está a cargo de encontrar la raíz del proyecto (si no se ha dado con la opción --proyecto, aunque al hacerlo NO resolverá el problema que yo hablar, ver abajo). Después de la fi, añada esta línea:

cd $PROJECT 

Por alguna oscura razón, el guión no entra en el directorio raíz del proyecto. Esto conduce a un comportamiento muy incorrecto cuando se trata del archivo gdb.setup donde el script asume estar en la raíz del proyecto. Agregar esta línea lo arreglará.

Asegúrate de que llamar NDK-BGF dentro de Emacs con el comando habitual:

(gdb "ndk-gdb ...") 

¿No uso GUD-GDB (curiosamente, esto es viejo emacs forma de usar el BGF y no tiene nada que ver con la agradable interfaz de usuario que está buscando). Reemplace ... con sus argumentos, (concat ...) o cualquier cosa que desee. Recomiendo utilizar la opción --proyecto de todos modos. Si no lo hace y está en un búfer para un archivo que está fuera del proyecto, el script no encontrará la raíz. Peor aún, si está en un archivo en otro proyecto de Android, encontrará la raíz de ese proyecto en su lugar (tal vez incluso copiando gdb.setup y stuffs antes de fallar en la sesión de gdb). Así que dale esa maldita --opción de proyecto. Si está usando emacs conjunto de comandos de escritorio, hacer esto:

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

(suponiendo que su .emacs.desktop está en la raíz del proyecto, por supuesto).

Ahora puede finalmente depurar con la interfaz de usuario de gud, estableciendo puntos de interrupción en el nivel de origen. Tenga en cuenta que utilizo emacs 23.3.1 (gdb-ui.el), por lo que no es necesario tener 24 para que esto funcione.