Debug - zaujímavé ladenie pomocou sériového portu

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.

Inštalácia

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.

Použitie

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().

Problémy

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.

Zoznam príkazov

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.

Vypnutie knižnice

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>

Réžia

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


Menu