UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

16.2. La pila de llamadas

El comando where muestra en cualquier instante de la ejecución lo que se denomina la pila de llamadas. Esta pila no es más que la secuencia de funciones que están siendo ejecutadas en ese instante. Por ejemplo:

(gdb) r
Starting program: /home/test/gdb_use 

Program received signal SIGSEGV, Segmentation fault.
0x08048441 in check (table=0x804a008) at gdb_use.c:29
29          if ((table[y].data + 1) != table[y].next->data)
(gdb) where
#0  0x08048441 in check (table=0x804a008) at gdb_use.c:29
#1  0x0804849f in main (argc=1, argv=0xfefff604) at gdb_use.c:43
(gdb) 

El mensaje anterior muestra cómo el programa se ha detenido en la función check, concretamente en la línea 29, que a su vez ha sido invocada por la función main en la línea 43. Nótese que estas líneas aparecen en orden inverso al que se producen. La primera llamada en producirse, obviamente, ha sido la llamada en la función main, línea 43.

Por defecto, el depurador se detiene en el código de la última llamada. Pero a menudo es preciso moverse a través de esa pila y situarse en una llamada anterior. Los comandos up y down permiten moverse por la pila de llamada y seleccionar cualquiera de ellas. La utilidad de estos comandos será más aparente cuando se utilice en combinación con los comandos de visualización de datos.

(gdb) where
#0  0x08048441 in check (table=0x804a008) at gdb_use.c:29
#1  0x0804849f in main (argc=1, argv=0xfefff604) at gdb_use.c:43
(gdb) up
#1  0x0804849f in main (argc=1, argv=0xfefff604) at gdb_use.c:43
43        if (check(buf))
(gdb) down
#0  0x08048441 in check (table=0x804a008) at gdb_use.c:29
29          if ((table[y].data + 1) != table[y].next->data)
(gdb)