Antecedentes: estoy asignando mis propios contextos de máquina y pilas con la familia de funciones getcontext(3)
/makecontext(3)
/setcontext(3)
(ucontext.h
; SUSv2, POSIX.1-2001).¿Cómo determina GDB la parte inferior de la pila?
Cuando uso gdb (versión 6.1.1) para examinar una pila mientras el hilo está en uno de estos contextos que he asignado, parece que gdb no sabe dónde está el final (parte inferior lógica) de la pila es. Por ejemplo, he aquí una pila de x86 FreeBSD:
#0 0x2872d79f in poll() from /lib/libc.so.7
#1 0x28646e23 in poll() from /lib/libthr.so.3
#2 0x2869b267 in fdtask (task=0x28a3dc40, v=0x0) at fd.c:58
#3 0x2869c8dc in taskstart (y=681827392, x=0) at task.c:58
#4 0x00000000 in ??()
#5 0x28a3dc40 in ??()
#6 0x00000000 in ??()
#7 0x00000000 in ??()
…
#65 0x00000000 in ??()
…
(Sí, esto se construye encima de Russ Cox' libtask library.)
ejecución de este contexto comienza en la función taskstart
, pero parece que el BGF no puede entender que debe dejar de tratar de leer la pila a pesar de que golpea una dirección de retorno de NULL en ese marco.
Mi pregunta es: ¿hay algo que pueda hacer (formateando la pila de alguna manera, o estableciendo un registro, cualquier cosa) para ayudar a GDB a entender dónde está la parte superior de la pila? Gracias.
Edición: Conclusión: parece que una forma en que gdb 6.1.1 detecta el final de la pila es comprobando que el puntero de cuadro almacenado sea NULO; Resolví el problema para mi caso de uso modificando la función x86 y amd64 makecontext(2)
para restablecer ebp o rbp a cero al inicializar el nuevo contexto. (En este caso, no me importan otras arquitecturas.) Este problema desaparece con gdb 7.1; presumiblemente gdb 7.1 es capaz de detectar el final de la pila a través de otros medios, como debuginfo.
esto suena como una pregunta que hacer sobre los desarrolladores de GDB lista de correo. –