Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

web psaný na oprátce

Laděnka, jak se vám líbí?

Laděnka je užitečnou každodenní pomocnicí PHP programátora. Její oficiální jméno zní Nette::Debug.

Upozornění: Aktuální informace najdete na webu Nette Framework.

Každý ladič je dobrým kamarádem s funkcí var_dump, která podrobně vypíše obsah proměnné. Bohužel v prostředí HTML výpis pozbude formátování a slije se do jednoho řádku, o sanitizaci HTML kódu ani nemluvě. V praxi je nezbytné var_dump nahradit šikovnější funkcí. Tou je právě Debug::dump()

$arr = array(10, 20.2, TRUE, NULL, 'hello');

Debug::dump($arr);
// včetně jmenného prostoru Nette::Debug::dump($arr);

vygeneruje výstup:

array(5) {
  [0] => int(10)
  [1] => float(20.2)
  [2] => bool(true)
  [3] => NULL
  [4] => string(5) "hello"
}

Dalším užitečným nástrojem ladiče jsou stopky s přesností na mikrosekundy:

Debug::timer();

// princi můj malinký spi, ptáčkové sladce již sní...
sleep(2);

$elapsed = Debug::timer();
// $elapsed ≈ 2

Tohle všechno jsou sice užitečné drobnosti, skutečným killerem je však jiná Laděnčina vlastnost. Zpráva o nezachycené výjimce nebo chybě poskytuje vývojáři důležité informace o tom, kde a proč k ní došlo. Standardní výstup v PHP vypadá asi takto:

Standardní podoba nezachycené výjimky

Pusťme však ke slovu Laděnku. Po aktivaci příkazem Debug::enable() nám předvede svou nejvíce sexy polohu:

Nezachycená výjimka v provedení NDebug

Takto vypadá výjimka, takto vypadá vygenerovaná chyba. To je pak jiné ladění, co?

Snad nemusím dodávat, že vypisování chyb se nesmí nikdy dostat na produkční server. Je to výborná společnice na pracovišti, ale nikdy ji nesmíme brát sebou ven. Je totiž děsně ukecaná a vyzradí na vás úplně všechno (nicméně kdyby k tomu náhodou došlo, má integrovaný systém pro skrytí citlivých políček, např. hesel). Na produkčním serveru je však možné nechat výpisy ukládat do adresáře nebo odesílat administrátorovi emailem.

→ Download: Nette::Debug.zip, licence, překlad

(doplněno: mám na vás prosbu…)

Karma body: 35. Líbil se vám článek?

Komentáře » přidat

  1. avatar [1] Hrach: nový

    Miluju laděnku :-* Ty krásné tvary, vnady, ta barva očí, rozevíratelné oblasti, jej, až sem se ztoho celý okouzlil.

    Posláno 30. 1. 2008 v 15.43 | Odpovědět
    Na komentář reagoval [12] Ondra
    Na komentář reagoval [15] bratr ekim
  2. avatar [2] enoice: nový

    Tak to je bomba, Dave! Dokonalost :-)

    Posláno 30. 1. 2008 v 15.46 | Odpovědět
  3. avatar [3] papi: nový

    Vypadá to velmi, velmi dobře. Jak dlouho si s ní už užíváš?

    Posláno 30. 1. 2008 v 16.28 | Odpovědět
  4. [4] Tom: nový

    Vypadá dobře, pro potření prvně zmi=novaných problémů používám xdebug, neškodí si navzájem?

    Posláno 30. 1. 2008 v 16.29 | Odpovědět
  5. avatar [5] Pixy: nový

    Gratuluji ke krásné holčičce. Laděnka vypadá moc mile a chytře. Radost.

    Posláno 30. 1. 2008 v 16.36 | Odpovědět
  6. avatar [6] Littlemaple: nový

    Opravdu sexy! :)

    Posláno 30. 1. 2008 v 17.02 | Odpovědět
  7. [7] v6ak: nový

    Dobrý. ukecaností mi to připomíná ASP.NET. Taky jsem narazil na server se zapnutým debugem…
    Já mám vlastní debug nástroj, ale laděnka je patrně lepší. Ale:

    • může mít laděnka více výstupů (HTML, text, …)?
    • Je možné nastavit zapnuto/vypnuto?
    Posláno 30. 1. 2008 v 17.06 | Odpovědět
    Na komentář reagoval [10] David Grudl
  8. avatar [8] tark: nový

    Mě by se spíš líbilo něco jiného. Přesměrovat výstup laděnky (tedy NDebug.template) do souboru a navázat na NDebug vlastní nástroj pro zachytávání výjimek. Šlo by to? :)

    Posláno 30. 1. 2008 v 17.08 | Odpovědět
    Na komentář reagoval [10] David Grudl
  9. [9] džidžir: nový

    Moc pěkné. Umí to rozumně odchytnout i Fatal Errory?

    Posláno 30. 1. 2008 v 17.11 | Odpovědět
    Na komentář reagoval [10] David Grudl
  10. avatar [10] David Grudl: nový

    [7] v6ak: zapíná se přes NDebug::enable(), je možné zapnout i textový výstup NDebug::$html = TRUE, respektive v CLI režimu se zapne automaticky. Ale ten není zdaleka tak ukecený, spíš odpovídá standardnímu PHP výstupu.

    Textový režim existuje hlavně hlavně kvůli tomu, že změní chování NDebug::dump(). Hodí se mi to k testování kódu – z příkazové řádky spouštím sadu malých testovacích příkladů, zachytávám výstup a porovnávám s referenčním.

    [8] tark: zachytávát můžeš i vlastním nástrojem a k vykreslení použít NDebug::bluescreen(). I když asi by to vyžadovalo drobnou úpravu kódu.

    [9] džidžir: systémové fatal errory v PHP bohužel nijak odchytit nelze, na to už jsem si stěžoval dříve. Jen
    E_USER_ERROR a E_RECOVERABLE_ER­ROR.

    Posláno 30. 1. 2008 v 17.39 | Odpovědět
    Na komentář reagoval [11] džidžir
    Na komentář reagoval [13] v6ak
    Na komentář reagoval [19] veena
  11. [11] džidžir: nový

    [10] David Grudl:

    systémové fatal errory v PHP bohužel nijak odchytit nelze, na to už jsem si stěžoval dříve.

    Jo, už jsem na to taky došel. Velký problém, pokud ladím na serveru a server má vypnuté v konfigu z pochopitelných důvodů vypisování chyb. Zend sliboval před časem odchytávatelnost některých FE, myslím že těch, při kterých zůstane stabilní jádro.

    V Perlu jde třeba zachytit a zpracovat jakákoli chyba, dokonce i chyby při parsování skriptu. Ale Perl koneckonců také není určen pro psaní skriptů pro web.

    Posláno 30. 1. 2008 v 18.49 | Odpovědět
  12. [12] Ondra: nový

    [1] Hrach: Řekl bych, že by si spíš potřeboval na chvíli vyměnit klávesnici a myš za pořádnou ženskou :)

    Jinak NDebug je super ;)

    Posláno 30. 1. 2008 v 19.12 | Odpovědět
    Na komentář reagoval [15] bratr ekim
  13. [13] v6ak: nový

    [10] David Grudl: Já jsem dělal přímo možnost použití šablon, ale v praxi to stačí. Automatické zapínání textového režimu nemám. Jde mi taky pochopitelně hlavně o komandlajnu.
    K vypínání: Jo, to jsem si přečet, ale jde mi hlavně o debugování.
    [0] Ještě jeden návrh převzatý z mé víceméně staré primitivní debugovací knihovničky: Velké plus (oproti var_dump a print_r) je v tom, že umožňuje výpis části výrazu:

    if( v6_deb(výraz 1) == v6_deb(výraz 2) ){
    ...

    Případně lze dodat komentář:

    if( v6_deb(výraz 1, 'komentář 1') == v6_deb(výraz 2, 'komentář 2') ){
    ...

    Vtip je pochopitelně v tom, že zadaný parametr 1 je zároveň návratovou hodnotou.

    Posláno 30. 1. 2008 ve 20.10 | Odpovědět
  14. avatar [14] paranoiq: nový

    davide, gratuluji. udělal jsi nádherné udělátko :)

    sám používám něco podobného jako NDebug::dump() ve formě jedinné funkce dump(). výstup je trochu méně ukecaný, zato ale hraje všemi barvami :), umí vypsat pole a objekty povolných tříd† rekurzivně do zvolené hloubky, přičemž defaultně censoruje hodnoty jistých názvů (kdybych ji přeci jen někde zapoměl)

    † povolná třída obsahuje:
    public function _dump() {
    return (array)$this;
    }

    Posláno 30. 1. 2008 ve 20.18 | Odpovědět
  15. [15] bratr ekim: nový

    [12] Ondra: asi tak no
    [1] Hrach: jo něco takového sem potřeboval už dlouho :D

    Posláno 30. 1. 2008 ve 21.05 | Odpovědět
  16. avatar [16] Littlemaple: nový

    Mno, tak první dojmy: Nemohla by mít Laděnka cestu k oné úžasné šabloně modifikovatelnou? Rád bych si ji dal jinam než do stejného adresáře jako třídu.

    Jistě, stačí si to tam přepsat nebo ručně přidat jednu public vlastnost, ale tím se připravuji o dopřednou kompatibilitu s možnými dalšími verzemi Laděnky :) .

    Posláno 30. 1. 2008 ve 22.12 | Odpovědět
  17. avatar [17] Věroš: nový

    Jo, tohle mi v PHP chybělo. ;-)

    <hr />

    Nechca být za rejpala, ale podobný nástroj máme v Pythonu už pár let ve vlajkové knihovně .

    Když jsem na cgitb poprvé narazil, tak jsem myslel, že nemůže být nic lepšího.

    Rychle jsem ale zjistil, že může – jen jsem tomu nekrofilnímu vrtání se v zemřelém kódu ještě nepřišel na chuť. Ano, post-mortem inspector v okně prohlížeče v Pylons mne opravdu překvapil.

    PS: Jo a to že tracebacky mohou správcům chodit e-mailem včetně session, parametrů dotazu, cookies, hlaviček, identifikace prohlížeče a čísla bot uživatele, to jsem už říkal?

    Posláno 30. 1. 2008 ve 23.26 | Odpovědět
    Na komentář reagoval [21] David Grudl
  18. avatar [18] Oswald: nový

    Něco podobného je v symfony frameworku, jenom to není tak přehledné a navíc tam jsou vypsány i globální proměnné, což je také užitečné.

    Posláno 30. 1. 2008 ve 23.43 | Odpovědět
    Na komentář reagoval [20] golf
    Na komentář reagoval [21] David Grudl
  19. [19] veena: nový

    [10] David Grudl: Nelze ten fatal error odchytnout pomocí output_bufferingu?
    http://cz2.php.net/…rror_handler#…

    Laděnka pěkná!

    Posláno 31. 1. 2008 v 8.09 | Odpovědět
    Na komentář reagoval [22] David Grudl
  20. [20] golf: nový

    [18] Oswald: Symfony je tak dokonale, az je problem tu dokonalost pochopit :-) A ja z toho mam jen schizofrenii, pouzivat dokonale Symfony, nebo pouzivat skvele Nette. A dokonce se zda, ze i Zend ve verzi 1.5 zacina byt pouzitelny. No co vcil???????

    Posláno 31. 1. 2008 v 8.21 | Odpovědět
  21. avatar [21] David Grudl: nový

    [17] Věroš: [18] Oswald: narovinu, chtěl jsem vidět, jak vypadá taková obrazovka v jiných systémech, ale pokud si jej nestáhneš, nenainstaluješ, nepochopíš, nerozchodíš a nevyhodíš výjimku, tak to nemáš šanci zjistit. Ani tvůj odkaz mi v tom nepomohl.

    Takže mám prosbu pro všechny uživatele různých frameworků: hoďte sem odkaz na „blue screen“, pokud je něčím zajímavý, Nemusí být „živý“, stačí htmlshot.

    ad odesílání emailem: odesílání nebo ukládání do adresáře řeším přes jinou třídu, k tomu se dostaneme.

    Posláno 31. 1. 2008 v 11.14 | Odpovědět
    Na komentář reagoval [23] Oswald
    Na komentář reagoval [24] v6ak
    Na komentář reagoval [25] Věroš
  22. avatar [22] David Grudl: nový

    [19] veena: obecně není problém

    1. jak vykonat kód po vzniku chyby, ale
    2. jak chybu detekovat

    ad a) při normálním ukončení skriptu se ještě zavolají handlery pro

    PHP garantuje (od verze 5.0.5), že session se uzavře až po zavolání všech destruktorů, jinak pořadí ovlivňuje garbage collector.

    Při vzniku fatální chyby se destruktory zřejmě vynechají. Stále tu však máme tři momenty, kde na ni můžeme reagovat. Klíčová je tedy otázka b), jak chybu od korektního ukončení detekovat?

    To netuším. Bohužel ani novinka error_get_last nepomůže. Ovšem skenování output bufferu na řetězec <b>... error</b> k rozumným obecně použitelným řešením podle mého nepatří ;)

    Posláno 31. 1. 2008 v 11.49 | Odpovědět
  23. avatar [23] Oswald: nový

    [21] David Grudl: tady je htmlshot ze symfony

    Symfony kromě toho v debug módu zobrazuje nad stránkou toolbar, kde jsou informace o prováděných SQL dotazech, konfiguraci, délce trvání jednotlivých úkonů apod., považuji to za velmi užitečné a myslím, že by to mohlo být celkem inspirativní:

    http://www.symfony-project.org/…gement-Tools#…

    Posláno 31. 1. 2008 v 11.59 | Odpovědět
  24. [24] v6ak: nový

    [21] David Grudl: To se asi mě netýká, že?

    Posláno 31. 1. 2008 ve 13.24 | Odpovědět
  25. avatar [25] Věroš: nový

    [21] David Grudl: Odpovídám soukromě.

    Posláno 31. 1. 2008 ve 13.56 | Odpovědět
  26. avatar [26] SodaE: nový

    Fakt super,duper :-) , tohle využiju

    Posláno 31. 1. 2008 ve 14.08 | Odpovědět
  27. [27] Tarmaq: nový

    Poslusne hlasim ze ve Firefoxu 2.0.0.11@OpenSUSE 10.3 Gnome se zobrazi vse jak ma, v Konqueroru 3.5.7 nelze rozbalovat Call Stack, Source File, atd. tyto polozky lze pouze zabalit.. Samozrejme mam Konqueror pod Gnome, takze je mozne ze v KDE to pobezi v pohode, ale IMHO by to nemelo mit vliv.. Nevim jestli to nejak pomohlo, ale snad jo ;]

    Posláno 31. 1. 2008 ve 14.30 | Odpovědět
    Na komentář reagoval [30] David Grudl
  28. avatar [28] JS: nový

    Hmm, nějak se mi nepovedlo ji rozběhat pro vyjímky :-(

    Zobrazování všech vyjímek sice funguje v závislosti na tom, jakou úroveň reportování nastavím, ale zobrazí se v klasickým (hnusným) PHPkovským hávu.

    Errory naopak zobrazuje správně tak, jak ukazuje příklad.

    Mohl by mi prosím někdo poradit, co by mohlo být špatně? Díky.

    Posláno 31. 1. 2008 ve 14.33 | Odpovědět
    Na komentář reagoval [30] David Grudl
  29. avatar [29] Kamil: nový

    Ahoj Davide: error a výjimka hodí chybu, dump logicky ne, server běží na linuxu:

    Fatal error: Maximum execution time of 60 seconds exceeded in /home/localhos­t/www2/class/NDe­bug/Nette/NDe­bug.php on line 158

    Info: Red Hat 2.6.18–53.1.4.el5×en, PHP Version 5.1.6, safe_mode Off, … ?

    Posláno 31. 1. 2008 v 15.35 | Odpovědět
    Na komentář reagoval [30] David Grudl
  30. avatar [30] David Grudl: nový

    [27] Tarmaq: to mi moc nepomůže, potřeboval bych konkrétní opravu kódu.

    [28] JS: výjimky s úrovní reportování nijak nesouvisí. Prostě vyhoď výjimku throw new Exception; a nezachycuj ji.

    [29] Kamil: zajímavá chyba v ob_get_level, vyřešíme přes email.

    Posláno 31. 1. 2008 v 17.13 | Odpovědět
  31. avatar [31] Vrtak-CZ: nový

    Czus tak jsem si s ladenkou trochu hral a vzniklo z toho nakonec docela zajimava hracicka… :-) Ladenka vs. DiBi a taky sem si trochu pohral s dumpem Ladenka vs. Dump
    Jinak dekuju DGX za sqvelou vecicku… :-)

    Posláno 2. 2. 2008 ve 14.52 | Odpovědět
    Na komentář reagoval [32] Patrik Bóna
    Na komentář reagoval [38] David Grudl
  32. [32] Patrik Bóna: nový

    Cau Dgx,

    Qcodo ma podobny error handler, ale nieje vnom tolko info ako v tvojom, len tak dalej ;)

    [31] Vrtak-CZ: Ladenka vs. DiBi je tiez super ;)

    Posláno 7. 2. 2008 v 19.59 | Odpovědět
  33. avatar [33] David Grudl: nový

    Přidal jsem experimentální podporu pro logování chyb (via NDebug::enable(E_ALL, $logFile)), odesílání chyb na email (NDebug::enable(E_ALL, $logFile, $email)). Na produkčním serveru se při uvedení druhého parametru (tj. logovacího souboru) automaticky vypne vypisování chyb .

    Posláno 12. 2. 2008 v 6.56 | Odpovědět
  34. avatar [34] Inza: nový

    Perfektní, naprosto dokonalé Davide!:-)

    Posláno 12. 2. 2008 v 8.04 | Odpovědět
  35. [35] tajo: nový

    skvělý nástroj! dík

    Posláno 14. 2. 2008 ve 23.29 | Odpovědět
  36. avatar [36] lordfrikk: nový

    Když jsem viděl slovo „laděnka“, tak moje první reakce byla, jak se anglicky říká: „I lol'd.“ :-)

    Posláno 18. 2. 2008 v 10.42 | Odpovědět
  37. avatar [37] Neph04: nový

    To propojeni DIBI-Ladenka… neslo by implementovat do Ladenky neco jako udelal Vrtak?
    Nasel sem dibi nedavno, a sem z nej nadsenej :) Dneska sem tu narazil na Ladenku a je to genialni vec…

    Posláno 20. 2. 2008 ve 14.36 | Odpovědět
    Na komentář reagoval [38] David Grudl
  38. avatar [38] David Grudl: nový

    [31] Vrtak-CZ: [37] Neph04: jo, udělal to pěkně a určitě něco podobného implementovat (přes obecný interface) plánuju.

    Posláno 20. 2. 2008 v 15.16 | Odpovědět

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře ani hlasovat

Výtah na začátek článku na první komentář

Názory čtenářů v diskusích nejsou názory provozovatele webu, a ten za jejich obsah neodpovídá.

La Trine © 2004, 2008 David Grudl – o webu

Jakékoliv užití obsahu, včetně převzetí článků nebo jejich částí, je bez předchozího písemného svolení autora zakázáno.

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.