Tengo un algoritmo que "a veces" no rompió la recursividad y termina en un desbordamiento de pila. Ahora quiero depurar esa situación. gdb me dirige directamente a la línea donde sobrescribo el borde de la pila, pero es imposible obtener un seguimiento de la pila porque gdb necesita un tiempo interminable para desenrollar la pila y mostrarla en ddd.
Ahora simplemente quiero reducir el tamaño de la pila para obtener la corrupción mucho antes. Así que necesito una forma de reducir a pila para mi tarea en ejecución. No hay subprocesos involucrados, por lo que no debería ser un gran problema.
Pero no tengo idea si gdb en sí tiene una opción para manipular la pila (tamaño) por sí mismo o si necesito cambiar el tamaño mediante programación al inicio de mi prog o tal vez pueda reducir el tamaño desde la línea de comando os (linux) después de iniciar el sesión de depuración.
Tal vez también sea posible la detención si el árbol de llamadas alcanza una profundidad máxima si gdb tiene esa opción.
Intente usar ulimit -s (stack_size) en el shell donde ejecuta su programa o puede hacerlo mediante programación Cambie el tamaño de la pila para una aplicación C++ en Linux durante la compilación con el compilador GNU
EDITAR:
Podemos escribir un programa simple similar a nohup, que se envía SIGSTOP a sí mismo y luego ejecuta sus argumentos. Llamémoslo runpaused
//runpaused.c #include <signal.h> #include <unistd.h> int main(int argc, char **argv) { raise(SIGSTOP); return execvp(argv[1], argv+1); }Entonces, podemos hacer las siguientes cosas: compilar runpaused
$ gcc runpaused.c -o runpausedlímite de pila para el shell actual
$ ulimit -s 32ejecute nuestro programa a través de runpaused, use sh como ejemplo
$ ./runpaused sh -c "echo Hello" Desde otra terminal: encuentre su PID
$ ps -ef | grep -v grep | grep runpausedcarga gdb con nuestro programa
$ gdb $(which sh) adjuntar a PID
(gdb) attach PID enviar señal SIGCONT desde gdb
(gdb) signal SIGCONT continuar la ejecución del programa desde gdb
(gdb) continueDespués de varias veces de continuar, obtenemos lo que queremos.