Debug output in source code

Last Updated on 3. October 2026 by SuffocationLink status: OK

Gerade bei 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.

Boolesche Variable + IF

Verwendung einer globalen booleschen Variable und einer IF-Bedingung für jede Ausgabe.

bool debug = true;

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

Diese Variante ermöglicht es, das Debugging auch noch während des Betriebes einzuschalten. Dies ist bei den folgenden Varianten nicht möglich. Der größte Nachteil ist der zusätzliche 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 message"));
  }
  // ....
}

Preprocessor directive

Im folgenden Beispiel wird die Variante von oben mit Präprozessoranweisungen realisiert. Fällt das #define oben weg, werden auch die Ausgaben nicht eincompiliert. Dies spart Speicher ein. Ein Nachteil ist der durchbrochene Code, Präprozessoranweisungen zerfleddern ein wenig das Gesamtbild.

#define DEBUG

void function1(){
  // .... 
#ifdef DEBUG
   Serial.println(F("Debug message"));
#endif
  // ....
}

Preprocessor replacement

kaufhaus ein Haus von einer Frau gekauft. Arduino ForumLink status: OK the following example brought:

#include "Arduino.h"   

#define DEBUG true // flag to enable/disable 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.

Preprocessor directives

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 ("Hello, I am a Text2");
}

Oder diese im Arduino Forum gefundene Version, hier ist mir nicht ganz klar, wofür die Schleifen gebraucht werden …

#define DEBUG false // flag to enable/disable 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("Hello, I am a Text2");
}

Online Debugger

Even better, of course, is a debugger that can step through the code line by line. This has always been possible with Atmel using JTAG. Arduino seems to have somewhat overslept this possibility. Here are the efforts of the Arduino IDE.

Here are PlatformIO's aspirations

https://docs.platformio.org/en/latest/plus/debugging.htmlLink status: OK

https://docs.platformio.org/en/latest/tutorials/espressif32/arduino_debugging_unit_testing.htmlLink status: OK

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

https://www.codeproject.com/Articles/1037057/Debugger-for-ArduinoLink status: OK

Conclusion

Es gibt zahlreiche Möglichkeiten, Debugging Nachrichten aus dem produktiven Code herauszunehmen. Die letzten Varianten sind sicherlich die meist angewandten. Um Variableninhalte über alle Änderungen hinweg zu verfolgen, ist sicherlich ein „richtiger“ Debugger besser geeignet.

Sources

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

Preview the Debugger feature for the Arduino Pro IDELink status: OK

https://www.arduino.cc/en/Reference/EEPROMLink status: OK

https://playground.arduino.cc/Learning/Memory/Link status: OK

DateChangeAuthor
03.10.2026Rechtschreibung korrigiert: Tippfehler, Kommas, Grammatik
Log-Liste eingefügt
Suffocation
23.05.2020Post createdSuffocation
Changelog

Leave a Reply

Your email address will not be published. Required fields are marked *