JanKoWeb: Odborný SW - Matlab: praktické rady pro ladění kódu aneb Debug mode

Matlab: praktické rady pro ladění kódu aneb Debug mode

Dnes se podíváme na praktické příkazy a úpravy Matlabu, které jistě velmi oceníte při ladění skriptů.

Code folding

Povolte code folding u cell (oblasti, které začínají dvojitým "%") - Preferences -> Editor/Debugger -> Code Folding.

Reference: MATLAB Central - MATLAB Spoken Here » Fold whatever you want using cells.

Programový breakpoint

dbstop - zastaví program na daném místě. Praktický je tento kód (funguje namísto try...catch):

dbstop if error

Kontrola proměnných

Pokud máte více funkcí nebo rozsáhlejší skript, který nefunguje tak jak má, je dobré zkontrolovat všechny jeho části - zda obsahují hodnoty, které mají.

Workspace

První kontrolou je Workspace (okno Matlabu), ve kterém vidíte hodnoty proměnných, jejich velikost a můžete si přidat i další sloupce, jako třeba minimální a maximální hodnotu, průměr a pod. Problém je, že pokud máte své skripty rozdělené do funkcí, to co ve Workspace uvidíte budou pouze globální proměnné, pokud nezadáte Breakpointy uvnitř funkce, její proměnné neuvidíte.

Ukázka Workspace
Ukázka Workspace

Vykonání části kódu

Velmi praktická věc, standardně na klávesu F9 - vykoná označenou část kódu. Funguje jak v Debug modu, tak i když skript neběží.

Ve spojení s Zkratkou kódu používám při ladění tento skriptík:



% vezmeme aktualni otevreny dokument
editor = matlab.desktop.editor.getActive;
% vezmeme vybrany text
selected = editor.SelectedText;
% spustime vybrany kus kodu
eval(selected);

% pro vypisy dalsich hodnoty
tmp_selected_value_name = genvarname(selected);
eval(['tmp_selected_variable=' tmp_selected_value_name]);

% --------------------------
%    Prostor pro vypisy
% --------------------------
selected_sum = sum(tmp_selected_variable)
selected_sqrt = sqrt(tmp_selected_variable)
% --------------------------

% uklidime
clear editor, clear selected, clear tmp_selected_variable, clear tmp_value_name;

Refraktor

Aneb přejmenování proměnné. V Matlabu 2013 stačí najet kurzorem na konec názvu proměnné, kterou chceme přejmenovat a začít psát - objeví se bublina, zda chceme proměnnou přejmenovat všude - stačí stisknout Shift+Enter.

Zkratky kódu

Matlab umožňuje vytvořit i zkratky kódu. Viz článek Matlab: klávesové zkratky pro často se opakující příkazy přímo v toolbaru.

Dále doporučuji k pozornosti článek <a data-cke-saved-href="http://blog/">blog/">blog/">blog.mathworks.com/desktop/2011/05/09/r2011a-matlab-editor-api/" title="R2011a MATLAB Editor API" >R2011a MATLAB Editor API, který ukazuje možnosti automatizace práce s Editorem.

Debug mode

Debug mode slouží k ladění skriptů. Standardně se spouští klávesou F5. Do okamžiku, než definujete Breakpoint (bod, kde se má skript během vykonávání zastavit) se tváří jako obyčejný Run.

Pokud se nacházíte v Debug mode, je v Command Windows namísto >> značka K>>.

Označení Debug mode (zastaveného skriptu na nějakém řádku) v Command Window
Označení Debug mode (zastaveného skriptu na nějakém řádku) v Command Window

Breakpoint

Pokud potřebujete během vykonávání skriptu kontrolovat některé proměnné (jakože to vřele doporučuji;) ), klikněte na sloupeček s čísly řádku - vytvoří se červené kolečko, Breakpoint, před kterým se během vykonávání skript zastaví a vy se tak můžete i uvnitř funkcí podívat, jaké tam jsou hodnoty, ať už ve workspace nebo evaluací části kódu.

Pravé myšítko na číslu řádku
Pravé myšítko na číslu řádku

Conditional Breakpoint

Pokud na číslu řádku kliknete pravým myšítkem, můžete přidat tzv. Conditional breakpoint - místo, kde se program zastaví jen při splnění dané podmínky.

Conditional Breakpoint
Conditional Breakpoint

Breakpoint nefunguje?!

Pozor! Příkaz:



clear all

, který jak jsem zjistil dost lidí rádo používá k mazání Workspace, proměnných a figur, vymaže i breakpointy! Pokud jej tedy máte na začátku skriptu kvůli pořádku, můžete breakpointy nastavovat jako diví a Matlab si jich ani nevšimne. Pro mazání proměnných doporučuji používat místo toho příkaz:



clear variable

Vymazání jen breakpointů

dbclear all

Opuštění debug modu

Pokud nefunguje Ctrl+C, můžete buď použít tlačítko (v Matlabu 2013) nebo příkaz:

dbquit

Dá se nastavit i klávesová zkratka (viz níže).

Klávesové zkratky

V menu File / Preferences... / Keyboard / Shortcuts najdete klávesové zkratky. Osobně jsem si nastavil na klávesu F4 akci "Exit Debug Mode"

Klávesové zkratky
Klávesové zkratky

Další praktickou zkratkou je standardní Ctrl + C, které ukončuje provádění skriptu (hodí se zejména při zacyklení - musíte mít ale kurzor v Command Window).

Velmi šikovnou zkratkou je Ctrl + i, nazvaná je jako Smart Indent a jedná se o zformátování označené části kódu, což je VELMI praktické a dlouhou dobu jsem žil v myslém domnění, že Matlab nic takového neumí, takže jsem mezerníkoval a tabelátoroval jako divý;-)

Breakpoint programově

Pozor! Jen mimo blok Try/Catch:

if (verbose)
 dbstop if warning;
else
 dbclear if warning;
end

tento kód způsobí, že když je proměnná "verbose" True, zastaví se program na tomto místě, pokud dojde k warningu (analogicky - "error").  Pokud je False, tento mód se deaktivuje. Jde také vyvolat z menu:

Automatický breakpoint na warning
Automatický breakpoint na warning
Pokud chcete chybu chytit uvnitř Try/Catch, použijte:
dbstop if caught error

Vyvolání chyby v Try/Catch

if (verbose)
 rethrow(e);
end

Další možnosti

assert(PODMINKA)

Shrnutí a tip

Já používám takovéto schema:

verbose = 1; % promenna, kterou nastavim, zda chci zastavovat nebo ne
try 
% muj kod
catch e
 if (verbose)
  % zastavim si na erroru
  dbstop if error
  % vyvolam si komplet error
  rethrow(e);
 else
  % vyvolam si svou error hlasku
  warning('Improper LABORATORY data.');
 end
end
Rubrika Odborný SW | Tagy Matlab, Debug, Ladění, Praktické | Ne 11.12.2011 | 6246x

Související články:

MATLAB: úprava popisku osy x (vydáno Po 13.03.2017, 12:16)
MATLAB: dávková úprava figure (vydáno Po 13.03.2017, 12:12)
MATLAB: divné chování keeplimits u dateaxis (vydáno Po 20.02.2017, 11:52)
MATLAB: otevření složky z MATLABu (vydáno Ne 05.07.2015, 10:23)
MATLAB: error attempt to add "" to a static workspace (vydáno Pá 03.07.2015, 10:23)
MATLAB: spuštění m-file na Linuxu přímo v MATLABu (vydáno So 27.06.2015, 10:23)
MATLAB help generator - File Exchange - MATLAB Central (vydáno Čt 11.06.2015, 10:23)
Matlab: zjištění závislostí a toolboxů dané funkce (vydáno Ne 26.10.2014, 16:13)
Matlab java.lang.OutOfMemoryError  (vydáno So 14.06.2014, 11:31)
Matlab: na Linuxu nejde změnit velikost fontu (vydáno Pá 27.12.2013, 18:55)
Matlab: generátor nápovědy pro funkce (vydáno Čt 31.10.2013, 16:51)
Matlab: tipy a triky pro práci se strukturami (vydáno Út 13.08.2013, 13:53)
Matlab: práce s error, warning a try catch (vydáno Po 05.08.2013, 13:48)
Matlab: prohlížeč obrázků (vydáno Čt 01.08.2013, 22:23)
Matlab: skrytí warning (vydáno Čt 18.07.2013, 14:59)
MATLAB: vícenásobná substituce proměnné v matici (vydáno Út 12.03.2013, 12:46)
Matlab a LaTeX: rychlý export matice do LaTeXu (vydáno St 24.10.2012, 10:12)
Matlab: praktické tipy pro práci s figurami (grafy) (vydáno St 14.12.2011, 10:30)
Matlab: praktické rady pro ladění kódu aneb Debug mode (vydáno Ne 11.12.2011, 19:24) - právě čtete
Matlab: zkratky pro často se opakující příkazy přímo v toolbaru (vydáno Ne 20.11.2011, 18:32)
Matlab: převod výrazu do formátu LaTeXu (vydáno Út 17.05.2011, 23:12)
Matlab: Vigenerova šifra (vydáno Pá 15.04.2011, 10:44)
Matlab: instalace na Linuxu UBUNTU (vydáno Pá 25.02.2011, 18:03)
Matlab: úpravy výrazů (vydáno St 23.02.2011, 18:03)
Matlab: export grafu do pdf (vydáno So 05.02.2011, 23:58)
Matlab: TODO, FIXME a cell mode (vydáno Pá 10.12.2010, 17:36)
Matlab: defaultní nastavení grafu (vydáno Út 16.11.2010, 12:31)
Matlab: přehled exportů grafického výstupu (vydáno Pá 09.07.2010, 16:37)
Matlab - funkce pro textový výstup (vydáno So 13.03.2010, 19:39)
Matlab - práce s řetězci (vydáno Čt 22.10.2009, 17:03)

Náhodné články

Tento web jsem zakládal na střední, v roce 2008. Je zde hlavně archiv mé tvorby.

Aktuální věci publikuji kvůli úspoře času na Twitter.

Honza

"To, co druzí dělají, může být podnětem našich pocitů, nikoli však jejich příčinou."

M. Rosenberg