Fejlesztés támogatás Xdebuggal
Török Gábor előadása a Magyarországi Web Konferencia 2007 rendezvényen Fejlesztés támogatás Xdebug címmel.
Fejlesztés támogatás
- Miért van szükség fejlesztés támogató rendszerre?
- Programozói hibák felderítése
- Alkalmazás szűk keresztmetszeteinek felderítése
A programozói munkát fejlesztést támogató eszközök tömkelege segíti. Egyesek az egyszerű kód színkiemeléssel, automatikus sorbehúzással, mások intelligens függvény kiegészítéssel, élő dokumentációval garantálják a fejlesztés hatékonyságát. Szintén idesoroltatnak az ún. debugger, profiler és további a programkód elemzését biztosító eszközök is, amelyekkel programozói hibák, illetve az alkalmazás szűk keresztmetszeteinek felderítése történhet. Az előadás tárgya ez utóbbi csoportba tartozó Xdebug lesz.
Fejlesztés hatékonysága
- Milyen eszközökkel tehető hatékonyabbá a fejlesztés?
assert()
- Unit test
- Error handler, kivételek
- Debugger
A C nyelvből ismert
assertion kifejezések alkalmazásának lehetősége PHP-ben is megvan. (A témában született egy
kiváló két részes cikk Papp Győző tollából a Weblaboron.) A unit teszttekkel alkalmazásunk strapabíróságát, megbízhatóságát, ellenállóságát tesztelhetjük. Saját hibakezelő rendszerrel és a kivételek segítségével több információ tudtható meg a felmerült hibáról.
A debugging fogalma
- define:debugging
„Debugging is a methodical process of finding and reducing the number of bugs, or defects, in a computer program or a piece of electronic hardware thus making it behave as expected.”(Wikipedia/Debugging)
Debuggingnak, debuggolásnak nevezzük azt a módszeres folyamatot, amely a hibák felderítésére, megszüntetésére irányul annak érdekében, hogy a szoftver az elvárt viselkedést tanúsítsa.
Debuggolás menete
- Bug felderítése
- Bug okainak behatárolása
- A pontos ok(ok) meghatározása
- Bugfix fejlesztése
- Bugfix tesztelése, alkalmazása
A debuggolás menete öt lépésre osztható. Először szükséges, hogy a problémát észleljük, valamint határozottan el tudjuk dönteni azt, hogy az észlelt jelenség valóban rendellenes működésnek tekinthető. Ezt követően a bug lehetséges kiváltó okait kell megkeresnünk, majd meg kell találnunk azt a legszűkebb környezetet, amelyben a bug jelentkezik, amelyen belül a hiba reprodukálható. Ha ennek birtokában vagyunk, akkor lehetséges a bugot orvosló javítás fejlesztése, majd ennek végeztével a bugfix tesztelése, valóban megoldást jelent-e a problémára, nem vet-e fel esetleg újabb bugokat, végül a bugfix alkalmazása az eredeti környezetre.
Gyakori PHP programhibák
- Miért száll el a PHP skriptem?
- Szintaktikai hibák
- Nem megfelelően kezelt input
- register_globals, magic_quotes
Regin Gaarsmand
The PHP coder's top 10 mistakes and problems címen publikált cikkében gyakori PHP programozói hibákra hívja fel a figyelmet. Többek között említést tesz a nem megfelelően, rosszabb esetben egyáltalán nem kezelt felhasználói inputokról és a szintaktikai eredetű hibákról, amelyek mind-mind könnyebben kivédhetők megfelelő fejlesztést támogató eszközzel.
Gyakori PHP programhibák (2)
- Végtelen ciklus
- Verem túlcsordulás
- Következetlen névkonvenciók:
kerekit_getprice_numberformat
A PHP interpreter maga kevés információt közöl a levágott végtelen ciklusok, vagy a rekurzív függvény hívások okozta verem túlcsordulás eredetéről. Megfelelő debugger segítségével hamar felderíthető a probléma forrása.
Sterling Hughes a 2003-as New York-i PHPCon konferencián tartott
Top 7 Mistakes in PHP Programming előadásában a PHP alapok ismeretének hiányából fakadó problémákra világít rá.
Elterjedt PHP debuggolási szokások
- Hogyan debuggolunk?
- Nincs debuggolási módszertan
- Színkiemelés
echo, var_dump
display_errors = On
A fejlesztő környezet szintaxis színkiemelésének támogatása, szerver oldalon a hibák kijelzésének bekapcsolása, a felmerült hiba környezetében alkalmazott echo kiíratások mind-mind segítenek a hibák elkerülésében, ill. azok fellelésében, de megfelelő, átgondolt debuggolási módszertan hiányában mindezek csak a felületes (pót)cselekvések.
Hatékonyabb PHP debuggolás
PHP-hez több nyílt forrású debugger is elérhető, ezek közül mi az Xdebuggal foglalkozunk. Természetesen nem áll, hogy ez egyértelműen jobb volna, mint a többi; egyszerűen én ezt szoktam meg, megbízható eszközként tapasztaltam.
Xdebugról
- Debugger, tracer, profiler
- Derick Rethans
- BSD licenc
- PHP Eclipse, Komodo
Az Xdebugot vétek lenne debuggerként felcímkézni; rendkívül jól használható tracer és profiler funkciókat is tartalmaz. A több mint négyéves projekt gondozója többek között a PHP unikód támogatásáért, input_filter kiterjesztésért is felelős Derick Rethans, az eZ system fejlesztője. Az Xdebug nyílt forrású BSD licencelésű. Több keretrendszerrel is képes együttműködni (pl. PHP Eclipse,
Komodo).
Xdebug telepítése
- Telepíthető PEAR/PECL tárolóból
- Legalább PHP 4.3
- Linux, Mac, Windows
- mod_php, FastCGI
yum install php-pecl-xdebug
Az Xdebug elérhető PEAR/PECL tárolókból, de telepíthető a projekt weboldaláról letölthető forráscsomagból is. Helyes működéséhez legalább 4.3-as verziójú PHP interpreter szükséges. A felhasználói visszajelzések alapján Linux, Mac és Windows környezetben megbízhatóan működik. Mind a mod_php, mind a FastCGI illesztővel együttműködik. Fedora Linux alatt akár a sudo apt-get install php-pecl-xdebug paranccsal azonnal telepíthető.
Az Xdebug konfigurálása
- Hogyan kelthető életre az Xdebug?
- /etc/php.ini
zend_extension=/usr/lib/php/modules/xdebug.so
- .htaccess
- ini_set()
Az Xdebug konfigurációs direktívái elhelyezhetők globálisan a php.ini-ben, az adott domén .htaccess fájljában, továbbá a programkód inicializáció részében az ini_set() függvény segítségével. Többnyire én a .htaccess pártfogója vagyok, ezzel a módszerrel jól szabályozható per alkalmazás az Xdebug viselkedése, mégsem szükséges a forráskód érintése.
Az Xdebug működésének ellenőrzése
- Nem működik, mit tegyek?
- Nem kooperál Zend modullal
<?php phpinfo(); ?>
Az Xdebug jelenlétét legegyszerűbben a phpinfo()-val kérdezhetjük le. Fontos megjegyezni, hogy várhatóan nem fog együttműködni egyéb Zend kiterjesztésekkel. Ez a probléma egy későbbi verzióban fog javításra kerülni.
Xdebug mint debugger
- Lássuk a medvét!
- Részletes hiba kimenet
- Felülbírálja a PHP visszajelzését
- Tekintsük át egy Drupal hibakimenetét!
Az Xdebug a PHP beépített visszajelzését felülbírálja, a var_dump() függvényt pedig egy intelligens, színkiemelésre építő függvénnyel cseréli le. Lássuk, hogyan fest egy Drupal 5.1 telepítőjének képernyője Xdebuggal!
Xdebug részletes hibajelzése

Az eredeti PHP hiba üzenet mellett táblázatos formában nyomon követhető az alkalmazás életútja (call stack) a hiba keletkezéséig. Minden egyes sor egy függvény hívást jelöl, annak idő- és memória költségével, a függvénynek át- és abból visszaadott változók értékeivel, továbbá a hívás konkrét helyének megjelölésével. Beállítástól függően a táblázat alatt a helyi, globális, GET-tel vagy POST-tal kapott stb. változók és értékeik sorakoznak fel.
Példa Xdebug konfiguráció
Remote debugging
Az Xdebug képes debugger motorként működni egy fejlesztő környezet (IDE) debuggere keze alatt. A két eszköz kommunikációjához a GDB-t és a fejlettebb DBGp-t támogatja.
Xdebug mint tracer
- define:tracing
A procedure used in debugging programs which involves the display of certain aspects of the program (such as the name of the current subroutine, values in variables, etc.) while the program is running. (AT&T)
Xdebug mint tracer
xdebug_start_trace()
xdebug_stop_trace()
Xdebug mint tracer (3)
Az Xdebug hibaképernyője is tekinthető egyfajta trace-nek, azonban ez a fajta aspektus hiba meglétét feltételezi.
Az Xdebug tartalmazta auto tracing támogatással a programkód módosítása, és annak eredeti kimenetének megváltoztatása nélkül lehetséges az alkalmazás kvázi átvilágítása.
Xdebug mint tracer (4)

Xdebug mint profiler
- define:profiling
A profiler is a performance analysis tool that measures the behavior of a program as it runs, particularly the frequency and duration of function calls. (Wikipedia/Performance analysis)
Xdebug mint profilier (2)
- Idő- és memória költség mérése
xdebug_time_index()
xdebug_memory_usage()
xdebug_peak_memory_usage()
xdebug_get_function_count()
Ha a programkód konkrét szeletének idő- és memóriaköltségeire vagyunk kiváncsiak, a legcélszerűbb talán az Xdebug xdebug_time_index() és xdebug_memory_usage() függvényeit használni. (Valamennyi Xdebug függvény az xdebug_ prefixummal van ellátva.)
Xdebug mint profiler (3)
Az Xdebug a debugging és tracing funkcionalitásán túl profilerként is használható. Az alkalmazás kód teljesítmény faktorainak vizsgálatához szükséges adatokat cachegrind formátumú állományba rögzíti, amely megfelelő grafikus eszközzel (pl. WinCacheGrind, KCacheGrind) könnyen kiértékelhető.
Xdebug mint profiler (2)

Xdebug jövőkép
- Merre tart az Xdebug?
- Xdebug 2.0.0RC3
- Cross-language debugger (Python, Perl)
Az Xdebug várhatóan a jövőben elszakad PHP-s gyökerétől, és egyaránt alkalmazható lesz akár Python vagy Perl nyelvű fejlesztésekhez is.
Összegzés
- Tehát mikor lehet jó az Xdebug?
- Fejlesztési időszakban folyamatosan
- Hibák, kritikus pontok felderítése
- Debuggolási idő redukálása
- Nem helyettesíti a humánt
Az Xdebug segítségével módszeres debuggolási koncepcióhoz szoktathatjuk magunkat, amely javítja a fejlesztés hatékonyságát, csökkentheti a hibakeresésre fordított idő mennyiségét, továbbá lehetőséget teremt az alkalmazás keresztmetszeteinek felderítésére. Mindezek azonban nem helyettesítik a megfelelő fejlesztési módszertant.
A debuggolásról
- Kétszer nehezebb debuggolni, mint kódolni. Ha minden tudásod beleölöd egy kódba, nem fogod tudni debuggolni azt. (Brian Kernighan)
Következik
- Magyarországi Web Konferencia 2007
- Következő előadás Balássy György Microsoft és az AJAX – ASP.NET alkalmazások AJAX-osítása
Felhasznált irodalom
- http://xdebug.org/
- Efficient Debugging with Xdebug, Derick Rethans, Vancouver
- Debugging Questions And Xdebug Answers, Derick Rethans, php|architect