Estoy usando GDB para depurar un programa para un Cortex M3. En las funciones donde el programa falla, cuando ejecuto línea por línea (usando n
), finalmente obtengo:
(gdb) n
0x0800f498 in ?? ()
ahora, si retrocedo (usando bt
) justo después de obtener:
(gdb) bt
#0 0x0800f498 in ?? ()
#1 0xfffffff8 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
¿A qué se refieren exactamente las direcciones 0x0800f498
y 0xfffffff8
? ¿Cómo llegué allí? ¿ Ayudaría mirar el map
archivo del enlazador?
Editar : cuando hago info registers
esto es lo que obtengo:
info registers
r0 0x2001ffe8 537001960
r1 0x0 0
r2 0x0 0
r3 0x7ada53e6 2061128678
r4 0x0 0
r5 0x0 0
r6 0x0 0
r7 0x0 0
r8 0x0 0
r9 0x0 0
r10 0x0 0
r11 0x0 0
r12 0x0 0
sp 0x2001ffb0 0x2001ffb0
lr 0xfffffff9 4294967289
pc 0x800f499 0x800f499
fps 0x0 0
cpsr 0x1000023 16777251
Tienes dos problemas:
En este caso, el depurador se confunde con el valor mágico 0xFFFFFFFx en LR. Puede intentar inspeccionar manualmente los valores de registro guardados en la pila para ubicar el valor de PC original.
La dirección 0x0800f498
podría estar en el Hard Fault
controlador de excepciones. Usualmente uso mi propio controlador con una secuencia especial de parpadeo de LED para saber cuándo las cosas salieron mal.
El gdb en Sourcery CodeBench admite este modelo de excepción, pero es posible que necesite un target.xml
archivo para habilitarlo.
El número hexadecimal es el valor del contador del programa o la dirección de la pila (consulte sus manuales), el "??" es la función que se está ejecutando actualmente.
Si compila su código con símbolos de depuración (con gcc necesita usar la -g
bandera), entonces el depurador debería poder imprimir correctamente el nombre de la función.
Para resolverlo usted mismo, puede estudiar el archivo del mapa o usar address2line
el que debería estar en su cadena de herramientas GNU ARM.
-g
bandera. Por lo general, imprime el nombre de la función muy bien, pero aquí, donde mi programa falla, se confunde.
Stefan Paul Noack
0xfffffff8
se ve raro, quizás la conjetura "¿pila corrupta?" es correcto.turbo j
LR = 0xFFFFFFF9
es un valor "mágico" para el retorno de excepción.toby jaffey