Forum Delphi.cz

Delphi => Obecné => Téma založeno: < z > 09-06-2012, 21:52:35

Název: Debugger, ladeni a veci kolem toho
Přispěvatel: < z > 09-06-2012, 21:52:35
Nikdo se neodvazil napsat prvni dotaz, tak se zeptam sam :)

Znam veci jako madExcept, EurekaLog, JclDebug ... ale popravde, nikdy jsem
to nejak moc nezkoumal.
Vetsinou si vystacim s try-finally-except a odchytavani primo v design time,
ASM neznam, takze to je tam pro me spanelska vesnice pouzivat ten CPU vypis.
Lze se nejak jinak dostat k nejake srozumitelne stack trace bez pouziti tech vyse zminenych pomucek?

Nekdy ne az tak davno jsem se dostal k vyhledani chyby podle adresy (Search->Find error),
ale obcas se stane, ze to vyhodi nejaky EAccessViolation at 0x00000 ... a nemam sanci potom
zjistit, cim to bylo. Obcas to vyhodi nejaky problem s TStringList a uz taky nedojdu, kterej to vlastne byl  :-\

Co vsechno pouzivate pri ladeni programu a hledani chyb? A jak to resite na strane koncoveho uzivatele?
Název: Re:Debugger, ladeni a veci kolem toho
Přispěvatel: leonell 10-06-2012, 09:09:21
Není to úplně na 100% to, na co se ptáš, ale já používám Log4delphi.

To je Delphi implementace slavného log4java a používaveného i v dotnet jako log4net.

Funguje to tak, že máš nějaký globálně přístupný objekt logger, tomu nadefinuješ způsob logování neboli Appender (do souboru, do databáze, na konzoli) a úroveň logování (TRACE, DEBUG, INFO, ERROR, FATAL) a formát záznamu (čas, hláška, výjimka, název loggeru). Těch  appenderů můžeš mít víc. Můžeš třeba do souboru logovat vše a zároveň (jen) chyby posílat mailem.

Ve svém programu pak máš cosi jako:
 gLogger.Info('Vstup Vypocet() s '+IntToStr(a)+' a '+IntToStr(b));
 ...
 gLogger.Info('Vystup Vypocet() s hodnotou '+IntToStr(vraceno));

Existují odpovídající volání Debug(), Trace(), Info(), Error(), Fatal().

A v logu máš:
25 9 2011 20:54:05:378 [INFO] ROOT: Vstup Vypocet() s 5 a 2
25 9 2011 20:54:06:812 [INFO] ROOT: Vystup Vypocet() s 7

Takže řekněme, že máš try/except a v něm volání Error().
Pokud zákazníkovi nastane chyba, tak je zalogovana. Míra informací je dána nastavenou úrovní a jak moc sis to doplnil do metod. A záleží na tobě, jak si to obsloužíš. Můžeš mít v aplikaci "Hlášení chyby" kam se to přiloží, nebo se to odešle samo,...

V Delphi s tím zkušenost z praxe zatím nemám, v Javě to fungovalo na řízení výroby 24x7. Když jsi se na tu mašinu vzdáleně přilogoval a pustil jsi si náhled toho logu,
tak ti tam v reálném čase skákalo co dotyčný dělá, na jaké zakázce, jakým momentem utahuje šrouby, jaké díly naskenoval a přiřadil do výrobku, vše obaleno informacemi o metodách a objektech které to realizovaly.

Tam (v Javě) to také mělo více možností, umělo to zapisovat do systémových logů, posílat emailem, komunikovat  webovými službami. Tady by se to muselo dopsat, ale nebyl by  to velký problém.
Samozřejmě si to sežere nějaký výkon v rámci aplikace.
Název: Re:Debugger, ladeni a veci kolem toho
Přispěvatel: < z > 10-06-2012, 11:28:38
Tohle jsem take chtel zahrnout do meho dotazu, ale pak sem to vynechal.
Neco takoveho mam po svojem udelane, v zakladni verzi.
log4net vypada propracovaneji. To se muze hodit :)
Název: Re:Debugger, ladeni a veci kolem toho
Přispěvatel: yamaco 10-06-2012, 12:50:47
Zdravím, roky používám EurekaLog k plné spokojenosti. V aplikacích mám nastaveno jako neaktivní a pokud vznikne problém, uživatel zapne ladící režim a v okamžiku vzniku chyby se vytvoří ELF soubor s podklady k lokalizaci chyby - může se odeslat buď manuálně nebo automaticky stylem Windows dialogu o chybách (emailem nebo přes dočasně vytvořený SMTP server).
Výhodou je, že po načtení ELF souboru v IDE okamžitě vidím, na kterém řádku chyba vznikla, přepis instrukcí v assembleru, konfiguraci PC, obsah RAM v okamžiku chyby a mnoho dalších informací.
Vizuální prvky pro uživatele (dialog) jsou nastavitelné a lokalizovatelné.
EL mi zcela vyhovuje, poslední verze je již i pro 64bitové aplikace.
Název: Re:Debugger, ladeni a veci kolem toho
Přispěvatel: zdenek 10-06-2012, 18:43:01
Také se přidávám k Eurekalog. Máme ji na firmě aktivovanou automaticky pro všechny projekty a napojenou na Mantis. Už bez toho ani nemůžu být. Spousta věcí se tak odhalila, ani jsem o nich netušil.
Název: Re:Debugger, ladeni a veci kolem toho
Přispěvatel: Radek Červinka 10-06-2012, 20:37:51
Já používám JCLDebug a jeho mechanismus - http://delphi.cz/post/Exception-dialog.aspx , popr. v novějších Delphi můžeš používat mechanismus v RTL - http://delphi.cz/post/delphi-new-exception.aspx
Název: Re:Debugger, ladeni a veci kolem toho
Přispěvatel: < z > 10-06-2012, 21:12:48
EurekaLog/madExcpet vypadaji dobre, ale ta cena ...
na to JCLDebug se jeste jednou mrknu, nemusel by to byt az tak hrozny napad pouzivat to vsude
Název: Re:Debugger, ladeni a veci kolem toho
Přispěvatel: pepak 10-06-2012, 21:52:46
Eureka je fakt dobrá, nelituju těch peněz, co jsem do ní vrazil.
Název: Re:Debugger, ladeni a veci kolem toho
Přispěvatel: raul 10-06-2012, 23:14:03
Eureku taky pouzivam, nejvice na ML. A doprogramoval jsem si detekci ML ve vlaknech (aplikace 24/7 takze nejaky ml pri ukonceni me fakt nestvou jako ty ostatni). Zrovna resim s autory, jestli to zaintegruji casem primo do Eureky.
Název: Re:Debugger, ladeni a veci kolem toho
Přispěvatel: Jan Fiala 11-06-2012, 06:29:02
Pouzivam JCL Debug.
Název: Re:Debugger, ladeni a veci kolem toho
Přispěvatel: SaLIk 05-08-2012, 02:30:41
Dřív jsem používal JCL (exception dialog ještě neměl wizarda). Teď když jsem v Delphi2010 přidal přes wizarda JCLdialog (verze 2.3.1.4197), tak se v něm při vyjimce nezobrazí STACK list (map soubor mam pripojeny). Kdyz jsem pouzil dialog ze starsi verze a upravil par radku, tak se mi v nem stack list zobrazi. Neví někdo, proč dialog z wizarda stack nezobrazí? Další věcí je, že pro chybu conastane v jinem vlaknu nez hlavnim se dialog vubec nezobrazi. Musi se jeste neco extra nastavovat, aby se dialog zobrazil i pri chybe ve vlaknu?
Název: Re:Debugger, ladeni a veci kolem toho
Přispěvatel: SaLIk 05-08-2012, 12:01:08
omlouvám se za "planý poplach" .. byl jsem už asi v polospánku .. teď jsem opět zkoušel exception dialog z wizardu a stack list se zobrazí normálně  ;)