Cómo usar puntos de interrupción para la depuración

9

Los puntos de interrupción son una excelente manera de ver cómo se ejecuta el compilador en su código. Ahora mi pregunta es, ¿existe la posibilidad de usar puntos de interrupción cuando depure su código?

H. Pauwelyn
fuente

Respuestas:

9

Como se señaló en la respuesta de Majenko, el IDE de Arduino no proporciona un mecanismo de punto de interrupción, pero Atmel Studio admite puntos de interrupción . [*]

Sin embargo, si tiene un interruptor y un LED, puede seguir el progreso de su programa de una manera que proporcione algunos de los beneficios de los puntos de interrupción. Agregaría una subrutina, por ejemplo BPReport(), que a través de una salida en serie o una pantalla LCD informa los valores de las variables críticas, luego enciende el LED y espera hasta que el interruptor se haya presionado y liberado, con un rebote. Llame a su BPReport()rutina siempre que desee un punto de interrupción incondicional. Para puntos de interrupción condicionales, puede tener una rutina BPReportIf(cond)que llama BPReport()si condes verdadero. Si no desea emitir a través de serie, puede usar varios LED o una pantalla LCD, y puede usar varios interruptores si desea controles de interrupción externos (por ejemplo, condpodría ser una prueba de uno de los interruptores adicionales).

[*] Algunos depuradores de hardware modifican el código descargado cada vez que se agregan, cambian o eliminan puntos de interrupción. Ese uso desgastará la memoria flash más rápidamente que solo descargarla ocasionalmente. Si un chip se ha usado mucho para dicha depuración, no lo use en un sistema de producción.

James Waldby - jwpat7
fuente
4

Aunque Majenko su respuesta es correcta, hay algunas otras opciones.

En cuanto a la depuración de hardware real según lo declarado por majenko, diría:

  1. Instale y use un IDE real, como Atmel Studio o el plugin de eclipse de arduino llamado sloeber (soy autor), y
  2. Utilice un depurador de hardware completo o hardware que lo tenga a bordo como el Arduio zero o hardware que utilice otra tecnología de depuración como el ESP8266 que permite la depuración de USB

Otra opción de depuración de una categoría completamente diferente es organizar su código de modo que la lógica de decisión (independiente del hardware) y la acción (dependiente del hardware) estén completamente separadas.

Luego compile su bosquejo como un programa local y depure la "lógica de decisión" en su máquina local. Este método no permite la "depuración de hardware". Este método también permite pruebas unitarias.

Tenga en cuenta que su máquina local es probablemente un 32 o 64 amargo y la mayoría de los Arduino son 8 amargos, lo que dará como resultado diferencias en los tipos de datos, lo que es un punto de atención adicional al usar este método.

jantje
fuente
4

La biblioteca Arduino-Debug proporciona un depurador simple en el destino para los bocetos de Arduino. Los comandos de depuración se agregan directamente al boceto. Se inicia un shell de comando del depurador en puntos de quiebre y aserciones.

ingrese la descripción de la imagen aquí

La captura de pantalla anterior muestra el boceto de ejemplo ejecutado en un Arduino Mega con monitor de salida en serie utilizado por la aplicación y Serial1 utilizado para el shell del depurador.

Comandos de depuración de croquis

  • ASSERT (cond) Verifique la condición de afirmación. Si es falso, se llama al shell de depuración. El boceto no puede continuar.
  • BREAKPOINT () Se llama al shell de depuración.
  • BREAK_IF (cond) Se llama al shell de depuración si la condición es verdadera.
  • CHECK_STACK (habitación) Verifique que haya habitación (bytes) en la pila. Si es falso, se llama al shell de depuración.
  • DEBUG_STREAM (dev) Usa el dispositivo de transmisión dado para la sesión de depuración. Típicamente en serie.
  • OBSERVAR (expr) Imprime la expresión en la secuencia de depuración.
  • OBSERVE_IF (cond, expr) Imprime la expresión en la secuencia de depuración si la condición es verdadera.
  • REGISTER (var) Registre una variable para acceder desde el shell de depuración. Comandos de shell de depuración

Comandos de shell de depuración

  • ? VARIABLE Imprimir dirección y valor variables.
  • @VARIABLE Imprimir dirección variable de puntero y valor de referencia.
  • retroceder Imprimir simple pila de llamadas.
  • comandos Imprimir lista de comandos (ver también ayuda).
  • datos Imprimir contenidos del área de datos, es decir, variables globales.
  • Ir Deje el shell de depuración y continúe la ejecución del boceto.
  • montón Imprime el contenido del montón, es decir, los datos dinámicos asignados.
  • ayuda Imprimir lista de comandos.
  • memoria Imprime el estado de la memoria.
  • Salir Detener boceto.
  • pila Imprime el contenido de la pila, es decir, marcos de llamada, argumentos, direcciones de retorno.
  • variables Imprimir lista de variables registradas.
  • donde Imprimir el archivo de código fuente y la línea donde se llamó al shell de depuración.

Todos los comandos de shell de depuración se pueden abreviar a comandos de un solo carácter. Consulte el archivo README para obtener más detalles; detalles de instalación, ejemplo de boceto y evaluación comparativa.

Mikael Patel
fuente
1
La biblioteca donada de Mikael le permite establecer puntos de interrupción condicionales, imprimir valores de variables, estado de memoria, rastreos de llamadas y examinar y cambiar variables en un punto de interrupción. Pro: no necesita hardware ($$), no golpea tan duro en Flash (como establecer y eliminar puntos de interrupción con un depurador de hardware). ....
JRobert
1
.... Con: Mayor impacto en el espacio de código del programa, algo de espacio RAM y posiblemente en tiempo de ejecución, si se examina código de tiempo crítico; alguna curva de aprendizaje para compilar (y luego eliminar) las llamadas a la biblioteca; la necesidad de anticipar ubicaciones de puntos de ruptura o volver a compilarlas cuando descubra dónde las necesita. Los Contras no critican el trabajo de Mikael; Vienen con esta técnica.
JRobert
1
@JRobert Nice Pro-Con resumen! He tratado de abordar algunas de las desventajas permitiendo que el depurador se adapte. Hay un conjunto de definiciones que permitirán que las aplicaciones sensibles a la huella reduzcan el shell de depuración al mínimo. Como cualquier depurador para sistemas integrados, es difícil depurar código crítico (continuo) con puntos de interrupción. La única alternativa son los puntos de observación. Estos podrían optimizarse mediante el uso de un búfer de rastreo y eliminar la salida en serie en el código de tiempo crítico.
Mikael Patel
3

No en el IDE de Arduino.

Necesitas:

  1. Instale y use un IDE real, como Atmel Studio, y
  2. Use un depurador de hardware completo

No hay disposición para la depuración a través de la interfaz UART / USB utilizando el gestor de arranque.

Majenko
fuente