Xdebug

From Studiosg
Jump to navigationJump to search

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 prosieguo 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
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 prosieguo 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

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.

Vdebug - Attivare una sessione di debug

  • Ricaricare l'URL entro 20 secondi e la sessione di debug verrà automaticamente avviata.

Vdebug - Sessione di debug attiva

  • Tornare alla finestra di Vim e premere F4 per eseguire il codice sino al primo breakpoint incontrato.

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.

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.

Vdebug - Comandi
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





Lingue: English - Italiano