Zápisník experimentátora
Hierarchy: Ladenie programu v C++
Debug je zaujímavá knižnica na ladenie programov pomocou sériového portu. Knižnicu napísal Mikael Patel a je to vtipné využitie interakcie s programom v programe Serial Monitor. Knižnica sa nachádza na adrese https://github.com/mikaelpatel/Arduino-Debug.
Knižnicu si treba stiahnuť z Githubu a nainštalovať si ju do adresára libraries/Arduino-Debug. Pokiaľ si ju stiahnete ako zip, nezabudnite si adresár premenovať z Arduino-Debug-master na Arduino-Debug. Po reštarte IDE sa objaví aj jeden vzorový príklad, ale autor sa do neho snažil dať úplne všetko a tak je to trochu nepochopiteľné na prvýkrát. Skôr pochopíte použitie knižnice na nasledovnom príklade.
Knižnica je interaktívna a umožňuje si beh programu na určenom mieste zastaviť a prehliadať obsah premenných v programe a vykonať aj zopár ďalších úkonov. Najprv elementárny príklad.
#include <Debug.h>
void setup() {
Serial.begin(57600);
while (!Serial);
DEBUG_STREAM(Serial);
int abc=10;
REGISTER(abc);
OBSERVE(abc);
abc++;
OBSERVE(abc);
BREAKPOINT();
}
void loop() {
}
A výpis z COM portu.
Arduino Debug (AVR) 1.0a3, Copyright (C) 2015-2016, Mikael Patel
For help, type "help".
Debug::begin::void setup():6
(debug) go
Debug::observe_at:void setup():10:abc=10
Debug::observe_at:void setup():12:abc=11
Debug::break_at:void setup():13
(debug) variables
void setup():abc@0x8F4=11 (0xB)
Program treba nahrať do Arduina a spustiť Serial Monitor. Treba si dať pozor na zhodu nastavenia rýchlosti prenosu a na to, aby bolo odoslanie cez tlačidlo Send nastavené ako Newline.
Program následne zastane na riadku DEBUG_STREAM(Serial). Vtedy sa ešte nedá robiť nič zaujímavé a tak musíte napísať príkaz go.
Na riadku REGISTER(abc) som zaregistroval premennú abc na sledovanie. Iba registrované premenné možno zobrazovať z konzoly. Dá to urobiť príkazmi ?abc, ktorý vypíše len konkrétnu premennú, alebo príkazom variables, ktorý vypíše všetky registrované.
Nasleduje riadok OBSERVE, inkrementovanie abc a ešte jedno OBSERVE. Vo výpise z COM portu je vidno, že sa objavili dva riadky a prvý ukazuje obsah premenné pred inkrementovaním a druhý po.
Posledný prípaz je BREAKPOINT(), ktorým sa program zase zastavil v interaktívnej konzole. Tam som napísal príkaz variables, ktorý vypísal všetky známe premenné.
Príkazom go by som zase program pustil ďalej a mohol na inom mieste zastaviť iným príkazom BREAKPOINT().
V čase testovania knižnice tam bola chyba a musel som opraviť riadok v súbore Debug.h na #define OBSERVE(expr) OBSERVE_IF(true,expr). Autor tam mal prehodené parametre makra.
Knižnica obsahuje 8 príkazov priamo v kóde programu a 13 príkazov interaktívnej konzoly. Ja som uviedol len tie najzaujímavejšie.
Knižnicu ľahko deaktivujete pomocou makra NDEBUG a vtedy nepridá do výsledného kódu nič pretože vtedy sa všetky makrá zmenia na prázdne riadky.
#define NDEBUG
#include <Debug.h>
Za použitie knižnice zaplatíte nejakými bajtami navyše. Každé zavolanie REGISTER() v skutočnosti vytvorí ďalšiu premennú, ktorú program využíva na monitorovanie údajov. Ale vzhľadom na to, že v IDE normálny debugger nie je, môže táto knižnica občas pomôcť pri riešení problému.
05.02.2016