Mostrar una traza recursiva con PHP

Una de las cosas que más me gusta de Java es que cuando se produce una excepción, el error que te muestra te saca una traza de toda la ejecución de procesos (qué función falla, en qué línea y qué funciones se han llamado hasta llegar a ese punto). En PHP a veces los errores son algo simples, falla tal cosa en tal línea.

Afortunadamente podemos mejorar los mensajes de debug para poder mostrar la misma información: línea del archivo, fichero y qué funciones han sido las que han llamado a la actual (backtrace).

Para poder realizarlo se ha de usar las variables __FILE__ y __LINE__ y la función debug_backtrace(). El código necesario sería el siguiente:

function debug($msg, $label = 'DEBUG', $stealth = FALSE) {
if (defined('DEBUG') && DEBUG) {
if (is_bool($msg)) {
$msg = $msg ? 'TRUE' : 'FALSE';
}
$display = $stealth ? ' style="display: none;"' : '';
$backtrace = debug_backtrace();
$debug = array();
$stack = (isset($backtrace[1]['class']) ? "{$backtrace[1]['class']}::" : '')
. (isset($backtrace[1]['function']) ? "{$backtrace[1]['function']}" : '');
if ($stack) {
$debug[] = $stack;
}
$debug[] = "Line {$backtrace[0]['line']} of {$backtrace[0]['file']}";
$debug = implode('
', $debug); print "{$label}: {$debug}:
".print_r($msg, 1)." \n”; } }

Programming Tips #9 “debug_backtrace”

Nueva versión de XDebug

xdebug.pngXDebug acaba de sacar una nueva versión. Para aquellos que no lo conozcan, se trata de una extensión que permite depurar tus scripts PHP debido a la cantidad de información que ofrece:

  • Trazas, con parámetros que admiten funciones definidas por el usuario, muestra el nombre de la función, del archivo y el número de línea.
  • Asignación de memoria.
  • Protección contra recursividad infinita.

La nueva versión ofrece muchas mejoras y nuevas funcionalidades: mejoras en las trazas, enviar las trazas a ficheros, depuración remota y una documentación reescrita.

XDebug

Vía / PHPDeveloper.org