Depurando aplicaciones php con xdebug

Author: Hugo Ruscitti
Date: 16 de Junio 2010

Introducción

author de la imagen joka200 (CC)

Xdebug es un módulo que te permite depurar aplicaciones escritas en el lenguaje de programación PHP.

En este artículo veremos una de las funcionalidades que permite xdebug: depurar una aplicación de manera interactiva, inspeccionando variables, controlando la ejecución del programa y algunos conceptos básicos.

También veremos dos herramientas alternativas para interactuar con xdebug: NetBeans y VIM. De forma que puedas darte una idea general de lo que ofrece cada una.

Instalación

Para instalar xdebug se puede usar directamente el sistema de paquetes apt:

apt-get install php5-xdebug

Este comando instala varios archivos en tu sistema, uno de ellos es /usr/share/php5-xdebug/xdebug.ini-dist.

Tenes que abrir este archivo, copiar las lineas que aparecen y agregarlas a tu archivo /etc/php5/apache2/php.ini.

Luego de los cambios el archivo php.ini tendría que terminar con algo similar a lo siguiente:

zend_extension=/usr/lib/php5/20090626+lfs/xdebug.so

Luego se tiene que reiniciar el servidor web y probar si la extensión se cargó correctamente:

apache2ctrl restart

Una forma de ver si xdebug se cargó correctamente es crear un archivo php donde se ejecute la función phpinfo(), y luego ver el resultado dentro del navegador.

Este es un ejemplo de cómo se tendría que ver la salida de phpinfo:

images/phpinfo.png

Depuración remota

Una de las posibilidades que brinda xdebug se denomina depuración remota, y consiste en que puedas controlar la ejecución de un programa de manera interactiva desde una aplicación.

Para seguir este artículo vamos a habilitar esa posibilidad, lo primero que tiene que modificar es el archivo php.ini agregando lo siguiente:

[xdebug]
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_handler=dbgp

y luego reiniciar nuevamente el servidor web:

apache2ctrl restart

Componentes

xdebug funciona como una aplicación cliente-servidor, porque en realidad cuando usas xdebug no estás interactuando directamente con xdebug sino mediante una aplicación.

xdebug se encarga de interceptar el flujo de ejecución normal de php e intercambia mensajes con una aplicación clientes para que le dé órdenes. En nuestro caso, esa aplicación cliente que da ordenes puede ser NetBeans o VIM.

Entonces, para que podamos empezar a depurar un programa necesitamos decirle a xdebug que vamos a ponerlo en comunicación con una aplicación cliente.

Ejemplo

Para iniciar la depuración mediante un explorador web, tienes tres posibilidades:

  • instalar un complemento que inicie o termine la sesión de depuración.
  • agregar un parámetro a la URL del sitio para controlar a XDEBUG.
  • habilitar la funcionalidad de manera permanente.

Personalmente me resulta mas sencilla la primer opción, por ejemplo firefox tiene un complemento que inserta un icono en parte inferior de la pantalla para eso: También hay una extensión de firefox que hace esto, está en:

https://addons.mozilla.org/en-US/firefox/addon/58688/
images/easy_xdebug.png

el navegador Chrome tiene algo similar:

https://chrome.google.com/extensions/detail/eadndfjplgieldjbigjakmdgkmoaaaoc

En cambio, si no se quiere instalar un complemento adicional se puede utilizar la URL del sitio como canal de comunicación con xdebug. Por ejemplo, para controlar xdebug se puede usar alguno de estos parámetros get:

XDEBUG_SESSION_START=session_name
XDEBUG_SESSION_STOP

por ejemplo: localhost/mi_app/index.php?XDEBUG_SESSION_START=1.

Y por último, si se quiere dejar habilitada la depuración remota de forma permanente se puede agregar la siguiente linea al archivo php.ini:

xdebug.remote_autostart=1

Aplicación de ejemplo

Comencemos con algo muy sencillo, un programa php que imprime una lista de números en inglés:

<?php

echo "Contando numeros:";

$numbers = array("one", "two", "three");

echo "<ul>";

foreach ($numbers as $n)
{
    echo "<li>$n</li>";
}

echo "</ul>";
?>

Si guardamos este programa en un archivo cualquiera y lo solicitamos desde un navegador tendríamos que ver en pantalla algo así:

images/app.png

Depurar desde NetBeans

NetBeans tiene complementos para funcionar como un cliente de xdebug, solo que antes se tiene que crear un proyecto PHP para representar a la aplicación.

Una vez identificado el archivo a depurar se tiene que hacer click sobre la numeración de lineas para definir un breakpoint.

Note

Un breakpoint es un punto de corte, un lugar donde queremos que el programa se detenga para inspeccionarlo.

Luego, se tiene que solicitar la página desde un navegador y se producirá la conexión entre netbeans y xdebug.

images/window.png

A partir de ahora se pueden utilizar los botones de la barra de herramientas para controlar la ejecución del programa:

images/buttons.png

Instalación

Tienes que descargar el siguiente complemento:

http://www.vim.org/scripts/script.php?script_id=1929

luego descomprimirlo y copiar su contenido dentro el directorio .vim/. Por ejemplo con los siguientes comandos:

cd ~/.vim
wget http://www.vim.org/scripts/download_script.php?src_id=7285 -O xdebug.zip
unzip xdebug.zip

Iniciando la depuración

Lo primero que tienes que hacer es iniciar el depurador con F5, eso hace que vim abra una conexión en el puerto 9000 esperando a que xdebug inicie la comunicación (aquí tendrías que darle actualizar al navegador).

Note

Inicialmente el complemento tiene predefinida la cantidad de segundos que debe esperar hasta que el navegador se conecte. Este límite es de 5 segundos, lo que me pareció poco, porque a veces te llevá mas tiempo localizar el navegador y darle al botón actualizar. Así que si quieres cambiar este límite por uno mayor puedes usar el siguiente comando:

sed -i "s/5 seconds/20 seconds/g" ~/.vim/plugin/debugger.py
sed -i "s/setdefaulttimeout(5)/setdefaulttimeout(20)/g" ~/.vim/plugin/debugger.py

donde el número 20 se puede cambiar por la cantidad de segundos que quieras.

Ah, y si vim está abierto tienes que reiniciarlo o ejecutar lo siguiente para que tome los cambios del archivo:

:source ~/.vim/plugin/debugger.vim

Una vez que se establece la conexión, la pantalla de vim se transforma en lo siguiente:

images/vim.png

A partir de este momento podremos controlar la ejecución del programa con los comandos que se muestran a la derecha.

Por ejemplo, el comando ,e nos permite ingresar una sentencia y observar su valor, o bien pulsando F3 avanzamos sin ingresar en las funciones.

En resumen, los comandos mas utilizados son:

  • F2 - step into
  • F3 - step over
  • F4 - step out (busca el breakpoint)
  • F5 - run
  • F6 - quit debug
  • F12 - obtener la propiedad debajo del cursor
  • ,e - evaluar una expresión
  • :Bp - define un breakpoint