¿Cómo resolver el problema de cambiar manualmente el puntero de la pila cuando se pierde GDB?
1. Primero verifique el contenido del marco de la pila
(gdb) bt
#0 0x6a696968 en ()
#? 1 0x6c6b6b6a en ()
#2 0x6e6d6d6c en ()
#3 0x706f6f6e en ()
#4 0x72717170 en () ? p>
#5 0x74737372 en ?()
#6 0xbff60074 en ? ()
El rastreo se detiene: el marco anterior apunta a este marco (¿la pila está dañada? p>
Todos los punteros de función en la pila aparecen como "?" y no se puede obtener información de ellos
Todos los punteros de función en la pila aparecen como "?" Sospechando un desbordamiento del buffer de la pila.
Mirando la última línea, nos dice que puede haber un error en el puntero de la pila, así que todo lo que tenemos que hacer es verificar qué pasó con el puntero de la pila.
(gdb) x/30c $esp-15
0xbff6a311: 99 'c' 99 'c' 100 'd' 100 'd' 101 'e' 101 'e' 102 'f' 102 ' f'
0xbff6a319: 103 'g' 103 'g' 104 'h' 104 'h' 105 'i' 105 'i' 106 'j' 106 'j'
0xbff6a321: 107 'k' 107 'k' 108 'l' 108 'l' 109 'm' 109 'm' 110 'n' 110 'n'
0xbff6a329: 111 'o' 111 'o ' 112 'p' 112 ' p' 113 'q' 113 'q'
(gdb) p (char *)$esp-20
$1 = 0xbff6a30c "\005aabbccddeeffgghhiijjkkllmmnnooppqqrrsstt"
(gdb) p (char *)$ esp 20
$2 = 0xbff6a334 "t"
Se encuentra que ambos lados del registro esp son cadenas, y el problema es Aquí está: el puntero de salto empujado a la pila cuando se llamó inicialmente a la función fue sobrescrito por la cadena y, como resultado, no se encontró la dirección de retorno cuando la función regresó y ocurrió un error de segmentación.
3. Encuentra errores en el código fuente.