22,015 bytes added
, 22:59, 9 February 2016
{{header_it|title=Installazione e funzionamento di Xdebug| keyword={{Template:keyword_it_php}}| description=Xdebug ed il debug di codice PHP | link_page=en/xdebug}}
== 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.
<br />
La versione '''5.6''' di '''PHP''' ha introdotto una miglioria molto attesa: '''[http://phpdbg.com/docs 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:
* [http://pecl.php.net/package/apd Advanced PHP Debugger]
: 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.
* [http://www.php-debugger.com/dbg/ DBG]
: 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.
* [https://xdebug.org/ Xdebug]
: 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.
<br />
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 [https://xdebug.org/download.php sito ufficiale di Xdebug] in una directory a piacere. Nel nostro caso utilizzeremo '''/tmp'''.
* Scaricare il file [https://slackbuilds.org/repository/14.1/development/xdebug/?search=xdebug 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:
<syntaxhighlight lang="bash">
PRGNAM=xdebug
VERSION=${VERSION:-2.2.6}
BUILD=${BUILD:-1}
</syntaxhighlight>
Diventerà:
<syntaxhighlight lang="bash">
PRGNAM=xdebug
VERSION=${VERSION:-2.3.3}
BUILD=${BUILD:-1}
</syntaxhighlight>
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
<syntaxhighlight lang="bash">
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}
</syntaxhighlight>
Dovrà essere modficata in:
<syntaxhighlight lang="bash">
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-txz}
</syntaxhighlight>
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.
<syntaxhighlight lang="php">
<?php phpinfo(); ?>
</syntaxhighlight>
Nel caso tutto funzioni a dovere comparirà una sezione dedicata alla configurazione di Xdebug simile a quella riportata nell'esempio sottostante:
{| style="width: 60%;"
|+ '''xdebug'''
|- style="background-color:#9999CC;"
! xdebug support !! enabled
|-
| style="background-color:#CCCCFF;" | Version || style="background-color:#CCCCCC; text-align:right;" | 2.3.3
|-
| style="background-color:#CCCCFF;" | IDE Key || style="background-color:#CCCCCC; text-align:right;" | 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 [https://xdebug.org/docs/remote sito di Xdebug]. L'elenco di integrazioni include plug-in per '''[https://www.eclipse.org Eclipse]''', '''[https://www.kdevelop.org Kdevelop]''', '''[http://php.netbeans.org NetBeans]''' e molto altro ancora. Navigando in rete è inoltre possibile reperire estensioni per Firefox / Seamonkey, Chrome ed altri browser. Esiste anche un programma indipendente [http://robertbasic.com/blog/pugdebug-1-0-0 Pugdebug] distribuito con licenza open source di cui pertanto esiste la disponibilità del [https://github.com/robertbasic/pugdebug 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 '''[https://github.com/joonty/vdebug 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 [https://github.com/joonty/vdebug 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'''
[[File:gvim_xdebug_breakpoint_set.jpeg|||Vdebug - Impostazione di un 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'''.
[[File:gvim_xdebug_session_activate.jpeg|||Vdebug - Attivare una sessione di debug]]
* Ricaricare l'URL entro 20 secondi e la '''sessione di debug verrà automaticamente avviata'''.
[[File:gvim_xdebug_session_active.jpeg|||Vdebug - Sessione di debug attiva]]
* Tornare alla finestra di Vim e premere '''F4''' per eseguire il codice sino al primo breakpoint incontrato.
[[File:gvim_xdebug_debug_in_progress.jpeg|||Vdebug - Debug in corso]]
: 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'''.
[[File:gvim_xdebug_variable_dump.jpeg|||Vdebug - Visualizzare il contenuto di una variabile]]
* 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.
{| class="wikitable"
|+ '''Vdebug - Comandi'''
|- bgcolor="lightgrey"
! style="width:240px" | 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 <br> ''':help VdebugBreakpoints''' per maggiori informazioni
|-
| ''':VdebugEval''' <code> || 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
----
* [http://www.php.net Home page del linguaggio PHP (In inglese)]
* [http://php.net/manual/it/ Manuale del linguaggio PHP]
* [http://pear.php.net Home page della libreria PEAR di PHP (In inglese)]
* [http://pecl.php.net Home page delle estensioni del linguaggio PHP (In inglese)]
* [https://xdebug.org Home page del progetto Xdebug (In inglese)]
* [http://phpdbg.com/docs PHPDbg: il futuro debugger integrato di PHP (In inglese)]
----
{{footer_it | link_page=en/xdebug}}