Laděním našinec zabije velkou část času u vývoje programu. Nebudu Vás podceňovat a ukazovat základní věci jako zadávání breakpointu, ale s debuggerem zkusíme jiné věci.
Nejsem si jistý od které verze Delphi podporuje kterou vlastnost, ale některé z uvedených jsou v Delphi dlouho a některé až v 2010 nebo XE.
Skupiny breakpointů
Následují program je vymyšlený pro jednoduchost, normálně používáme skupiny breakpointů ve složitějších případech.
Chceme aby se program zastavil na řádku 17 v případě kdy i = 10 a j = 100. Jednou z možností je dát breakpoint na řádek 17 a nastavit mu uvedenou složenou podmínku, což je samozřejmě možné. Jednou nevýhodou je zpomalení běhu - vyhodnocení podmínky při častém volání jde poznat. Druhou nevýhodou je v některých případech nemožnost stanovení přesné podmínky (asynchronní akce).
Vlastnosti breakpointu - dobře tak pro jistotu: breakpoint nastavujeme kliknutím na modrý puntík - ten symbolizuje řádek, který byl zahrnut do výsledného binárního souboru. Pokud není puntík, tak řádek byl linkerem eliminován - nemá význam nebo se nevolá (v případě procedur). Vlastnosti breakpointu zobrazíme kliknutím na breakpoint (červený puntík) pravým tlačítkem myši.
Takže vlastnosti breakpointu nám umožňují definovat pravidla při kterých breakpoint zastavuje program. V našem případě tak pro řádek 14 nastavíme breakpoint dle obrázku (nastavíme podmínku a při splnění povolíme skupinu breakpointů cyklusJ).
Teď jen pro řádek 17 budeme definovat breakpoint náležící do uvedené skupiny a nastavíme u něj podmínku. Poslední věc co ještě musíme udělat je breakpoint deaktivovat (v popupmenu nad breakpointem volba enabled - jinak by celá naše akce neměla moc význam). Neaktivní breakpoint je šedý.
Nyní program spustíme a v okamžiku kdy se program zastaví na prvním breakpointu se aktivuje druhý breakpoint a na něm se v zápětí (po 100 cyklech) program zastaví také.
Ještě připomenu Pass count. Zde můžeme definovat kolikrát má program projít breakpointem než se program zastaví.
Výpis do logu u breakpointů
Výpis do logu u breakpointů se někdy může hodit. V okamžiku průchodu breakpointem je možno zapsat text do Event logu.
Do Eval Expression jsem zapsal velmi komplikovaný a hrubě optimalizovaný výraz, který Delphi bude vypisovat v případě, že projde tímto breakpointem (zrušil jsem skupiny). Zároveň jsem zaškrtl, že se má zároveň vypsat call stack (tj. odkud se do toho místa program dostal).
Nevýhodou je, že se program vždy zastaví, což například při kreslení nebo snímání myši není to pravé ořechové. Ale stačí odškrtnout Break a program poběží a jen Event Log se bude plnit informacemi.
Pojmenované vlákna v debuggeru
V případě, že píšete vícevláknové aplikace určitě narazíte na problém co je to za vlákno. Delphi od 2010 (s vylepšením v XE) mají pěkný fígl.
Snad každý zná, že vlákna jsou v Delphi jako následník třídy TThread s předefinováním metody Execute. Nyní má uvedená třída
class procedure TThread.NameThreadForDebugging(AThreadName: AnsiString;
AThreadID: TThreadID = TThreadID(-1)); static;
Pokud tuto class metodu zavoláte, umožníte tak debuggeru zobrazování lepšího jména místo nic neříkajícího threadID.
Klasické Sort demo z instalace Delphi to volá takto:
procedure TSortThread.Execute;
begin
NameThreadForDebugging(AnsiString(ClassName));
Sort(Slice(FSortArray^, FSize)); // vlastní implementace řazení
end;
ThreadID = 9156 je hlavní vlákno aplikace. Pokud na něm vyvoláme popup menu, můžeme ho pojmenovat také.
Moc pěkné vylepšení.
Pokračování někdy příště.