Verwendung von Haltepunkten zum Debuggen

9

Haltepunkte sind eine großartige Möglichkeit, um zu sehen, wie der Compiler zu Ihrem Code ausgeführt wird. Meine Frage ist nun, gibt es eine Möglichkeit, Haltepunkte zu verwenden, wenn Sie Ihren Code debuggen?

H. Pauwelyn
quelle

Antworten:

9

Wie in Majenkos Antwort erwähnt, bietet die Arduino IDE keinen Haltepunktmechanismus, aber Atmel Studio unterstützt Haltepunkte . [*]

Wenn Sie jedoch über einen Schalter und eine LED verfügen, können Sie den Fortschritt Ihres Programms auf eine Weise verfolgen, die einige der Vorteile von Haltepunkten bietet. Sie würden beispielsweise eine Unterroutine hinzufügen BPReport(), die über die serielle Ausgabe oder ein LCD Werte kritischer Variablen anzeigt, dann die LED aufleuchtet und mit Entprellen wartet, bis der Schalter gedrückt und losgelassen wurde. Rufen Sie Ihre BPReport()Routine an, wo immer Sie einen bedingungslosen Haltepunkt wünschen. Für bedingte Haltepunkte können Sie eine Routine haben, BPReportIf(cond)die aufruft, BPReport()ob dies der condFall ist. Wenn Sie nicht seriell ausgeben möchten, können Sie mehrere LEDs oder ein LCD verwenden, und Sie können mehrere Schalter verwenden, wenn Sie externe Unterbrechungssteuerungen wünschen (dies condkönnte beispielsweise ein Test für einen der zusätzlichen Schalter sein).

[*] Einige Hardware-Debugger ändern den heruntergeladenen Code jedes Mal, wenn Haltepunkte hinzugefügt, geändert oder entfernt werden. Durch diese Verwendung wird der Flash-Speicher schneller abgenutzt als nur gelegentlich heruntergeladen. Wenn ein Chip für ein solches Debugging häufig verwendet wurde, verwenden Sie diesen Chip nicht in einem Produktionssystem.

James Waldby - jwpat7
quelle
4

Obwohl Majenko seine Antwort richtig ist, gibt es einige andere Möglichkeiten.

In Bezug auf das echte Hardware-Debugging, wie von Majenko angegeben, würde ich sagen:

  1. Installieren und verwenden Sie eine echte IDE wie Atmel Studio oder das Arduino Eclipse-Plugin namens sloeber (ich bin Autor) und
  2. Verwenden Sie einen vollständigen Hardware-Debugger oder Hardware, auf der er installiert ist, wie das Arduio Zero, oder Hardware, die andere Debugging-Technologien wie den ESP8266 verwendet, der das USB-Debugging ermöglicht

Eine andere Debugging-Option aus einer völlig anderen Kategorie besteht darin, Ihren Code so zu organisieren, dass Entscheidungslogik (hardwareunabhängig) und Aktion (hardwareabhängig) vollständig getrennt sind.

Kompilieren Sie dann Ihre Skizze als lokales Programm und debuggen Sie die "Entscheidungslogik" auf Ihrem lokalen Computer. Diese Methode erlaubt kein "Hardware-Debugging". Diese Methode ermöglicht auch Unit-Tests.

Beachten Sie, dass Ihr lokaler Computer wahrscheinlich 32 oder 64 bitter ist und die meisten Arduinos 8 bitter sind, was zu Unterschieden in den Datentypen führt, was bei Verwendung dieser Methode ein zusätzlicher Aufmerksamkeitspunkt ist.

jantje
quelle
4

Die Arduino-Debug- Bibliothek bietet einen einfachen On-Target-Debugger für Arduino-Skizzen. Debug-Befehle werden direkt zur Skizze hinzugefügt. Eine Debugger-Befehlsshell wird für Haltepunkte und Zusicherungen gestartet.

Geben Sie hier die Bildbeschreibung ein

Der Screenshot oben zeigt die Beispielskizze, die auf einem Arduino Mega mit seriellem Ausgabemonitor ausgeführt wird, der von der Anwendung verwendet wird, und Serial1, das für die Debugger-Shell verwendet wird.

Skizzieren Sie Debug-Befehle

  • ASSERT (cond) Überprüfen Sie den Assert-Zustand. Bei false wird die Debug-Shell aufgerufen. Die Skizze kann nicht fortgesetzt werden.
  • BREAKPOINT () Die Debug-Shell wird aufgerufen.
  • BREAK_IF (cond) Die Debug-Shell wird aufgerufen, wenn die Bedingung erfüllt ist.
  • CHECK_STACK (Raum) Überprüfen Sie, ob auf dem Stapel Platz (Bytes) vorhanden ist. Bei false wird die Debug-Shell aufgerufen.
  • DEBUG_STREAM (dev) Verwenden Sie das angegebene Stream-Gerät für die Debug-Sitzung. Normalerweise seriell.
  • BEOBACHTEN (Ausdruck) Gibt den Ausdruck im Debug-Stream aus.
  • OBSERVE_IF (cond, expr) Gibt den Ausdruck im Debug-Stream aus, wenn die Bedingung erfüllt ist.
  • REGISTER (var) Registrieren Sie eine Variable für den Zugriff über die Debug-Shell. Debug-Shell-Befehle

Debug-Shell-Befehle

  • VARIABLE Variable Adresse und Wert drucken .
  • @VARIABLE Zeigt die Adresse und den Referenzwert der Zeigervariablen.
  • backtrace Einfachen Call-Stack drucken.
  • Befehle Liste der Befehle drucken (siehe auch Hilfe).
  • Daten Inhalt des Datenbereichs drucken, dh globale Variablen.
  • Gehen Sie , verlassen Sie die Debug-Shell und setzen Sie die Ausführung der Skizze fort.
  • Heap Druckt den Inhalt des Heaps, dh die dynamisch zugewiesenen Daten.
  • Hilfe Liste der Befehle drucken.
  • Speicher Speicherstatus drucken.
  • Beenden Sie die Skizze stoppen.
  • Stack Gibt den Inhalt des Stacks aus, dh Aufrufrahmen, Argumente und Rücksprungadressen.
  • Variablen Liste der registrierten Variablen drucken.
  • Dabei wird die Quellcodedatei und die Zeile gedruckt, in der die Debug-Shell aufgerufen wurde.

Alle Debug-Shell-Befehle können als Einzelzeichenbefehle abgekürzt werden. Weitere Informationen finden Sie in der README-Datei. Installationsdetails, Beispielskizze und Benchmarking.

Mikael Patel
quelle
1
Mit der von Mikael gespendeten Bibliothek können Sie bedingte Haltepunkte festlegen, Variablenwerte, Speicherstatus, Anrufverfolgungen drucken und Variablen an einem Haltepunkt untersuchen und ändern. Pro: Benötigt keine Hardware ($$), schlägt im Flash nicht so stark zu (wie es das Setzen und Entfernen von Haltepunkten mit einem Hardware-Debugger tun würde). ....
JRobert
1
.... Con: Höhere Auswirkungen auf den Code-Speicher des Programms, etwas RAM-Speicher und möglicherweise die Laufzeit, wenn zeitkritischer Code untersucht wird; einige Lernkurven zum Kompilieren (und später Entfernen) der Bibliotheksaufrufe; die Notwendigkeit, Haltepunktpositionen zu antizipieren oder sie neu zu kompilieren, wenn Sie herausfinden, wo Sie sie benötigen. Die Nachteile sind keine Kritik an Mikaels Arbeit; Sie kommen mit dieser Technik.
JRobert
1
@JRobert Schöne Pro-Con Zusammenfassung! Ich habe versucht, einige der Nachteile zu beheben, indem ich zuließ, dass der Debugger angepasst wurde. Es gibt eine Reihe von Definitionen, mit denen Footprint-sensible Anwendungen die Debug-Shell auf ein Minimum reduzieren können. Wie bei jedem Debugger für eingebettete Systeme ist es schwierig, zeitkritischen (kontinuierlichen) Code mit Haltepunkten zu debuggen. Die einzige Alternative sind Beobachtungspunkte. Diese können mithilfe eines Ablaufverfolgungspuffers optimiert und die serielle Ausgabe in zeitkritischem Code entfernt werden.
Mikael Patel
3

Nicht in der Arduino IDE.

Du musst:

  1. Installieren und verwenden Sie eine echte IDE wie Atmel Studio und
  2. Verwenden Sie einen vollständigen Hardware-Debugger

Das Debuggen über die UART / USB-Schnittstelle mit dem Bootloader ist nicht vorgesehen.

Majenko
quelle