Benvenuti nella pagina Wiki di Simone Giustetti.
Lingue: English - Italiano
Introduzione
PHP è un linguaggio di programmazione maturo sviluppato da una comunità molto attiva nel corso di oltre due decenni. Seppure sia il linguaggio più diffuso per realizzare siti web dinamici, PHP lamenta l'assenza di alcune funzionalità da tempo integrate in linguaggi meno diffusi. Una lacuna evidente consiste nella mancanza di un debugger integrato. Il debug ossia la ricerca e correzione di errori nel software è una delle attività che occupano una notevole frazione del tempo lavorativo di uno sviluppatore. Disporre di strumenti avanzati, semplici da configurare ed di facile utilizzo comporta un aumento di produttività e vantaggi sia per lo sviluppatore che per la clientela.
La versione 5.6 di PHP ha introdotto una miglioria molto attesa: PHPDbg un debugger integrato. Data la giovane età della versione e la grande diffusione di cui ancora godono le precedenti in ambienti di produzione, illustreremo le alternative disponibili a PHPDbg:
- Un primo tentativo di debugger realizzato come estensione del motore Zend. ADP non sembra essere attivamente supportato l'ultimo rilascio ufficiale risale infatti al 2004.
- Prodotto commerciale di cui esiste una versione gratuita con funzinalità limitate e priva di supporto. La versione a pagamento gira con tutte le versioni di PHP fino alla 5.5, mentre quella open source, il cui ultimo rilascio ufficiale risale al 2007, è ferma alla versione 5.2.
- Sembra essere l'unico software sviluppato attivamente ed al momento in cui scrivo queste righe, Gennaio 2016, è prossimo il rilascio della versione 2.4. Si tratta di un prodotto gratuito ed open source il cui codice sorgente può essere liberamente scaricato, studiato, modificato e ridistribuito.
Nel corso del proseguo dell'articolo verrà spiegato come installare, configurare ed utilizzare Xdebug su di una macchina Slackware Linux.
Xdebug
Xdebug è sviluppato come un modulo che estende il motore Zend di PHP aggiungendovi funzionalità utili per eseguire il debug ed il profiling del codice sorgente. Xdebug utilizza il protocollo standard DBGp ed è in grado di:
- Mostrare la sequenza delle chiamate alle funzioni e lo stato dello stack.
- Mostrare l'elenco completo dei valori passati come parametro alle funzioni.
- Tracciare lo stato di occupazione della memoria.
- Eseguire il debug interattivo del codice sorgente tramite un'interfaccia grafica.
Installazione
Di Xdebug è disponibile una estensione in formato PECL (PHP Extension Community Library), ma è anche possibile installarlo come un normale pacchetto Linux. Tra le due soluzioni si è optato per la seconda che, seppur richieda maggior lavoro, garantisce la facoltà di disinstallare, reinstallare ed aggiornare il programma facilmente facendo ricorso ai comandi standard del sistema operativo. La procedura per installare Xdebug a partire dal codice sorgente è dettagliata di seguito. Escluso il download dei file tutte le operazioni devono essere eseguite da un utente amministratore quale root.
- Scaricare un archivio contenente il codice sorgente dal sito ufficiale di Xdebug in una directory a piacere. Nel nostro caso utilizzeremo /tmp.
- Scaricare il file SlackBuild necessario a produrre un pacchetto nel formato standard di Slackware Linux in una directory a piacere. Nuovamente utilizzeremo /tmp.
- Decomprimere il file xdebug.tar.gz che contiene lo script di compilazione xdebug.SlackBuild:
root@darkstar_5:/tmp# tar -zxf xdebug.tar.gz root@darkstar_5:/tmp# ls -la xdebug total 36 drwxr-xr-x 2 1016 users 4096 Dec 25 2014 . drwxrwxrwt 15 root root 4096 Feb 2 18:53 .. -rw-r--r-- 1 1016 users 974 Nov 26 2013 README -rw-r--r-- 1 1016 users 507 Nov 26 2013 doinst.sh -rw-r--r-- 1 1016 users 1093 Nov 26 2013 slack-desc -rwxr-xr-x 1 1016 users 4157 Dec 25 2014 xdebug.SlackBuild -rw-r--r-- 1 1016 users 266 Dec 25 2014 xdebug.info -rw-r--r-- 1 1016 users 1270 Nov 26 2013 xdebug.ini
- Il file dovrà essere modificato impostando il numero di versione corretto di Xdebug. Al momento della stesura del presente articolo la versione 2.4 non è ancora stata rilasciata ufficialmente per cui si utilizzerà la 2.3.3. Aprire il file xdebug.SlackBuild con l'elaboratore di testo preferito, vim nel nostro caso:
root@darkstar_5:/tmp# vim xdebug/xdebug.SlackBuild
Cercare la variabile VERSION modificando il valore assegnato in conformità alla versione di Xdebug:
PRGNAM=xdebug
VERSION=${VERSION:-2.2.6}
BUILD=${BUILD:-1}
Diventerà:
PRGNAM=xdebug
VERSION=${VERSION:-2.3.3}
BUILD=${BUILD:-1}
La modifica è sufficiente per compilare il pacchetto, ma se si preferisse generare pacchetti nel formato txz, il più recentemente introdotto in Slackware, anzichè nel vecchio tgz sarà necessario apportare una modifica alla riga con cui viene invocato il comando di generazione del pacchetto. La riga
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}
Dovrà essere modficata in:
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-txz}
Una volta apportate tutte le modifiche allo script SlackBuild si potrà procedere alla compilazione del pacchetto lanciando lo stesso.
- Copiare l'archivio contenente il codice sorgente nella directory contenente lo script xdebug.SlackBuild:
root@darkstar_5:/tmp# cp xdebug-2.3.3.tgz xdebug
- Lanciare lo script:
root@darkstar_5:/tmp# cd xdebug root@darkstar_5:/tmp/xdebug# sh ./xdebug.SlackBuild
Lo script si occuperà in autonomia di eseguire il comando /usr/bin/phpize, di eseguire la configurazione del codice sorgente e di compilare lo stesso fino a generare un pacchetto nella directory /tmp. Verranno prodotti binari funzionanti sia per la parte server di Xdebug che per quella client: debugclient. Per installare il pacchetto ottenuto si potrà far ricorso al comando standard installpkg come esemplificato di seguito:
root@darkstar_5:/tmp/xdebug# cd /tmp root@darkstar_5:/tmp# installpkg xdebug-2.3.3-x86_64-1_SBo.txz
Configurazione
Una volta installato il pacchetto, si dovrà procedere a configurare PHP in modo che Xdebug venga correttamente caricato ed inizializzato dal motore Zend. L'estensione ed i relativi parametri di funzionamento dovranno essere aggiunti nel file /etc/httpd/php.ini. Nel file deve essere riportata la locazione precisa, completa del path del file xdebug.so: /usr/lib64/php/extensions/xdebug.so in un sistema Slackware Linux a 64 bit.
; StudioSG - Enable xdebug zend_extension="/usr/lib64/php/extensions/xdebug.so" ; StudioSG - Limit recursive calls to 10000 (Avoids starvation) xdebug.max_nesting_level = 10000 ; StudioSG - Xdebug configuration end
Oltre all'estensione è stato imposto un limite al numero di volte che uno script possa essere richiamato in modo da evitare di esaurire per errore le risorse di un server bloccandolo.
La configurazione è conclusa non rimane che riavviare il server web per incominciare ad utilizzare Xdebug. Per verificare che l'estensione Xdebug sia installata e funzionante è possibile scrivere una pagina PHP che richiami la funzione phpinfo() e caricarla nel browser web. Segue un esempio di tale pagina:
phpinfo.php: Pagina che stampa la configurazione di PHP e del motore Zend.
<?php phpinfo(); ?>
Nel caso tutto funzioni a dovere comparirà una sezione dedicata alla configurazione di Xdebug simile a quella riportata nell'esempio sottostante:
xdebug support | enabled |
---|---|
Version | 2.3.3 |
IDE Key | root |
Alternativamente è possibile verificare che l'estensione sia stata correttamente riconosciuta e caricata utilizzando il comando php per elencare i moduli attivi:
root@darkstar_5:~# php -m [PHP Modules] bcmath bz2 calendar Core ctype curl date dba dom enchant ereg exif fileinfo filter ftp gd gettext gmp hash iconv imap intl json ldap libxml mbstring mcrypt mysql mysqli mysqlnd openssl pcntl pcre PDO pdo_mysql pdo_sqlite Phar posix pspell Reflection session shmop SimpleXML snmp soap sockets SPL sqlite3 standard sysvmsg sysvsem sysvshm tokenizer wddx xdebug xml xmlreader xmlwriter xsl zip zlib [Zend Modules] Xdebug
Integrazione con Editor / IDE Esterni
L'utilità di una installazione base di Xdebug può apparire limitata in quanto richiede di modificare il codice sorgente aggiungendo righe specifiche per far si che PHP produca informazioni utili alla correzione degli errori. Sarebbe preferibile eseguire il codice passo, passo senza modificare lo stesso come avviene con altri linguaggi. In effetti Xdebug esporta tutte le informazioni necessarie a visualizzare il flusso del programma durante l'esecuzione, ma non fornisce un ambiente predefinito per visualizzarle. Il vantaggio di Xdebug consiste nell'impiego di un protocollo di debug standard, che consente di interfacciare il servizio con una pletora di ambienti di sviluppo di terze parti tramite moduli dedicati e plug-in specifici. In tal modo è possibile aggiungere al proprio ambiente di sviluppo preferito le funzionalità di debug e profiling del codice.
Un elenco dei client utilizzabili per controllare e correggere il codice remoto è reperibile nelle pagine del sito di Xdebug. L'elenco di integrazioni include plug-in per Eclipse, Kdevelop, NetBeans e molto altro ancora. Navigando in rete è inoltre possibile reperire estensioni per Firefox / Seamonkey, Chrome ed altri browser. Esiste anche un programma indipendente Pugdebug distribuito con licenza open source di cui pertanto esiste la disponibilità del codice sorgente.
Esistono anche diverse estensioni per editor di testo. Poco gradevoli dal punto di vista grafico, ma molto comode per eseguire debug in ambito server ove, per ragioni di sicurezza e prestazioni, spesso non sono installate interfacce grafiche, ma solo strumenti a linea di comando. L'estensione per Vim risulta molto utile in tutte quelle situazioni in cui sia impossibile utilizzare la grafica. Vim è uno degli elaboratori di testo più leggeri e diffusi in ambito Linux / Unix per via della versatilità e dell'impressionante numero di funzionalità che offre.
Xdebug - Integrazione con Vdebug
Esistono due plug-in per integrare Xdebug con Vim. Nel proseguo dell'articolo verrà utilizzata Vdebug: la più recente, che ha sostanzialmente sostituito l'anziana Debugger. Vdebug è un debug client multi-linguaggio in grado di integrarsi con qualsiasi linguaggio ed ambiente di sviluppo che supporti il protocollo DBGP tra cui:
- NodeJS
- Perl
- PHP
- Python
- Ruby
- Tcl
Vdebug necessita che sia installato il linguaggio Python per funzionare.
Di seguito sarà illustrata la procedura per installare Vdebug su di una macchina su cui giri Slackware Linux 14.1.
- Scaricare l'ultima versione disponibile del codice sorgente dal repository git di Vdebug in una direcotry locale ad esempio: /tmp.
- Creare le directory doc, plugin, syntax e tests nella sottodirectory dedicata a Vim presente nella home dell'utente. La directory standard è ~/.vim o $HOME/.vim:
sviluppo@darkstar_5:~$ mkdir ~/.vim/doc sviluppo@darkstar_5:~$ mkdir ~/.vim/plugin sviluppo@darkstar_5:~$ mkdir ~/.vim/syntax sviluppo@darkstar_5:~$ mkdir ~/.vim/tests
- Popolare le directory create con i corrispondenti file estratti dall'archivio di installazione (N.B.: L'elenco dei file riportati di seguito può variare per versioni diverse di Vdebug).
sviluppo@darkstar_5:~$ ls -la ~/.vim/* /home/sviluppo/.vim/doc: total 68 drwxr-xr-x 2 sviluppo users 4096 Dec 5 2014 . drwxr-xr-x 6 sviluppo users 4096 Dec 5 2014 .. -rw-rw-r-- 1 sviluppo users 56210 May 15 2014 Vdebug.txt -rw-r--r-- 1 sviluppo users 3880 Dec 5 2014 tags /home/sviluppo/.vim/plugin: total 20 drwxr-xr-x 3 sviluppo users 4096 Dec 5 2014 . drwxr-xr-x 6 sviluppo users 4096 Dec 5 2014 .. drwxr-xr-x 3 sviluppo users 4096 Feb 20 2014 python -rw-rw-r-- 1 sviluppo users 7158 May 15 2014 vdebug.vim /home/sviluppo/.vim/syntax: total 28 drwxr-xr-x 2 sviluppo users 4096 Dec 5 2014 . drwxr-xr-x 6 sviluppo users 4096 Dec 5 2014 .. -rw-rw-r-- 1 sviluppo users 518 Oct 31 2012 debugger_breakpoint.vim -rw-rw-r-- 1 sviluppo users 541 Oct 31 2012 debugger_log.vim -rw-rw-r-- 1 sviluppo users 637 Oct 31 2012 debugger_stack.vim -rw-rw-r-- 1 sviluppo users 720 Oct 31 2012 debugger_status.vim -rw-rw-r-- 1 sviluppo users 1574 Nov 11 2013 debugger_watch.vim /home/sviluppo/.vim/tests: total 144 drwxr-xr-x 2 sviluppo users 4096 Nov 11 2013 . drwxr-xr-x 6 sviluppo users 4096 Dec 5 2014 .. -rw-rw-r-- 1 sviluppo users 299 May 9 2013 helper.pyc -rw-rw-r-- 1 sviluppo users 7376 May 9 2013 test_breakpoint_breakpoint.py -rw-rw-r-- 1 sviluppo users 10691 May 9 2013 test_breakpoint_breakpoint.pyc -rw-rw-r-- 1 sviluppo users 7336 May 9 2013 test_dbgp_api.py -rw-rw-r-- 1 sviluppo users 9267 May 9 2013 test_dbgp_api.pyc -rw-rw-r-- 1 sviluppo users 2354 May 9 2013 test_dbgp_connection.py -rw-rw-r-- 1 sviluppo users 3821 May 9 2013 test_dbgp_connection.pyc -rw-rw-r-- 1 sviluppo users 5822 May 9 2013 test_dbgp_context_property.py -rw-rw-r-- 1 sviluppo users 7104 May 9 2013 test_dbgp_context_property.pyc -rw-rw-r-- 1 sviluppo users 9134 May 9 2013 test_dbgp_response.py -rw-rw-r-- 1 sviluppo users 12156 May 9 2013 test_dbgp_response.pyc -rw-rw-r-- 1 sviluppo users 1349 May 9 2013 test_opts_options.py -rw-rw-r-- 1 sviluppo users 3030 May 9 2013 test_opts_options.pyc -rw-rw-r-- 1 sviluppo users 9517 May 9 2013 test_ui_vimui_api.pyc -rw-rw-r-- 1 sviluppo users 4708 Nov 11 2013 test_util_filepath.py -rw-rw-r-- 1 sviluppo users 7186 Nov 11 2013 test_util_filepath.pyc -rw-rw-r-- 1 sviluppo users 25 Oct 31 2012 vim.py -rw-rw-r-- 1 sviluppo users 314 May 9 2013 vim.pyc
- Creare i tag necessari per usufruire della documentazione di Vdebug:
sviluppo@darkstar_5:~$ vim :helptags $HOME/.vim/doc
- Aggiornare la configurazione del file php.ini aggiungendo alcune righe:
; StudioSG - Add support for the vim debugger plug-in xdebug.remote_enable = on xdebug.remote_host = localhost xdebug.remote_port = 9000 xdebug.remote_handler = dbgp ; StudioSG - vim debugger configuration end
- Riavviare il web server.
A seguito del riavvio sarà possibile da subito eseguire il debug di script PHP attraverso Vim.
Funzionamento di Vim / Vdebug
Concludiamo l'articolo relativo ad Xdebug illustrando i semplici passi necessari ad avviare ed eseguire una sessione di debug per un generico script PHP. Sono state incluse alcune immagini per descrivere al meglio i passi principali. Nel realizzare le immagini si è fatto ricorso a gVim, la versione con interfaccia grafica di Vim, in modo da usufruire della maggior superfice offerta dallo stesso.
- Aprire in Vim il file di cui si desideri eseguire il debug.
- È possibile specificare il file nella riga di comando con cui si invochi Vim:
vim <path>/<file>
- Oppure avviare Vim ed utilizzare il comando :e <path>/<file_name> per caricare il file desiderato dall'interfaccia del programma.
- Impostare un breakpoint cioè un punto ove si interromperà l'esecuzione del codice PHP e verrà avviata la sessione di debug.
- Vdebug fornisce un comando specifico per Vim: :Breakpoint
- Avviare un web browser ed aprire lo URL della pagina desiderata.
- Accodare la variabile XDEBUG_SESSION_START=1 allo URL.
- Ad sempio: http://example.com/index.php?XDEBUG_SESSION_START=1
- Oppure, nel caso siano presenti più variabili: http://example.com/index.php?pg=11&XDEBUG_SESSION_START=1
- Tornare alla finestra di Vim e premere F5.
- Ricaricare l'URL entro 20 secondi e la sessione di debug verrà automaticamente avviata.
- Tornare alla finestra di Vim e premere F4 per eseguire il codice sino al primo breakpoint incontrato.
- La finestra di Vim verrà suddivisa in due colonne. La colonna a sinistra conterrà il codice sorgente dello script e comanderà la navigazione. La colonna destra è a sua volta suddivisa in riquadri in cui si potranno reperire i valori delle variabili locali, l'elenco dei file aperti elencati nell'ordine di apertura ed altre informazioni utili per decifrare il comportamento dello script.
- Premere F2 per avanzare l'esecuzione del codice di un passo. Nel caso in cui la riga contenesse una chiamata ad una funzione la stessa verrà valutata, ma non verrà mostrato il relativo codice sorgente. Utilizzare il tasto F3 per seguire il flusso delle chiamate a funzione.
- È possibile visualizzare il contenuto di una variabile posizionando il cursore sopra di essa e premendo il tasto F12.
- Una volta trovato quanto desiderato sarà possibile interrompere la sessione di debug premendo il pulsante F6.
Appendice - Comandi di Vdebug
Nella tabella sottostante sono riportati i comandi di uso comune di Vdebug. L'elenco non è esaustivo, ma i comandi inseriti sono sufficienti per eseguire una sessione di debug. Si rimanda alla documentazione ufficiale per una descrizione completa del funzionamento di Vdebug.
Comando | Azione |
---|---|
F2 | Esegui istruzione |
F3 | Esegui istruzione o funzione |
F4 | Esci dalla funzione |
F5 | Avvia il debug |
F6 | Ferma il debug |
F7 | Rimuovi lo script dal debugger |
F9 | Vai a cursore |
F10 | Attiva / Disattiva breakpoint |
F11 | Mostra le variabili di ambiente |
F12 | Mostra la variabile evidenziata dal cursore |
:Breakpoint <type> <args> | Aggiungi un breakpoint generico :help VdebugBreakpoints per maggiori informazioni |
:VdebugEval
|
Esegui il codice e mostra il risultato |
<Leader>e | Esegui l'espressione evidenziata e mostra il risultato |
:VdebugOpt debug_file <file> | Imposta un file di log |
:VdebugOpt debug_file_level 2 | Imposta quanto sia prolisso il log |
Conclusioni
Nel corso dell'articolo è stata descritta la procedura per installare Xdebug su di una macchina Slackware Linux. In seguito è stato illustrato come installare e configurare Vdebug, un'estensione di Vim che collega l'elaboratore di testo ad Xdebug, ed è stata eseguita una sessione di debug di codice PHP tramite Vim. Con la versione 5.6 di PHP è stato introdotto un nuovo debugger integrato il cui funzionamento e le cui differenze con Xdebug saranno oggetto di un futuro articolo.
Per commenti, consigli, domande inviate una e-mail all'indirizzo studiosg [chiocciola] giustetti [punto] net.
Link esterni
- Home page del linguaggio PHP (In inglese)
- Manuale del linguaggio PHP
- Home page della libreria PEAR di PHP (In inglese)
- Home page delle estensioni del linguaggio PHP (In inglese)
- Home page del progetto Xdebug (In inglese)
- PHPDbg: il futuro debugger integrato di PHP (In inglese)
Lingue: English - Italiano