Saltar al contenido

SIGTRAP a pesar de no establecer puntos de interrupción; punto de interrupción de hardware oculto?

Este team de redactores ha pasado horas buscando la solución a tus dudas, te brindamos la respuesta por esto nuestro deseo es serte de mucha apoyo.

Solución:

Está bien. Respuesta larga: los puntos de interrupción de hardware generalmente se establecen escribiendo en algunos registros especiales de la CPU. Esto lo hace gdb. Si gdb muere, puede dejar los instalados en la CPU. Supongo que su implementación (de gdb) no los borra ni los examina, cuando se conecta a su objetivo. Para ubicarlos, deberá enumerar el contenido de los registros de puntos de interrupción de hardware en su CPU (no sé cómo hacer esto en STM32). La solución alternativa sería (suposición informada) sería esta: establezca algunos puntos de interrupción de HW (por lo general, solo hay unos pocos, rara vez más de 8) usando gdb, luego elimínelos todos. Esto debería sobrescribir y luego limpiar esos registros hw. Una vez que establezca esos puntos de interrupción (antes de eliminarlos), “continúe” (por si acaso, ya que gdb establece puntos de interrupción solo en ese momento).

Lo siguiente me ayudó:

# Ones I hit the SIGTRAP:
(gdb) f 0  # Show the current stack frame of the current thread.
#0  0x4003ed70 in [email protected]@GLIBC_2.4 () from /opt/CodeSourcery/arm-2011.09/arm-none-linux-gnueabi/libc/lib/libpthread.so.0

# The fragment of interest is the current address: 0x4003ed70.
# Set the hardware assisted breakpoint at the current address:
(gdb) hbreak *0x4003ed70

# Continue execution (without hitting SIGTRAP):
(gdb) c
# Continuing.

SIGTRAP debe ser una instrucción de punto de interrupción que se está ejecutando.

Depure esto inspeccionando su puntero de instrucción, lo más probable es que apunte a una dirección que contiene la instrucción BKPT (tendrá que buscar cuál es el código real).

A partir de ahí, tendrá que trabajar hacia atrás en función de la pila y el puntero de instrucciones y ver si está donde espera estar. Puede haber una serie de cosas que causen esto, desde GDB insertando una instrucción de punto de interrupción que no pudo borrar, hasta daños en la memoria.

Si conservas alguna cuestión y forma de desarrollar nuestro reseña puedes dejar una observación y con placer lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *