Ubuntu

Cómo solucionar problemas y bloqueos de aplicaciones con snapd gdbserver

Cómo solucionar problemas y bloqueos de aplicaciones con snapd gdbserver

A veces, es posible que las aplicaciones no funcionen bien o incluso que se bloqueen. Cuando ocurren tales problemas, es útil tener un método coherente y reproducible para desencadenar el problema, de modo que los desarrolladores puedan tener una forma confiable y datos suficientes para solucionar los problemas y producir una solución. En el mundo del software, GNU Debugger (gdb) es una herramienta poderosa que permite a los desarrolladores hacer precisamente eso.

Con las instantáneas, las cosas son un poco más complicadas. Las instantáneas se ejecutan como aplicaciones aisladas e independientes, con un fuerte confinamiento de seguridad. Son administrados y lanzados por el servicio snapd. Esto significa que si tuviera que invocar gdb para solucionar problemas de instantáneas que presentan problemas de inicio o tiempo de ejecución, la ejecución real de la aplicación quedará enmascarada por los procesos de snapd que la envuelven. Para evitar este fenómeno y brindar a los desarrolladores las herramientas adecuadas para el trabajo, el demonio snap también incluye gdbserver, que permite a los usuarios inspeccionar sus aplicaciones de una manera muy similar al sistema clásico de Linux.

Invocar gdbserver

Si ejecuta un snap con el indicador –gdb, gdb se iniciará y se comportará tal como lo haría si fuera llamado contra el mismo ejecutable fuera del entorno snap. Alternativamente, puede ejecutar gdbserver, que también le permite conectarse a gdb de forma remota, así como también ofrece la posibilidad de ejecutar aplicaciones como un usuario sin privilegios (estándar).

La sintaxis es la siguiente:

snap run --gdbserver “snap name”

Esto iniciará el complemento, detendrá la ejecución en el punto de entrada, creará una instancia de gdb y permitirá el acceso remoto a él a través de un puerto alto aleatorio que se imprimirá en la línea de comando.

snap run --gdbserver snapster

Welcome to "snap run --gdbserver".
You are right before your application is run.
Please open a different terminal and run:

gdb -ex="target remote :44626" -ex=continue -ex="signal SIGCONT"
(gdb) continue

or use your favorite gdb frontend and connect to :44626

Ejemplo practico

Echemos un vistazo a una aplicación que se bloquea cuando se invoca. Si deseas seguirlo, eche un vistazo a la siguiendo la esencia para obtener detalles sobre el código fuente real, los indicadores de compilación y el contenido de snapcraft.yaml de ejemplo de segmento.

snap run --gdbserver segfexample

Welcome to "snap run --gdbserver".
You are right before your application is run.
Please open a different terminal and run:
...

En una ventana de terminal separada, ejecutando gdb -ex = ”remoto de destino: 34621 ″ muestra la siguiente salida:

gdb -ex="target remote :34621" -ex=continue -ex="signal SIGCONT"
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
...

Para reanudar la ejecución, debe escribir cont hasta que encuentre el problema, tenga en cuenta que, como la mayoría de los problemas que puede solucionar con gdb, estos deben ser independientes del tiempo y reproducibles:

Program received signal SIGCONT, Continued.
0x00007f1255a0918b in raise () from target:/lib/x86_64-linux-gnu/libc.so.6
(gdb)

Reading /lib/x86_64-linux-gnu/libc.so.6 from remote target…
Reading /lib/x86_64-linux-gnu/libc-2.31.so from remote target…
Reading /lib/x86_64-linux-gnu/.debug/libc-2.31.so from remote target…

Program received signal SIGSEGV, Segmentation fault.
0x0000561bbcd5e6be in main () at source.c:11
11            pointer[i]=i;

Una vez que sepa dónde ocurre el problema, puede solucionarlo como lo haría normalmente. Puede establecer condiciones, puntos de interrupción, desensamblar el código y más. También necesitará símbolos de depuración para las versiones específicas de las bibliotecas que utilizan sus aplicaciones para poder descifrar las funciones donde ocurre el error. Si usa bibliotecas disponibles en los archivos de su sistema, puede instalar los paquetes de depuración correspondientes. Si está desarrollando su propia aplicación, compílela con símbolos o cargue los símbolos en el depurador.

Resumen

La resolución de problemas nunca es fácil. A veces, puede haber problemas complejos en el software y puede llevar tiempo y esfuerzo resolverlos. Con ese fin, los ecosistemas de desarrollo deben diseñarse con tanta previsión y flexibilidad como sea posible, para proporcionar a los desarrolladores una configuración amigable y eficiente que pueda ayudarlos a corregir errores de código. Con gdbserver, snapd ofrece a los editores (y usuarios) de snap una forma conveniente de investigar y resolver errores y fallas repetibles sin comprometer los beneficios del confinamiento de seguridad snap.

Si tiene alguna sugerencia sobre cómo hacer que la solución de problemas de aplicaciones sea aún más útil y resistente, únase nuestro foro y comparte tus pensamientos.

Foto por christian buehner en Unsplash.

Leave a Comment

You may also like

Más