¿Qué significa 0x0800f298 en ?? () ¿significar?

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 0x0800f498y 0xfffffff8? ¿Cómo llegué allí? ¿ Ayudaría mirar el maparchivo del enlazador?

Editar : cuando hago info registersesto 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
esa es solo la dirección de retorno, ya que está en la pila y un depurador indefenso que no sabe a qué se refiere. ¿Cómo debemos saber? pero 0xfffffff8se ve raro, quizás la conjetura "¿pila corrupta?" es correcto.
Realmente necesita leer las especificaciones de Cortex M3 en ARM ARM para ARMv7-M. LR = 0xFFFFFFF9es un valor "mágico" para el retorno de excepción.
@TurboJ Deberías hacer de esto una respuesta, así puedo votarla

Respuestas (2)

Tienes dos problemas:

  1. Su depurador no conoce las excepciones ARMv7-M.
  2. Su código desencadena una falla probablemente debido a un error de programación, como olvidarse de habilitar un reloj periférico.

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 0x0800f498podría estar en el Hard Faultcontrolador 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.xmlarchivo 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 -gbandera), 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 address2lineel que debería estar en su cadena de herramientas GNU ARM.

Estoy depurando con la -gbandera. Por lo general, imprime el nombre de la función muy bien, pero aquí, donde mi programa falla, se confunde.
Entonces su programa probablemente destruyó el marco de la pila, lo que significa que no puede depurarlo. Intente captar la instrucción antes de que falle con un solo paso. Utilice puntos de interrupción para reducir el espacio de búsqueda.