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

2

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 ), eventualmente obtengo:

(gdb) n 
0x0800f498 in ?? ()

ahora si retrocedo (usando bt ) justo después de recibir:

(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í? ¿Ver la ayuda del archivo linker map ?

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
    
pregunta Randomblue

2 respuestas

6

Tienes dos problemas:

  1. Su depurador no conoce las excepciones de ARMv7-M.
  2. Su código activa 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 0x0800f498 podría estar en el controlador de excepciones Hard Fault . Usualmente utilizo mi propio controlador con una secuencia de parpadeo especial de LED, así que sé cuando las cosas salieron mal.

El gdb en Sourcery CodeBench tiene soporte para este modelo de excepción, pero es posible que necesite un archivo target.xml para habilitarlo.

    
respondido por el Turbo J
1

El número hexadecimal es el valor del contador del programa o la dirección de la pila (verifique 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 el indicador -g ), el depurador debe poder imprimir correctamente el nombre de la función.

Para resolverlo usted mismo, puede estudiar el archivo de mapa o usar address2line , que debería estar en su cadena de herramientas de GNU ARM.

    
respondido por el Toby Jaffey

Lea otras preguntas en las etiquetas