Depuración remota de un proceso de Linux desde Windows con gdb y gdbserver: ¿qué se necesita exactamente en el lado de Windows?
eclipse-cdt (5)
Estoy ejecutando Eclipse CDT en Windows para desarrollar un código C construido y probado en sistemas remotos de Linux. Actualmente, el código nunca se compila en Windows.
Puedo usar CDT para comenzar el proceso remoto en el destino de Linux en gdbserver y luego adjuntar gdb desde el host de Windows. Sin embargo, gdb falla inmediatamente con errores como:
warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB. Attempting to continue with the default i386 settings.
[...]
Remote ''g'' packet reply is too long: 74afe9bff0aee9bf02000000f4af4a00a0aee9bf[...]
La depuración entre dos sistemas Linux funciona bien, así que está claro que estoy haciendo algo mal en el lado del host de Windows. Mis preguntas específicas son:
¿Es la versión Cygwin de gdb suficiente para depurar procesos remotos de Linux, o necesito un cross-gdb especial para ejecutarlo en Windows y trabajar con procesos de Linux? Si es así, ¿hay algún lugar donde pueda obtener un gdb de este tipo?
La depuración remota con gdb requiere que los símbolos estén disponibles en el sistema host. ¿Cuál es la forma más fácil de lograr esto? ¿Puedo copiar los símbolos producidos por la compilación en el destino de Linux al host de Windows, o tengo que hacer que una compilación completa funcione en Windows? ¿Hay alguna forma de evitar este requisito, de modo que pueda suministrar símbolos solo en el objetivo?
Gracias,
-R
Más información: Las preguntas frecuentes de RSE ofrecen algunos consejos, pero desafortunadamente todavía estoy bloqueado. El FAQ describe dos enfoques:
- Inicie el cliente gdb en el sistema remoto a través de ssh. El problema aquí es que ciertos campos en el iniciador de depuración de CDT están vinculados al sistema local (ruta del proyecto, ruta ejecutable, etc.).
- Cree / obtenga una versión de depuración cruzada de gdb que admita la depuración de procesos Linux desde Windows. El problema aquí es que hay poca información sobre cómo lograr esto.
También he planteado este tema en el foro de CDT .
Ahora hay un plugin http://marketplace.eclipse.org/content/direct-remote-c-debugging
Lo que le permite iniciar gdb en el servidor de forma remota a través de ssh. Se encarga de trazar mapas y otras cosas.
No es necesario que el servidor gdb se ejecute de forma remota
Configurar un entorno de compilación cruzada o depuración cruzada con gcc / gdb es un problema muy difícil, y casi nunca es la solución más eficiente. Poner una máquina virtual Linux en su caja de ventanas, y la depuración allí, será mucho menos trabajo. Si realmente necesita depurar ''allí'', sugeriría simplemente ssh-ing y usar gdb de línea de comandos. Si no puede tener la fuente allí, la depuración remota de una máquina virtual Linux bajo su control sería práctica.
El desarrollo de software es generalmente mucho más fácil en Linux que en Windows. Pero eso está fuera de tema.
Lo que es importante cuando depura binarios compilados de forma cruzada es que utiliza gdb de compilador cruzado, no host gdb. Por ejemplo, no puede usar gdb built for windows para depurar un proceso de linux (puede hacerlo, pero no se recomienda). Debe usar el compilador cruzado gdb para depurar el proceso remoto (que es parte de la misma cadena de herramientas que se utilizó para construir el binario). Como usted dice que nunca compila en Windows, estoy bastante seguro de que este podría ser su problema. La forma más fácil de hacerlo funcionar es simplemente usar gdb desde la línea de comandos en la máquina remota, donde compila, y hacer su depuración a través de ssh.
Simplemente reconstruir gdb con soporte de plataforma de destino. Puedes usar Cygwin para esto. Ejemplo para la plataforma de destino RHEL:
> wget http://ftp.gnu.org/gnu/gdb/gdb-<ver>.tar.xz
> tar -xJvf gdb-<ver>.tar.xz
> mkdir -p gdb-<ver>/build/x86_64-redhat-linux-gnu
> cd gdb-<ver>/build/x86_64-redhat-linux-gnu
> ../../configure --target=x86_64-redhat-linux-gnu
> make && make install
> x86_64-redhat-linux-gnu-gdb.exe --version
No olvides reconfigurar tu cadena de herramientas después de esto. Para obtener el nombre de configuración de destino, puede utilizar:
> echo ${BASH_VERSINFO[5]}
Visual Studio Community Edition 2017 presenta herramientas de compilación cruzada y depuración GDB. Combine esto con un servidor Linux o con el subsistema Windows Linux y podrá desarrollar de manera confiable el código C para sistemas Linux. Echa un vistazo a esta guía.