Comment utiliser les points d'arrêt pour le débogage

9

Les points d'arrêt sont un excellent moyen de voir comment le compilateur s'exécute sur votre code. Maintenant, ma question est, est-il possible d'utiliser des points d'arrêt lorsque vous déboguez votre code?

H. Pauwelyn
la source

Réponses:

9

Comme indiqué dans la réponse de Majenko, l'IDE Arduino ne fournit pas de mécanisme de point d'arrêt, mais Atmel Studio prend en charge les points d'arrêt . [*]

Cependant, si vous avez un interrupteur et une LED, vous pouvez suivre la progression de votre programme d'une manière qui offre certains des avantages des points d'arrêt. Vous ajouteriez un sous-programme, disons BPReport()que via une sortie série ou un écran LCD signale les valeurs des variables critiques, puis allume la LED et attend que l'interrupteur ait été enfoncé et relâché, avec anti-rebond. Appelez votre BPReport()routine où vous voulez un point d'arrêt inconditionnel. Pour les points d'arrêt conditionnels, vous pouvez avoir une routine BPReportIf(cond)qui appelle BPReport()si condest vrai. Si vous ne voulez pas sortir via série, vous pouvez utiliser plusieurs LED ou un LCD, et vous pouvez utiliser plusieurs commutateurs si vous voulez des contrôles de coupure externes (par exemple, condpourrait être un test de l'un des commutateurs supplémentaires).

[*] Certains débogueurs matériels modifient le code téléchargé chaque fois que des points d'arrêt sont ajoutés, modifiés ou supprimés. Cette utilisation épuisera la mémoire flash plus rapidement que le simple téléchargement occasionnel. Si une puce a été largement utilisée pour un tel débogage, n'utilisez pas cette puce dans un système de production.

James Waldby - jwpat7
la source
4

Bien que Majenko sa réponse soit correcte, il existe d'autres options.

En ce qui concerne le vrai débogage matériel tel que déclaré par majenko, je dirais:

  1. Installez et utilisez un véritable IDE, comme Atmel Studio ou le plugin eclipse arduino appelé sloeber (je suis l'auteur), et
  2. Utilisez un débogueur matériel complet ou un matériel qui l'a embarqué comme l'Arduio Zero ou du matériel utilisant une autre technologie de débogage comme l'ESP8266 qui permet le débogage USB

Une autre option de débogage d'une catégorie complètement différente consiste à organiser votre code afin que la logique de décision (indépendante du matériel) et l'action (dépendante du matériel) soient complètement séparées.

Compilez ensuite votre croquis en tant que programme local et déboguez la "logique de décision" sur votre machine locale. Cette méthode ne permet pas le "débogage matériel". Cette méthode permet également des tests unitaires.

Notez que votre machine locale est probablement un 32 ou 64 amers et la plupart des Arduino sont 8 amers, ce qui entraînera des différences dans les types de données, ce qui constitue un point d'attention supplémentaire lors de l'utilisation de cette méthode.

jantje
la source
4

La bibliothèque Arduino-Debug fournit un débogueur simple cible pour les croquis Arduino. Les commandes de débogage sont ajoutées directement à l'esquisse. Un shell de commande du débogueur est démarré sur les points d'arrêt et les assertions.

entrez la description de l'image ici

La capture d'écran ci-dessus montre l' exemple d'esquisse exécuté sur un Arduino Mega avec un moniteur de sortie série utilisé par l'application et Serial1 utilisé pour le shell du débogueur.

Commandes de débogage d'esquisse

  • ASSERT (cond) Vérifiez la condition d'assertion. Si false, le shell de débogage est appelé. L'esquisse ne peut pas continuer.
  • BREAKPOINT () Le shell de débogage est appelé.
  • BREAK_IF (cond) Le shell de débogage est appelé si la condition est vraie.
  • CHECK_STACK (salle) Vérifiez qu'il y a de la place (octets) sur la pile. Si false, le shell de débogage est appelé.
  • DEBUG_STREAM (dev) Utilisez le périphérique de flux donné pour la session de débogage. Généralement série.
  • OBSERVE (expr) Affiche l'expression dans le flux de débogage.
  • OBSERVE_IF (cond, expr) Imprime l'expression dans le flux de débogage si la condition est vraie.
  • INSCRIPTION (var) Enregistrez une variable pour l'accès à partir du shell de débogage. Commandes de débogage du shell

Commandes de débogage du shell

  • ? VARIABLE Imprime l'adresse et la valeur de la variable.
  • @VARIABLE Affiche l'adresse de la variable du pointeur et la valeur de référence.
  • backtrace Imprime une pile d'appels simple.
  • commandes Imprimer la liste des commandes (voir aussi l'aide).
  • data Imprimer le contenu de la zone de données, c'est-à-dire les variables globales.
  • go Quittez le shell de débogage et continuez l'exécution de l'esquisse.
  • tas Affiche le contenu du tas, c'est-à-dire les données allouées dynamiques.
  • help Imprimer la liste des commandes.
  • mémoire Imprime l'état de la mémoire.
  • quitter Arrêter l'esquisse.
  • pile Affiche le contenu de la pile, c'est-à-dire les trames d'appel, les arguments, les adresses de retour.
  • variables Imprimer la liste des variables enregistrées.
  • Imprimer le fichier de code source et la ligne où le shell de débogage a été appelé.

Toutes les commandes du shell de débogage peuvent être abrégées en commandes à un seul caractère. Veuillez consulter le README pour plus de détails; détails de l'installation, exemple d'esquisse et d'analyse comparative.

Mikael Patel
la source
1
La bibliothèque offerte par Mikael vous permet de définir des points d'arrêt conditionnels, d'imprimer les valeurs des variables, l'état de la mémoire, les traces d'appels et d'examiner et de modifier les variables à un point d'arrêt. Pro: n'a pas besoin de matériel ($$), ne bat pas aussi fort sur le flash (comme le ferait la définition et la suppression de points d'arrêt avec un débogueur matériel). ....
JRobert
1
.... Con: Un impact plus élevé sur l'espace de code du programme, un peu d'espace RAM, et éventuellement le temps d'exécution, si l'on examine le code à temps critique; une certaine courbe d'apprentissage pour compiler (et plus tard, supprimer) les appels de bibliothèque; la nécessité d'anticiper les points d'arrêt ou de les recompiler lorsque vous découvrez où vous en avez besoin. Les inconvénients ne sont pas une critique du travail de Mikael; ils viennent avec cette technique.
JRobert
1
@JRobert Nice Résumé Pro-Con! J'ai essayé de résoudre certains des inconvénients en permettant au débogueur d'être personnalisé. Il existe un ensemble de définitions qui permettront aux applications sensibles à l'encombrement de réduire au minimum le shell de débogage. Comme tout débogueur pour les systèmes embarqués, il est difficile de déboguer du code critique en temps (continu) avec des points d'arrêt. La seule alternative est les points d'observation. Ceux-ci pourraient être optimisés en utilisant un tampon de trace et supprimer la sortie série dans le code critique en temps.
Mikael Patel
3

Pas dans l'IDE Arduino.

Tu dois:

  1. Installez et utilisez un véritable IDE, comme Atmel Studio, et
  2. Utiliser un débogueur matériel complet

Il n'y a aucune disposition pour le débogage via l'interface UART / USB à l'aide du chargeur de démarrage.

Majenko
la source