Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

267
Vistas
reduzca el tamaño de la pila en la sesión de depuración para detectar la recursividad sin fin

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.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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 runpaused

límite de pila para el shell actual

 $ ulimit -s 32

ejecute 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 runpaused

carga 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) continue

Después de varias veces de continuar, obtenemos lo que queremos.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda