2010-11-26 15 views
12

Seamos realistas, la salida debug_backtrace() no es muy bonita. ¿Alguien ha codificado una envoltura?¿Hay un volcado de pila Pretty Print?

Y ¿cuál es tu favorita bastante var_dump() (que se puede utilizar en proyectos comerciales, por lo que no GPL (aunque LGPL está bien))

Ver también: A more pretty/informative Var_dump alternative in PHP?


seis años - y diez mil puntos de vista de esta pregunta - más tarde, y todavía estoy usando esto. No es bonita de una manera que se vea bien en la pantalla, como Kint (que es excelente).

Es texto sin formato, que puedo enviarme por correo electrónico en informes de error automatizados y puede mostrarse en la consola del desarrollador del navegador usando ChromePhp.

/** 
* @brief Returns an HTML formatted string showing details of the backtrace 
* 
* Example: 
* 
* F:\Dropbox\programs\Xampp\htdocs\api\q.php:48 e(373, 'beer', 'curry') 
* F:\Dropbox\programs\Xampp\htdocs\api\q.php:53 d(26366, 28255, 8364) 
* F:\Dropbox\programs\Xampp\htdocs\api\q.php:58 c() 
* F:\Dropbox\programs\Xampp\htdocs\api\q.php:63 b(1283, 15488, 29369) 
* F:\Dropbox\programs\Xampp\htdocs\api\q.php:72 a(788, 6077, 25010) 
*/ 
function FormatBacktrace() 
{ 
    $result = '<h4>Backtrace</h4>'; 

    foreach (debug_backtrace() as $trace) 
    { 
     if ($trace['function'] ==__FUNCTION__) 
      continue; 

     $parameters = ''; 
     foreach ($trace['args'] as $parameter) 
      $parameters .= $parameter . ', '; 

     if (substr($parameters, -2) == ', ') 
     $parameters = substr($parameters, 0, -2); 

     if (array_key_exists('class', $trace)) 
     $result .= sprintf("%s:%s %s::%s(%s)<br>", 
           $trace['file'], 
           $trace['line'],  
           $trace['class'], 
           $trace['function'], 
           $parameters); 
     else 
     $result .= sprintf("%s:%s %s(%s)<br>", 
           $trace['file'], 
           $trace['line'], 
           $trace['function'], 
           $parameters); 
    } 

    return $result; 
} 
+0

No edite respuestas como su propia solución en el campo "pregunta"; preferimos mantener las dos partes de la página estrictamente separadas. En cambio, se le anima [a que responda su propia pregunta] (http://stackoverflow.com/help/self-answer) si tiene información más allá de las respuestas actualmente enumeradas. – IMSoP

Respuesta

6

El Xdebug extension puede print stacktraces con un grado configurable de verbosidad.

Xdebug stacktrace image

También ofrece algunas additional var_dump() features tales como coloreado de sintaxis:

Colored var_dump()

Editar:

En cuanto a la inclusión de Xdebug en un proyecto comercial.

El Xdebug license tiene solo unos pocos términos y parece bastante permisivo.

Xdebug es una extensión C. Como tal, volver a distribuirlo o parte de él en su proyecto puede ser algo difícil. Dependiendo de los requisitos de E ver algunas opciones:

  • Haga que su usuario final instalar Xdebug de un paquete de distribución de Linux o un archivo DLL desde el sitio
  • Distribuir y .dll.por lo que los archivos para todas las plataformas soportadas
  • Haga que sus usuarios finales construir el código fuente
  • Distribuir una versión personalizada de PHP
+0

+1 pero ¿está disponible como código independiente? – Mawg

+0

También puede [crear enlaces] (http://xdebug.org/docs/stack_trace#file_link_format) para abrir las llamadas en el rastreo en un editor de texto, que es muy eficiente para la depuración. – Tgr

+0

Puede hacer que FireBug agregue la pestaña "HTML" en el visor de solicitudes agregando: 'header ('Content-Type: text/html; charset = UTF-8');' 'xdebug_print_function_stack ('Debug message'); ' – josephdpurcell

2

Aquí hay una "impresión bonita" var_dump

function vdump() { 

    $args = func_get_args(); 

    $backtrace = debug_backtrace(); 
    $code = file($backtrace[0]['file']);  

    echo "<pre style='background: #eee; border: 1px solid #aaa; clear: both; overflow: auto; padding: 10px; text-align: left; margin-bottom: 5px'>"; 

    echo "<b>".htmlspecialchars(trim($code[$backtrace[0]['line']-1]))."</b>\n"; 

    echo "\n"; 

     ob_start(); 

      foreach ($args as $arg) 
       var_dump($arg); 

      $str = ob_get_contents(); 

     ob_end_clean(); 

     $str = preg_replace('/=>(\s+)/', ' => ', $str); 
     $str = preg_replace('/ => NULL/', ' &rarr; <b style="color: #000">NULL</b>', $str); 
     $str = preg_replace('/}\n(\s+)\[/', "}\n\n".'$1[', $str); 
     $str = preg_replace('/ (float|int)\((\-?[\d\.]+)\)/', " <span style='color: #888'>$1</span> <b style='color: brown'>$2</b>", $str); 

     $str = preg_replace('/array\((\d+)\) {\s+}\n/', "<span style='color: #888'>array&bull;$1</span> <b style='color: brown'>[]</b>", $str); 
     $str = preg_replace('/ string\((\d+)\) \"(.*)\"/', " <span style='color: #888'>str&bull;$1</span> <b style='color: brown'>'$2'</b>", $str); 
     $str = preg_replace('/\[\"(.+)\"\] => /', "<span style='color: purple'>'$1'</span> &rarr; ", $str); 
     $str = preg_replace('/object\((\S+)\)#(\d+) \((\d+)\) {/', "<span style='color: #888'>obj&bull;$2</span> <b style='color: #0C9136'>$1[$3]</b> {", $str); 
     $str = str_replace("bool(false)", "<span style='color:#888'>bool&bull;</span><span style='color: red'>false</span>", $str); 
     $str = str_replace("bool(true)", "<span style='color:#888'>bool&bull;</span><span style='color: green'>true</span>", $str); 

     echo $str; 

    echo "</pre>"; 

    echo "<div class='block tiny_text' style='margin-left: 10px'>"; 

     echo "Sizes: "; 
     foreach ($args as $k => $arg) { 

      if ($k > 0) echo ","; 
      echo count($arg); 

     } 

    echo "</div>"; 

} 
+0

+1 Lo intentaré. Gracias – Mawg

1
+0

+1 pero ¿está disponible como código independiente? – Mawg

+1

@Mawg: puede usar este paquete: http://epic.codeutopia.net/pack/, que le permitirá elegir los componentes que desee e incluir automáticamente sus dependencias. ZF está desacoplado en la medida de lo posible. – karim79

+0

+1 suena bien. Gracias – Mawg

6

Aquí está mi envoltura de impresión bonita que se destina para la producción no de navegador, es decir, los registros de errores o en la consola:

function stackTrace() { 
    $stack = debug_backtrace(); 
    $output = ''; 

    $stackLen = count($stack); 
    for ($i = 1; $i < $stackLen; $i++) { 
     $entry = $stack[$i]; 

     $func = $entry['function'] . '('; 
     $argsLen = count($entry['args']); 
     for ($j = 0; $j < $argsLen; $j++) { 
      $func .= $entry['args'][$j]; 
      if ($j < $argsLen - 1) $func .= ', '; 
     } 
     $func .= ')'; 

     $output .= $entry['file'] . ':' . $entry['line'] . ' - ' . $func . PHP_EOL; 
    } 
    return $output; 
} 
+2

Esto parece tener problemas con los parámetros del objeto: ' Error fatal capturable: Objeto de la clase MyClass no se pudo convertir a la cadena ' –

+0

Estaba recibiendo errores similares y advertencias Barry. Vea a continuación una versión modificada del código que eliminó estos problemas para mí. – jambroseclarke

9

también tiene kint (github repo) que tiene un paquete en el repositorio composerpackagist

Así que, o descargar la biblioteca manualmente o con composer, es sólo una cuestión de:

$ composer init 
$ composer require raveren/kint 
$ composer install 

Entonces, en lugar de ini_set('display_errors', 'On');, yo prefiero usar este sencillo manejador en mi archivo principal (primera) incluyen:

if ( getenv('__project_env__') === 'DEV') { 

    error_reporting(E_ALL | E_STRICT); 

    function shutdown_handler() { 
    $error = error_get_last(); 
    Kint::trace(); 
    Kint::dump($error); 
    } 
    register_shutdown_function('shutdown_handler'); 

} else { 
... 
} 

con __project_env__ se encuentra en Virtualhost de Apache() con el fin de no contaminar las diferentes ramas del repositorio git donde el proyecto vive con los elementos de configuración que son por esencia environmental

  • En DEV: me sale mi depuración
  • En PROD, es silenciosa por defecto

Aquí está una captura de pantalla de cómo se ve traza (cada paso es plegable):

Kint stack trace

+0

Me encanta Kint. Por desgracia, la captura de pantalla ya no está vinculada :-(NVM, no puedo recomendar Kint lo suficiente – Mawg

0

Mi favorito var_dump snippet es uno que hice hace años y he estado trabajando en el perfeccionamiento desde entonces. Sé que hay librerías que crean muy buenos volcados con menús de acordeón y todo, pero solo quiero un diseño simple, fácil de leer, tal vez un poco de HTML, y tan portátil como un único método de código de corte. Por lo tanto, mi función:

function preDump() { // use string "noEcho" to just get a string return only 
    $args = func_get_args(); 
    $doEcho = TRUE; $sb; 
    if ($args) { 
     $sb = '<div style="margin: 1em 0;"><fieldset style="display:inline-block;padding:0em 3em 1em 1em;"><legend><b>preDump: '.count($args).' Parameters Found.</b></legend>'; 
     foreach (func_get_args() as $arg) { 
      if (gettype($arg) == 'string') if ($arg == 'noEcho') { $doEcho = FALSE; $sb = preg_replace('/(preDump:)[0-9]+/', 'preDump: '.(count($args)-1), $sb); continue; } 
      $sb .= '<pre data-type="'.gettype($arg).'"'; 
      switch (gettype($arg)) { 
       case "boolean": 
       case "integer": 
        $sb .= ' data-dump="json_encode"><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')</b></p><p>'; 
        $sb .= json_encode($arg); 
        break; 
       case "string": 
        $sb .= ' data-dump="echo"><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')</b></p><p>'; 
        $sb .= $arg; 
        break; 
       default: 
        $sb .= ' data-dump="var_dump"'; 
        if (is_object($arg)) $sb .= 'data-class="'.get_class($arg).'"'; 
        $sb .= '><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')'; 
        if (is_object($arg)) $sb .= ' ['.get_class($arg).']'; 
        $sb .= '</b></p><p>'; 
        ob_start(); 
        var_dump($arg); 
        $sb .= ob_get_clean(); 
        if (ob_get_length()) ob_end_clean(); 
      } 
      $sb .= '</p></pre>'; 
     } 
     $sb .= '</fieldset></div>'; 
    } 
    else { 
     $sb = '<div style="margin: 1em 0;"><fieldset style="display:inline-block;"><legend><b>preDump: [ERROR]</b></legend><h3>No Parameters Found</h3></fieldset></div>'; 
    } 
    if ($doEcho) echo($sb); 
    return $sb; 
} 

El uso es extremadamente simple. Toma infinitos parámetros. Además, muestra todo dentro del simple fieldsets para cada llamada preDump, así como también separa cada parámetro en su propia etiqueta pre, lo que lo hace limpio y fácil de leer. Cada etiqueta pre también contiene un encabezado que muestra el gettype de cada parámetro y, si es un objeto, también mostrará el class name.

uso tan fácil como var_dump();

preDump(TRUE, 101, 'this is a string', array('array', 'here'), (object)array ('this' => 'is', 'an' => 'object'), $someXMLvariable); 

También puede utilizarla para conseguir el vertedero como una cadena simple y entonces echo cuando le parezca: Método StackTrace impresión bonita

$bob = preDump($someParam1, $someParam2, 'noEcho'); // 'noEcho' causes it to return as string only 
3

de jhurliman anteriormente es realmente genial Pero para mí generaba muchas advertencias PHP que también saturaban el registro. Agregué un poco más de error y comprobación de tipos, lo que da como resultado un muy buen seguimiento de pila en los registros.Aquí está la versión modificada del código de jhurliman:

function stackTrace() { 
    $stack = debug_backtrace(); 
    $output = ''; 

    $stackLen = count($stack); 
    for ($i = 1; $i < $stackLen; $i++) { 
     $entry = $stack[$i]; 

     $func = $entry['function'] . '('; 
     $argsLen = count($entry['args']); 
     for ($j = 0; $j < $argsLen; $j++) { 
      $my_entry = $entry['args'][$j]; 
      if (is_string($my_entry)) { 
       $func .= $my_entry; 
      } 
      if ($j < $argsLen - 1) $func .= ', '; 
     } 
     $func .= ')'; 

     $entry_file = 'NO_FILE'; 
     if (array_key_exists('file', $entry)) { 
      $entry_file = $entry['file'];    
     } 
     $entry_line = 'NO_LINE'; 
     if (array_key_exists('line', $entry)) { 
      $entry_line = $entry['line']; 
     }   
     $output .= $entry_file . ':' . $entry_line . ' - ' . $func . PHP_EOL; 
    } 
    return $output; 
} 
Cuestiones relacionadas