Debug Ausgaben im Quellcode

Last Updated on 24. Mai 2020 by sfambach

Gerade beim neuen Entwicklungen ist es wichtig ein paar Ausgaben über die serielle Schnittstelle oder ein anderes Medium zu schicken. Natürlich können diese Ausgaben einfach gelöscht oder ausdokumentiert werden. Aber spätestens wenn die Implementierung erweitert wird, werden sie wieder benötigt.

Es gibt unterschiedliche Ansätze welche ich hier kurz vorstellen möchte. Welche Variante die Richtige ist muss jeder für sich selbst entscheiden.

Boolische Variable + IF

Verwendung einer globale boolischen Variable und eine IF-Bedinung für jede Ausgabe.

bool debug = true;

void funktion1(){
  // .... 
  if(debug){
    Serial.println("Debug Nachricht");
  }
  // ....
}

Dieser Variante ermöglicht es, das Debugging auch noch während des Betriebes ein zu schalten. Dies ist bei den folgenden Varianten nicht möglich. Der größte Nachteil ist der zusätliche Code und der Speicher für die Texte. Um Speicher zu sparen können die Texte ins EEPROM oder in den Flash Speicher ausgelagert werden. Hier ein Beispiel für den Flash Speicher:

bool debug = true;

void funktion1(){
  // .... 
  if(debug){
    Serial.println(F("Debug Nachricht"));
  }
  // ....
}

Präprozessor Bedingung

In folgenden Beispiel wir die Variante von oben mit Präprozessoranweisungen realisiert. Fällt das #define oben weg, werden auch die Ausgabe nicht eincompiliert. Dies spart Speicher ein. Ein Nachteil ist der druchbrochene Code, Präprozessornaweisungen zerfleddern einwenig das Gesamtbild.

#define DEBUG

void funktion1(){
  // .... 
#ifdef DEBUG
   Serial.println(F("Debug Nachricht"));
#enfif
  // ....
}

Präprozessor Ersetzung

Roeln hat im Arduino Forum das folgende Beispiel gebracht:

#include "Arduino.h"   

#define DEBUG true // flag to turn on/off debugging
#define Serial if(DEBUG)Serial

Dies scheint mir eine der elegantesten Varianten zu sein, weil die Serial Klasse wie gewohnt verwendet werden kann und danach komplett ausgeschaltet wird. Laut einiger Forenteilnehmer scheint dies aber nicht immer zu Funktionieren. Somit kommen wir zur letzten Variante.

Präprozessor Funktionen

Definition von Präprozessor Funktionen. Diese können leicht ausgeschaltet werden und belasten den Speicher nicht. Nachteil jede Funktion muss einzeln definiert und im Quellcode verwendet werden.

#ifdef DEBUG
 #define DEBUG_PRINT(x)    Serial.print (x)
 #define DEBUG_PRINTDEC(x) Serial.print (x, DEC)
 #define DEBUG_PRINTLN(x)  Serial.println (x)
#else
 #define DEBUG_PRINT(x)
 #define DEBUG_PRINTDEC(x)
 #define DEBUG_PRINTLN(x)
#endif

void setup()
  Serial.begin(115200);
  DEBUG_PRINT ("Hallo ich bin ein Text2");
}

Oder diese im Arduino Forum gefundene Version, hier ist mir nicht ganz klar worfür die Schleife gebaucht werden …

#define DEBUG false // flag to turn on/off debugging
#define debug_begin(...) do { if (DEBUG) { Serial.begin(__VA_ARGS__); while(!Serial); }} while (0)
#define debug_print(...) do { if (DEBUG) Serial.print(__VA_ARGS__); } while (0)
#define debug_println(...) do { if (DEBUG) Serial.println(__VA_ARGS__); } while (0)
#define debug_printf(...) do { if (DEBUG) Serial.printf(__VA_ARGS__); } while (0)

void setup()
  debug_begin(115200);
  debug_begin("Hallo ich bin ein Text2");
}

Online Debugger

Noch besser ist natürlich ein Debugger, der schrittweise über den Code gehen kann. Dies war beim Atmel mit JTAG schon immer möglich. Arduino scheint diese Möglichkeit etwas verschlafen zu haben. Hier die Bemühungen der Arduino IDE.

Hier die Bestrebungen von PlatformIO

https://docs.platformio.org/en/latest/plus/debugging.html

https://docs.platformio.org/en/latest/tutorials/espressif32/arduino_debugging_unit_testing.html

Eclipse kann es Grundsätzlich, es gibt auch Ansätze für den Arduino:

https://www.codeproject.com/Articles/1037057/Debugger-for-Arduino

Fazit

Es gibt zahlreiche Möglichkeiten Debugging Nachrichten aus dem produktiven Code heraus zu nehmen. Die letzten Varianten sind sicherlich die meist angewandten. Um Variablen inhalte über alles Änderungen hinweg zu verfolgen ist sicherlich ein „Richtiger“ Debugger besser geeignet.

Quellen

https://forum.arduino.cc/index.php?topic=155268.0

Preview the Debugger feature for the Arduino Pro IDE

https://www.arduino.cc/en/Reference/EEPROM

https://playground.arduino.cc/Learning/Memory/

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert