Depuración remota de aplicaciones C++ con Eclipse CDT/RSE/RDT
gdb remote-debugging (5)
"depurar a través de" C ++ remote "Error: Programa no especificado (¿necesito el código local para eso?)"
Sí, porque los símbolos se cargan desde una copia local de código.
En la pestaña de depuración de este tipo de configuración de inicio, encontrará la configuración para el servidor y el puerto remotos. Use el nombre del equipo y el puerto que especificó cuando inició gdbserver.
AFAIK esto todavía no funcionará ya que gdb ejecutándose en su máquina de Windows local no soportará la depuración de los programas de Linux. Necesitará una compilación cruzada de gdb (configurado y compilado con host = mingw-o-something y target = linux).
Estoy peleando con Eclipse (en Windows) para conectarlo a mi caja de Linux y compilar y depurar el código C ++ de forma remota.
Lo que tengo trabajando:
- CDT / RSE / RDT instalado (Eclipse Juno, CDT 8.1.2, PTP (RDT) 6.0.4, RSE 3.4)
- rdt-server se ejecuta en el cuadro de Linux (
perl ./daemon.pl 4075
) - crear proyectos locales de C ++ (basado en Makefile)
- compilar y depurar proyectos locales de C ++
- crear proyectos remotos (usando la conexión "Linux" al servidor rdt)
- compilar proyectos remotos (basado en Makefile)
Algunas cosas manuales que puedo hacer (sin Eclipse):
- depuración "remota" de mis proyectos compilados:
ssh mybox ''cd /path/to/project; gdb main''
ssh mybox ''cd /path/to/project; gdb main''
- Inicie un gdbserver:
ssh mybox ''cd /path/to/project; gdbserver fqdn:10000 main''
ssh mybox ''cd /path/to/project; gdbserver fqdn:10000 main''
Lo que no funciona: Depurar en Eclipse
- depurar a través de la "aplicación C ++" Error: Programa no especificado (porque no tengo un código local)
- depurar a través de "C ++ remoto" Error: Programa no especificado (¿necesito código local para eso?)
- depurar mediante "C ++ attach" (Depurador: "gdbserver")
- gdbserver ejecutándose en linuxbox
- gdb no puede hablar con gdbserver (cygwin gdb 7.5, linux gdb / gdbserver 7.3); advertencia: la arquitectura rechazó la descripción proporcionada por el objetivo.
- depurar a través de "C ++ attach" (Depurador: "gdb") intentará adjuntar a mis procesos de Windows.
Otras cosas que pueden causar problemas:
- Estoy usando el binario
ssh
provisto con MSYS / Git (no enPATH
) - Cygwin no está en
PATH
Realmente me gustaría hacer la depuración remota en Eclipse para mis proyectos C ++. ¿Tiene alguna sugerencia de cómo proceder desde aquí?
Desafortunadamente, esta pregunta aún no dio como resultado la solución deseada. Sin embargo, podría interesarte cómo realmente "resolví" el problema:
Ahora estamos desarrollando directamente en las cajas de Linux, haciendo todo de forma remota. Configuramos usuarios de escritorio en las cajas de Linux e iniciamos sesión a través de VNC para ejecutar Eclipse y usarlo como front-end de gdb
. Si bien VNC no es la mejor solución (quizás intentemos NX más adelante) esta solución nos libera de cualquier problema con gdbserver
o RSE / RDT.
A partir de ahora (Luna M6), Eclipse CDT + RDT + RSE parece ser una cadena a la que le faltan algunos enlaces cuando se necesita:
- Ejecute IDE en su PC de escritorio
- Utilice la cadena de herramientas remota en el sistema de destino para construir en lugar de instalar una cadena de herramientas cruzada local
- Automatice la depuración y ejecute para que se ejecute en el sistema remoto con un solo clic (inicie gdbserver, conéctelo y proporcione el resultado de la consola)
Estos requisitos son bastante comunes hoy en día con respecto a la abundancia de tableros ARM de Linux como Raspberry Pi y OLinuxino. Estas placas suelen tener recursos suficientes para ejecutar una cadena de herramientas, pero no lo suficiente como para proporcionar un entorno de escritorio remoto para ejecutar el IDE de forma remota.
Mi solución final: después de varios días de esfuerzo, finalmente renuncié a Eclipse CDT + RDT + RSE para NetBeans C / C ++ Remote Development Environment, que funciona como un encanto para mí.
Puede probar este complemento con Eclipse, para la versión de aplicación paralela aquí hay un enlace
Funciona bien en el desarrollo de la máquina de Windows para programar en Linux
Verificación de integridad con CLI
Antes de hacer nada, asegúrese de:
- cross compila la aplicación correctamente y se ejecuta. No necesariamente necesitas hacer esto usando Eclipse.
- conseguir que la depuración remota de GDB funcione correctamente desde la línea de comando
Esta respuesta supone que puedes hacerlo en la junta de desarrollo:
sudo apt-get install gdbserver
gdbserver :1234 path/to/executable
Y en el host:
aarch64-linux-gnu-gdb /
-ex "target remote board-hostname:1234" /
-ex "file path/to/cross/compiled/executable" /
-ex ''tb main'' /
-ex c
y luego paso depurar todo correctamente.
Configuración de Eclipse
Probado en el host Ubuntu 16.04, Eclipse Oxygen 4.7.0 (descargado del sitio web), gdbserver
7.12, aarch64-linux-gnu-gdb
7.6.
He utilizado con éxito todos los siguientes métodos:
- manual
- automático
- autenticación de contraseña
- autenticación de clave pública
Manual
Con este método, debemos gdbserver
en el destino antes de ejecutar la depuración en Eclipse.
Pro: dispensa la configuración de conexiones SSH a través de Eclipse para permitir que Eclipse
Con: tienes que gdbserver
cada vez que se inicia la depuración. Esto podría ser superado si Eclipse entendiera gdbserver --multi
, ¿pero no creo que lo haga?
Debido a su simplicidad, le recomiendo que obtenga este método trabajando primero.
Abra las configuraciones de depuración y luego cree una nueva "Aplicación remota de C / C ++".
Debajo de la pestaña "Principal":
seleccione el "Nombre", "Proyecto" y "Aplicación C / C ++" como es habitual para una depuración local
en el iniciador inferior, haga clic en "Seleccionar otro", marque "Usar configuración específica de la configuración" y elija "Iniciador de depuración remota manual de GDB (DSF)"
Por qué hacemos esto: el
gdbserver
automático se conecta primero al tablero con SSH y lanza elgdbserver
por usted.
Debajo de la pestaña "Depurador":
"Depurador GDB": el mismo que el utilizado por CLI en el host,
aarch64-linux-gnu-gdb
para este ejemploSubpestaña "Conexión": configure el nombre de host y el puerto como pasados al host en la CLI (
board-hostname
and1234
)
Finalmente, ejecute manualmente gdbserver
en el destino tal como lo hicimos desde la CLI:
gdbserver :1234 path/to/executable
e inicie el depurador de Eclipse normalmente.
gdbserver
reiniciar gdbserver
cada vez que finaliza el programa.
Automático con autenticación de contraseña
Este es el mejor método para las juntas de desarrollo, que han solucionado las contraseñas conocidas públicamente.
Se conecta al objetivo con SSH y una contraseña, y lanza gdbserver
en el destino automáticamente cada vez, ¡lo cual es muy conveniente!
Target stdout gdbserver
va a la ventana "Consola" de Eclipse, lo que reduce aún más el cambio de ventana.
En el conjunto de Eclipse:
- solucionar el error "El almacenamiento seguro no pudo guardar la contraseña maestra" como se explica en: Cómo resolver "El almacenamiento seguro no pudo guardar la contraseña maestra" en la aplicación remota Eclipse CDT con conexión de depuración de contraseña SSH?
- establece el iniciador en: "Lanzador automático de depuración remota"
- establecer "Ruta absoluta del archivo absoluto para la aplicación C / C ++" a
/root/path/to/project/path/to/executable
- "Conexión", "Nuevo" y elija "Autenticación basada en contraseña"
Automático con clave pública
Muy similar a la autenticación con contraseña, excepto que debe ir a: "Conexión", "Nuevo", y elegir "Autenticación basada en clave pública"
Pros:
- supera el "Almacenamiento seguro no pudo guardar la contraseña maestra" si tiene una clave privada encriptada (insegura, pero está bien para
- para servidores, es probable que ya haya configurado la clave pública
Contras:
- la configuración de la clave puede doler la primera vez
- debe rehacer la configuración de la clave cada vez que se desborda el devboard
SSH puede conectarse sin una contraseña si usted:
- establecer
~/.ssh/authorized_keys
en el destino para contener el~/.ssh/id_rsa.pub
del host - tener una clave privada no cifrada en el host, que elude nuestros problemas de contraseña
- establecer permisos de carpeta molestos correctamente: https://unix.stackexchange.com/questions/36540/why-am-i-still-getting-a-password-prompt-with-ssh-with-public-key-authentication
Antes de utilizar este método, asegúrese de que sus claves autorizadas funcionen desde la línea de comandos, es decir, que ahora pueda hacer:
ssh user@host
sin escribir ninguna contraseña.
Cambiar el directorio de trabajo actual del proceso