380 likes | 495 Views
Ladění aplikací v Caché. Štefan Havlíček. Agenda. Jednoduchá ukázka Anatomie kódu Caché Ladící prostředky Studia Pokročilé ladění Zachytávání chyb a logování Ladění aplikací v Zenu. Definice ladění.
E N D
Ladění aplikací v Caché Štefan Havlíček
Agenda • Jednoduchá ukázka • Anatomie kódu Caché • Ladící prostředky Studia • Pokročilé ladění • Zachytávání chyb a logování • Ladění aplikací v Zenu
Definice ladění • Každý ví, že ladění je dvakrát tak náročné jako vlastní psaní programu. Takže, pokud jste tak chytří jak jen můžete být při psaní programu, jak ho vůbec můžete odladit? Brian Kernighan) • Nejefektivnější ladícím nástrojem stále zůstává pečlivá úvaha doprovázená s rozmyslem umístěnými příkazy pro ladící výpisy. (Brian Kernighan)
Prevence • Dobře dokumentovaný kód • Error handling • Ověřování stavového kódu • Tradiční způsob ošetření chyb ($ETRAP, $ZTRAP ) • Try/Catch/Throw • Robustní testování • UNIT testing
Unit testing • Agilní programování • Analogie xUnit testovacího frameworku • Lze testovat: • Třídy a metody Caché • Rutiny COS • SQL skripty
Unit testy … • Postup: • Vytvoř třídu kterou chceš testovat • Vytvoř TestCase (testovací třídu) • Přidej do testovací třídy testovací metody testXXXX() • Vyexportuj testovací třídu jako XML • Nastav global ^UnitTestRoot • Z terminálu spusť %UnitTest.Manager.RunTest(nazev adresare s testy) • Kochej se výsledky
Unit testy … • Základní metody testovací třídy TestCase se volají pomocí maker: • $$$AssertEquals • $$$AssertNotEquals • $$$AssertStatusOK • $$$AssertStatusNotOK • $$$LogMessage • Samotný test se spouští metodou RunTest()
Ladění bez debuggeru • S rozmyslem umístěné ladící tisky • Výpis obsahu proměnných na terminál • Od nejjednodušších … • w!, “Jmeno: ”_tJmeno • Set ^debug(counter) = val • K elegantním … • Debugging macro v každé rutině
O čem to vlastně je ? • Zastav se • Rozhlédni se • Pokračuj
Jednoduché ladění • Jednoduchá třída s metodami spuštěná z terminálu • Vložení „break pointu“ do kódu • Základní příkazy pro ladění (B,S+,W, atd.)
Základní příkazy pro řádkové ladění • Break - přeruší vykonávání kódu • Write - vypíše lokální proměnné • Goto - pokračuj ve vykonávání kódu • B „S“, „S+“, … - jednokrokový režim • Do %objlasterror - poslední chyba v objectsriptu
Prompt programátora • do ##class(Debug.Sample).test() • write tSample.Name/0 } • ^ • <DIVIDE>ztest+5^Debug.Sample.1 • ENTREE 4d1> • write tSample.Name/0 - chybová řádka • <DIVIDE> - chybový kód • ztest+5^Debug.Sample.1 - poloha chybové řádky • 4d1> - informace zásobníku
ztest+5^Debug.Sample.1Kde to je schované? • .OBJ kód • Debugger pracuje s .INT kódem
ztest+5^Debug.Sample.1Kde to je schované? ... • Ve Studiu Menu -> View -> View Other -> Debug.Sample.1.INT • Do políčka napsat: ztest+5
Zjednodušená anatomie kódu Caché • .OBJ • Tento typ kódu je vykonáván strojem Caché a je uložen v ^rOBJ globálu (je to „rutina“) • .INT • Je kód, ze kterého je kompilován vykonavatelný kód .OBJ. Debugger pracuje s tímto kódem. V něm jsou všechna makra „rozbalena“ • .MAC • MAC, CLS … zdrojové kódy v Caché (mohou obsahovit i vložené SQL, XML, …)
Nastavení Studia pro generování kódu • Keep generated source code („k“ příznak při kompilaci) • No optimization – zvyšuje čitelnost kódu
Nastavení SQL pro generování kódu • Retain SQL Statement as Comment • Cached Query – Save Source
Anatomie kódu - shrnutí • Caché vykonává .OBJ kód • Debugger pracuje s .INT kódem • Pro přístup k .INT kódu je potřeba někdy změnit konfiguraci systému, aby byl .INT kód přístupný
Ladění pomocí Studia • Zastav se • Breakpoint / Watchpoint • Připojení debuggeru k procesu • cstudio.exe /pid (cstudio.exe ? pro nápovědu) • Rozhlédni se • Watch, Stack, Output • Pokračuj • Step into/over … Run to …. Atd.
Breakpoint / Watchpoint • Pravé tlačítko – Toggle Breakpoint • Project -> Settings. Debugging
Zastav se: Run/Attach • Run <F5>: • Jen na lokálních stanicích • Debug->Debug Target • Project settings->Debug Target • Attach to process • Najdi ID procesu • Debug->Attach • cstudio.exe /pid
Identifikace ID procesu • Každý proces má své unikátní ID • Lišta terminálu • ID procesu OS • Systém Management Portal -> Processes
Studio – rozhlédni se • Watch • Promenné,globály,funkce • Okno Watch obsahuje seznam proměnných • Stack • Obsah proměnných na různých úrovních zásobníku • Output window • Lze použít jako konzoli (write, set, ….)
Studio – Jdi dál • Run • Stop • Step Into • Step Over • Step Out
Ladění pomocí ZBreak • ZBreak location[:action:condition:execute_code] • Location tag+3^rou –breakpoint • *variable –watchpoint • $ -every line • Action"T"=Trace, "B"=Break (default), "N"=No action, "S”=Step etc. • ConditionSpecial condition to break (i.e. name="BART") • ActionAction to perform on break (i.e. x ^MyTraceCode)
ZBreak - příklady • zb *%objlasterror • Break on any changes to %objlasterror variable • zb /TRACE:ON • zb *name:"T":"name=""BART""" • Trace, but not break as name becomes "BART" • set file="c:\test.txt" • open file:"WN" • zb /TRACE:ALL:file • Record every single line of code executed to file
Pokročilé ladění objektů • %Status –vrácen mnoha ‘%’ methodamijako např. %OpenId(), %Save() etc. • %objlasterror • do $system.OBJ.DisplayError(sc,.err) • %SYSTEM.Status package • Vypíše obsahy otevřených objektů • do $system.OBJ.ShowObjects() • do $system.OBJ.Dump(obj) • do $system.OBJ.ShowObjects("d")
Logování SQL • ODBC Trasování (Windows) • ODBC Driver Configuration -> ODBC Log • ^%ISCLOG=0…3 • Ujistěte se, že je nasetovánozpět na 0 po ukončení laděn!!! • Management Portal -> System Logs -> xDBC logs
Zachytávání chyb a výjimek • Caché Object Script • ETrap • ZTrap • Try/Catch • Nové od 2007.1
Příklad na Try / Catch try { s b=1/x } catch err { write "Error name:",err.Name,! write "Error code:",err.Code,! write "Error location:",err.Location,! write "Error data:",err.Data,! do BACK^%ETN } err–object of %Exception.SystemException class or custom %Exception.AbstractException subclass
^%ETN • ^%ETN – chybový log aplikace. Zachytává pro pozdější analýzu chyby, informace o procesech a obsah zásobníku- • Lze použít společně s $ZTrap, $ETrap, Try/Catch • Vstupní body: • do BACK^%ETN –capture error information (best if used within a trap) • set a=$$LOG^%ETN –capture current process information (no error required) • Zobrazení logu: • Do ^%ERN • Portál -> System Logs -> Application Error Log
Ladění Zenových aplikací • Alerty v prostředí klienta (prohlížeče) • "Standardní" Console (závislé na prohlížeči) window.console.log( "Test" ); //output to JS console • JavaScript Debugger (FireBug/Visual Studio)debugger; • ZLM Client Side Library * • * ZLM implemented in 2008.2 and documented in 2009.1
Zen Client Side Library (ZML) • ZLM –browser independent console and library of Zen-specific trace functions • ZLM.cerr("output arbitrary text"); • ZLM.dumpDOMTreeGeometry(document.body); • var comp = zenPage.getComponentById("txtErrorMessage"); • var div = comp.getEnclosingDiv(); • ZLM.dumpObj(div); • ZLM.dumpElementStyle(div);
Doporučená četba • Using Caché Object ScriptCh. • 13. Error Processing • Ch. 14. Command Line Routine Debugging • Using Caché StudioCh. • 16. Using the Studio Debugger • Developing Zen Applications • Ch. 8. Client Side Library->Debugging Client Side Code
e-Learning • Recordings on debuggingDebugging Caché ObjectScript Routines • Caché Objects –Debugging • SQL Performance and Debugging • Debugging ODBC (Windows/Unix) • CSP: Error Pages and Logging, Error Handling
A to je konec … • Děkuji za pozornost • Otázky?