scripts script resueltos programas programacion pasar parametros manejo español ejercicios ejemplos comandos cadenas linux shell debugging gdb

programas - scripts linux ejercicios resueltos



gdb cómo ejecutar el programa de destino desde el script (2)

Quiero depurar un programa, usando gdb. Pero invoco ese programa a través de un script.

¿Cómo puedo usar gdb? El script es largo y no me es posible invocar el programa directamente usando argumentos de línea de comando de gdb.

Además, el proceso que se crea cuando se inicia el script es de corta duración, por lo que no puede adjuntar gdb al proceso.

Lo que quiero hacer es algo como, iniciar gdb con ese programa, agregar mis puntos de interrupción y luego ejecutar el guión (para su información, también toma argumentos), y luego cuando llegue al punto de interrupción haga lo que quiera.

Miré la opción shell en gdb, pero eso genera un nuevo shell si no me equivoco y regreso a gdb cuando haya terminado. Esto no es lo que quiero.

Por favor, avíseme si hay una mejor manera.


Hay varias formas.

La verdadera forma de la vieja escuela es hackear un círculo en el main tu programa como:

volatile int zzz; ... int main() { while (!zzz) sleep (1);

Luego, ejecuta tu script. En una ventana separada, ejecute gdb en el programa que desea depurar y use attach para adjuntarlo al programa sleeping. Luego puede establecer puntos de interrupción, etc., y finalmente:

(gdb) set var zzz = 1 (gdb) cont

Una forma ligeramente más nueva ("nueva" que en "ha estado en gdb al menos 10 años") es editar su secuencia de comandos y colocar un gdb --args antes de la invocación del programa que desea depurar. Sin embargo, este método no siempre funciona. No maneja las redirecciones correctamente, entre otras cosas.

Finalmente, puede usar la depuración multi-inferior. Este es el enfoque "más nuevo" de todos. Aquí estoy siguiendo mi propia publicación de blog sobre el tema:

$ gdb /bin/sh # or whatever runs your script (gdb) set args arguments-to-the-script (gdb) set detach-on-fork off (gdb) set target-async on (gdb) set non-stop on (gdb) set pagination off

Entonces puedes hacer algo como:

(gdb) add-inferior -exec program-you-want-to-debug

... luego cambia a esos puntos de inflexión inferiores y establecidos. Ahora vuelve al primer inferior y run : ¡todo debería funcionar!


Un par de métodos que he usado en el pasado.

  1. yourprog nombre de yourprog a yourprog.real . Cree un script llamado yourprog que ejecute gdb --args yourprog.real "$@" .
  2. Haga que su yourprog invoque gdb en su propio pid , luego llame a sleep en un bucle.