SIGTRAP problema

SIGTRAP problema

de Gonzalo Niski Vazquez -
Número de respuestas: 6

Estimados,

estoy teniendo un problema corriendo despreloj. El debugger me da el mensaje "Program received signal SIGTRAP, Trace/breakpoint trap." Me da la impresión que estoy teniendo problemas con el RET de alguna subrutina, y que por alguna razón no loopea correctamente. ¿A alguien le pasó? ¿Puede tener que ver con el org de la tabla, que me esté modificando de alguna manera el retorno de la subrutina.

Gracias por adelantado

En respuesta a Gonzalo Niski Vazquez

Re: SIGTRAP problema

de Gonzalo Niski Vazquez -

Para añadir al problema, me pasa que hay un comportamiento extraño de los breakpoints. El programa se ejecuta bien, con la salida correcta, una sola vez, llamando en el medio varias subrutinas. Si pongo un breakpoint antes del RET de la subrutina principal, entonces el programa se ejecuta correctamente hasta ese breakpoint, llamando y corriendo correctamente todas la subrutinas llamadas antes del RET final.

El problema es que si pongo breakpoints en las subrutinas llamadas por la subrutina principal, no se ejecutan todas, y de forma aparentemente arbitraria me tira lo del SiGTRAP mencionado anteriormente, sin llegar a completar la ejecución ni siquiera una vez.

Debe ser algo tonto con las direcciones, pero me estoy quemando el cerebro y no le encuentro la vuelta.

Agradezco cualquier comentario


En respuesta a Gonzalo Niski Vazquez

Re: SIGTRAP problema

de Francisco Veirano -

No entendi del todo el problema, pero si estas teniendo problemas con el retorno de las subrutinas, yo revisaría el stack a ver si esta guardando bien las direcciones de retorno. ¿Inicializaste el stack pointer? ¿Los push y pop son correctos?

Francisco

En respuesta a Gonzalo Niski Vazquez

Re: SIGTRAP problema

de Leonardo Etcheverry -

Algunas ideas:

  • Luego de compilar tu programa, dale un vistazo al listado en la consola de notepad++ que te muestra en que direcciones quedaron tus subrutinas y variables. Tus rutinas y datos deberían estar desde la 0xb000 en adelante (ese es el espacio reservado para su programa)
  • Verifica que estas inicializando el SP correctamente, y que tus subrutinas y variables no se solapen con el stack en memoria.
  • Verifica que no estás ejecutando los datos de una tabla como si fueran instrucciones. Por ejemplo:
    rutina:
    una_tabla:
    .db 0x00
    .db 0xFF
    ...
    ; 
    ...
    fin_rutina: RET

Si alguien hace un call a una subrutina escrita de esa forma, el procesador va intentar ejecutar la instruccion correspondiente a los bytes 0x00, 0xFF, etc. como si fueran instrucciones cuando en realidad son datos. Algunos de los datos de la tabla podrian resultar ser opcodes de instrucciones de control (JP, JR, CALL, RET) y la ejecución se va para cualquier lado.

Saludos, Leonardo.

En respuesta a Gonzalo Niski Vazquez

Re: SIGTRAP problema

de Gonzalo Cu -

Nosotros tuvimos un error sigtrap cuando tratamos de inicialisar el PC en 0xB000 que es donde se supone debemos escrivir, si iniciamos desde 0x0000 no hay problema, puede que los valores de memoria sean relativos al 0xB000 ? siendo 0xB000 el 0x0000 para nosotros