{"id":5641,"date":"2020-05-24T08:13:52","date_gmt":"2020-05-24T08:13:52","guid":{"rendered":"https:\/\/www.fambach.net\/?p=5641"},"modified":"2020-05-24T08:19:13","modified_gmt":"2020-05-24T08:19:13","slug":"debug-ausgaben-im-quellcode","status":"publish","type":"post","link":"https:\/\/www.fambach.net\/en\/debug-ausgaben-im-quellcode\/","title":{"rendered":"Debug output in source code"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_73 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewbox=\"0 0 24 24\" version=\"1.2\" baseprofile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.fambach.net\/en\/debug-ausgaben-im-quellcode\/#Boolische_Variable_IF\" title=\"Boolische Variable + IF\">Boolische Variable + IF<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.fambach.net\/en\/debug-ausgaben-im-quellcode\/#Praprozessor_Bedingung\" title=\"Pr\u00e4prozessor Bedingung\">Pr\u00e4prozessor Bedingung<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.fambach.net\/en\/debug-ausgaben-im-quellcode\/#Praprozessor_Ersetzung\" title=\"Pr\u00e4prozessor Ersetzung\">Pr\u00e4prozessor Ersetzung<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.fambach.net\/en\/debug-ausgaben-im-quellcode\/#Praprozessor_Funktionen\" title=\"Pr\u00e4prozessor Funktionen\">Pr\u00e4prozessor Funktionen<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.fambach.net\/en\/debug-ausgaben-im-quellcode\/#Online_Debugger\" title=\"Online Debugger\">Online Debugger<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.fambach.net\/en\/debug-ausgaben-im-quellcode\/#Fazit\" title=\"Conclusion\">Conclusion<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.fambach.net\/en\/debug-ausgaben-im-quellcode\/#Quellen\" title=\"Sources\">Sources<\/a><\/li><\/ul><\/nav><\/div>\n\n<p>Gerade beim neuen Entwicklungen ist es wichtig ein paar Ausgaben \u00fcber die serielle Schnittstelle oder ein anderes Medium zu schicken. Nat\u00fcrlich k\u00f6nnen diese Ausgaben einfach gel\u00f6scht oder ausdokumentiert werden. Aber sp\u00e4testens wenn die Implementierung erweitert wird, werden sie wieder ben\u00f6tigt.<\/p>\n\n\n\n<p>Es gibt unterschiedliche Ans\u00e4tze welche ich hier kurz vorstellen m\u00f6chte. Welche Variante die Richtige ist muss jeder f\u00fcr sich selbst entscheiden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Boolische_Variable_IF\"><\/span>Boolische Variable + IF<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Verwendung einer globale boolischen Variable und eine IF-Bedinung f\u00fcr jede Ausgabe.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>bool debug = true;\n\nvoid funktion1(){\n  \/\/ .... \n  if(debug){\n    Serial.println(\"Debug Nachricht\");\n  }\n  \/\/ ....\n}<\/code><\/pre>\n\n\n\n<p>Dieser Variante erm\u00f6glicht es, das Debugging auch noch w\u00e4hrend des Betriebes ein zu schalten. Dies ist bei den folgenden Varianten nicht m\u00f6glich. Der gr\u00f6\u00dfte Nachteil ist der zus\u00e4tliche Code und der Speicher f\u00fcr die Texte. Um Speicher zu sparen k\u00f6nnen die Texte ins EEPROM oder in den Flash Speicher ausgelagert werden.  Hier ein Beispiel f\u00fcr den Flash Speicher:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>bool debug = true;\n\nvoid funktion1(){\n  \/\/ .... \n  if(debug){\n    Serial.println(F(\"Debug Nachricht\"));\n  }\n  \/\/ ....\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Praprozessor_Bedingung\"><\/span>Pr\u00e4prozessor Bedingung<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>In folgenden Beispiel wir die Variante von oben mit Pr\u00e4prozessoranweisungen realisiert. F\u00e4llt das #define oben weg, werden auch die Ausgabe nicht eincompiliert. Dies spart Speicher ein. Ein Nachteil ist der druchbrochene Code, Pr\u00e4prozessornaweisungen zerfleddern einwenig das Gesamtbild.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define DEBUG\n\nvoid funktion1(){\n  \/\/ .... \n#ifdef DEBUG\n   Serial.println(F(\"Debug Nachricht\"));\n#enfif\n  \/\/ ....\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Praprozessor_Ersetzung\"><\/span>Pr\u00e4prozessor Ersetzung<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Roeln hat im <a href=\"https:\/\/forum.arduino.cc\/index.php?topic=155268.0\">Arduino Forum<\/a> das folgende Beispiel gebracht:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"Arduino.h\"   \n\n#define DEBUG true \/\/ flag to turn on\/off debugging\n#define Serial if(DEBUG)Serial<\/code><\/pre>\n\n\n\n<p>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.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Praprozessor_Funktionen\"><\/span>Pr\u00e4prozessor Funktionen<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Definition von Pr\u00e4prozessor Funktionen. Diese k\u00f6nnen leicht ausgeschaltet werden und belasten den Speicher nicht. Nachteil jede Funktion muss einzeln definiert und im Quellcode verwendet werden. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifdef DEBUG\n #define DEBUG_PRINT(x)    Serial.print (x)\n #define DEBUG_PRINTDEC(x) Serial.print (x, DEC)\n #define DEBUG_PRINTLN(x)  Serial.println (x)\n#else\n #define DEBUG_PRINT(x)\n #define DEBUG_PRINTDEC(x)\n #define DEBUG_PRINTLN(x)\n#endif\n\nvoid setup()\n  Serial.begin(115200);\n  DEBUG_PRINT (\"Hallo ich bin ein Text2\");\n}<\/code><\/pre>\n\n\n\n<p>Oder diese im Arduino Forum gefundene Version, hier ist mir nicht ganz klar worf\u00fcr die Schleife gebaucht werden &#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define DEBUG false \/\/ flag to turn on\/off debugging\n#define debug_begin(...) do { if (DEBUG) { Serial.begin(__VA_ARGS__); while(!Serial); }} while (0)\n#define debug_print(...) do { if (DEBUG) Serial.print(__VA_ARGS__); } while (0)\n#define debug_println(...) do { if (DEBUG) Serial.println(__VA_ARGS__); } while (0)\n#define debug_printf(...) do { if (DEBUG) Serial.printf(__VA_ARGS__); } while (0)\n\nvoid setup()\n  debug_begin(115200);\n  debug_begin(\"Hallo ich bin ein Text2\");\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Online_Debugger\"><\/span>Online Debugger<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Noch besser ist nat\u00fcrlich ein Debugger, der schrittweise \u00fcber den Code gehen kann. Dies war beim Atmel mit JTAG schon immer m\u00f6glich. Arduino scheint diese M\u00f6glichkeit etwas verschlafen zu haben. Hier die Bem\u00fchungen der Arduino IDE.<\/p>\n\n\n\n<figure class=\"wp-block-embed-wordpress wp-block-embed is-type-wp-embed is-provider-arduino-blog\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"bSI5HPqVfg\"><a href=\"https:\/\/blog.arduino.cc\/2020\/02\/28\/preview-the-debugger-feature-for-the-arduino-pro-ide\/\">Preview the Debugger feature for the Arduino Pro IDE<\/a><\/blockquote><iframe title=\"&#8220;Preview the Debugger feature for the Arduino Pro IDE&#8221; &#8212; Arduino Blog\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" src=\"https:\/\/blog.arduino.cc\/2020\/02\/28\/preview-the-debugger-feature-for-the-arduino-pro-ide\/embed\/#?secret=bSI5HPqVfg\" data-secret=\"bSI5HPqVfg\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>Hier die Bestrebungen von PlatformIO<\/p>\n\n\n\n<p><a href=\"https:\/\/docs.platformio.org\/en\/latest\/plus\/debugging.html\">https:\/\/docs.platformio.org\/en\/latest\/plus\/debugging.html<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/docs.platformio.org\/en\/latest\/tutorials\/espressif32\/arduino_debugging_unit_testing.html\">https:\/\/docs.platformio.org\/en\/latest\/tutorials\/espressif32\/arduino_debugging_unit_testing.html<\/a><\/p>\n\n\n\n<p>Eclipse kann es Grunds\u00e4tzlich, es gibt auch Ans\u00e4tze f\u00fcr den Arduino:<\/p>\n\n\n\n<p><a href=\"https:\/\/www.codeproject.com\/Articles\/1037057\/Debugger-for-Arduino\">https:\/\/www.codeproject.com\/Articles\/1037057\/Debugger-for-Arduino<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Fazit\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Es gibt zahlreiche M\u00f6glichkeiten Debugging Nachrichten aus dem produktiven Code heraus zu nehmen. Die letzten Varianten sind sicherlich die meist angewandten. Um Variablen inhalte \u00fcber alles \u00c4nderungen hinweg zu verfolgen ist sicherlich ein &#8222;Richtiger&#8220; Debugger besser geeignet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Quellen\"><\/span>Sources<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><a href=\"https:\/\/forum.arduino.cc\/index.php?topic=155268.0\">https:\/\/forum.arduino.cc\/index.php?topic=155268.0<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/blog.arduino.cc\/2020\/02\/28\/preview-the-debugger-feature-for-the-arduino-pro-ide\/\">Preview the Debugger feature for the Arduino Pro IDE<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.arduino.cc\/en\/Reference\/EEPROM\">https:\/\/www.arduino.cc\/en\/Reference\/EEPROM<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/playground.arduino.cc\/Learning\/Memory\/\">https:\/\/playground.arduino.cc\/Learning\/Memory\/<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Gerade beim neuen Entwicklungen ist es wichtig ein paar Ausgaben \u00fcber die serielle Schnittstelle oder ein anderes Medium zu schicken. Nat\u00fcrlich k\u00f6nnen diese Ausgaben einfach gel\u00f6scht oder ausdokumentiert werden. Aber sp\u00e4testens wenn die Implementierung erweitert wird, werden sie wieder ben\u00f6tigt. Es gibt unterschiedliche Ans\u00e4tze welche ich hier kurz vorstellen m\u00f6chte. Welche Variante die Richtige ist &#8230;<\/p>\n<a href=\"https:\/\/www.fambach.net\/en\/debug-ausgaben-im-quellcode\/\" class=\"read-more-link\">Continue reading <span class=\"screen-reader-text\">\"Debug Ausgaben im Quellcode\"<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"categories":[157,184,171],"tags":[314,311,312,313],"modified_by":"sfambach","_links":{"self":[{"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/posts\/5641"}],"collection":[{"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/comments?post=5641"}],"version-history":[{"count":7,"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/posts\/5641\/revisions"}],"predecessor-version":[{"id":5648,"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/posts\/5641\/revisions\/5648"}],"wp:attachment":[{"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/media?parent=5641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/categories?post=5641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/tags?post=5641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}