Xdebug, Var_dump con Esteroides


Todavía recuerdo la época cuando PHP no tenía Xdebug, cuando andabamos con print_r y echo para poder debugear algo en esos miles y miles de scripts que estaban llenos de includes y requires, haaaa que tiempos, menos mal que ya paso. No voy a contar que es Xdebug por que asumo que ya tenes idea que es, tampoco voy a contarles como instalarlo por que la internet esta llena de artículos sobre ello.

Este articulo va a ir al grano, a como usar cosas mas copadas que solo ver colorcitos en el var_dump y conectarlo con la IDE para hacer un debug paso a paso, vamos a ver algunos puntos que nos pueden ayudar en esos momentos de desesperación en que no podemos encontrar el problema.

Var_dump

Ok, si, lo primero a ver es var_dump, si lo usamos por defecto var dump va mostrar la información de una variable de manera recursiva, el problema es que por defecto PHP trae los errores HTML desactivados, lo primero que deberíamos hacer después de instalar xdebug es setear html_errors en el php.ini en On

html_errors = On

Tambien siendo que esta es una configuración de desarrollo deberíamos habilitar la salida de error.

display_errors = On

Ya que estamos en el php.ini vamos a ver tres parámetros que afectan a Xdebug, estos parámetros afectan la forma que Xdebug presenta la información en el var_dump y en los mensajes de error.

xdebug.var_display_max_depth : Default 3, Cuan profundo se va a buscar atributos. Vean en este ejemplo, un caso esta con profundidad 1 por ende la información aparece muy resumida, el otro esta en 3, podemos ver mas datos. Util para cuando tenemos varios niveles de anidamiento.

Screen Shot 2013-02-20 at 9.14.49 PM

xdebug.var_display_max_children : Default 128, Cuantos atributos del objeto se van mostrar, observen el primer caso, solo muestra un atributo por elemento, en el siguiente caso muestra hasta 128. Util para casos donde el objeto sea muuuy grande.

Screen Shot 2013-02-20 at 9.17.20 PM

xdebug.var_display_max_data : Default 512, cuantos caracteres del string en una variable se van a mostrar. Util para estirar la cadena de caracteres a mostrar cuando necesitamos analizar los textos del las variables.

Screen Shot 2013-02-20 at 9.18.14 PM

xdebug.collect_params=4 : Este parametro permite recolectar datos de las variables y los valores que toma cada invocación a una función, cuando salte un error o hagamos un trace podremos ver estos valores reflejados en el stack trace. Por defecto esta en 0 (no colecta nada), a mi personalmente me gusta 4.

Bien, ahora sabemos como customizar nuestro var_dump para casos extremos donde no estamos viendo lo que necesitamos.

Otras Funciones

Si queremos ver un poco mas de información, por ejemplo cuando trabajamos con variables por referencia, podemos usar la funcion xdebug_debug_zval, esta recibe como parámetro el nombre de la variable a mostrar y ademas de la información que nos provee var_dumpo nos muestra información de refcount (cuantas variables apuntan a este valor) y si es una referencia. Este es un ejemplo de una salida de xdebug_debug_zval.

Screen Shot 2013-02-20 at 9.27.49 PM

Otra función muy útil es xdebug_dump_superglobals, esta nos dumpea el valor de las variables super globales, pero para hacerla funcionar correctamente necesita una configuración para indicar que variables queremos ver exactamente, esta configuracion se puede hacer en el php.ini, .htaccess o via ini_set, este es un ejemplo bastante práctico.

   xdebug.dump.GET=*
   xdebug.dump.POST=*
   xdebug.dump.COOKIE=*
   xdebug.dump.SERVER=SCRIPT_FILENAME,REMOTE_ADDR

Es es un ejemplo de la salida

Screen Shot 2013-02-20 at 9.27.40 PM

Configuraciones Útiles

Lo interesante es tener esta información de las super globales y de los parámetros que se pasaron a las funciones del stack trace cuando surja un mensaje de error. Si usamos esta configuracion, o similar,

 xdebug.show_local_vars=On ;Muestra las variables locales del ultimo scope
 xdebug.dump.SERVER=HTTP_HOST, SERVER_NAME ;Configuracion para dump_super global
 xdebug.dump_globals=On
 xdebug.collect_params=4

podremos tener una salida de error como la de la imagen

var_dump_full

La teoría dice que las variables superglobales, salvo la de SESSION, no debería cambiar durante la ejecución, por ende Xdebug por defecto muestra estas globales solo en el primer error para no ser tan verboso, si quieren que siempre se muestren pueden cambiar poner en off dump_once.

xdebug.dump_once=Off

Algo que suele ser interesante tambien es poder ver el stack trace cuando surge una excepcion, el problema es que las exceciones en PHP no son manejadas de la misma forma que los errores, ahora, si queremos que Xdebug no alerte en cada excepcion que suceda, capturada o no, podemos usar esta variable de configuracion.

xdebug.show_exception_trace=On

Conclusión

Estas son algunas de las cosas avanzadas que pude ver para obtener mejores mensajes de error y tener un poco mas de información en el var_dump, pero en realidad lo que me llevo a ver esto es que me puse a ver como hacer un poco mas completo los traces para poder ser mas efectivo debugeando, nunca fuí fan del Paso a Paso para debugear, asi que el próximo articulo estará relacionado a como hacer traces efectivos en PHP con Xdebug para un mejor debugging.

Para los curiosos, aca esta la doc oficial

http://xdebug.org/docs/

Share

Leave a Reply

Your email address will not be published. Required fields are marked *