php stack-trace error-logging

Imprimir PHP Call Stack



stack-trace error-logging (14)

Estoy buscando una manera de imprimir la pila de llamadas en PHP.

Puntos de bonificación si la función vacía el búfer IO.


Backtrace descarga una gran cantidad de basura que no necesitas. Tarda es muy largo, difícil de leer. Todo lo que siempre desea es "¿Cómo se llama qué de dónde?" Aquí es una solución de función estática simple. Por lo general, lo pongo en una clase llamada ''depuración'', que contiene todas mis funciones de utilidad de depuración.

class debugUtils { public static function callStack($stacktrace) { print str_repeat("=", 50) ."/n"; $i = 1; foreach($stacktrace as $node) { print "$i. ".basename($node[''file'']) .":" .$node[''function''] ."(" .$node[''line''].")/n"; $i++; } } }

Lo llamas así:

debugUtils::callStack(debug_backtrace());

Y produce una salida como esta:

================================================== 1. DatabaseDriver.php::getSequenceTable(169) 2. ClassMetadataFactory.php::loadMetadataForClass(284) 3. ClassMetadataFactory.php::loadMetadata(177) 4. ClassMetadataFactory.php::getMetadataFor(124) 5. Import.php::getAllMetadata(188) 6. Command.php::execute(187) 7. Application.php::run(194) 8. Application.php::doRun(118) 9. doctrine.php::run(99) 10. doctrine::include(4) ==================================================


Es extraño que nadie haya publicado de esta manera:

debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);

En realidad, esto imprime el retroceso sin la basura, solo qué método se llamó y dónde.



La solución de Walltearer es excelente, particularmente si está incluida en una etiqueta ''pre'':

<pre> <?php debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); ?> </pre>

- que establece las llamadas en líneas separadas, perfectamente numeradas


Más legible que debug_backtrace() :

$e = new /Exception; var_dump($e->getTraceAsString()); #2 /usr/share/php/PHPUnit/Framework/TestCase.php(626): SeriesHelperTest->setUp() #3 /usr/share/php/PHPUnit/Framework/TestResult.php(666): PHPUnit_Framework_TestCase->runBare() #4 /usr/share/php/PHPUnit/Framework/TestCase.php(576): PHPUnit_Framework_TestResult->run(Object(SeriesHelperTest)) #5 /usr/share/php/PHPUnit/Framework/TestSuite.php(757): PHPUnit_Framework_TestCase->run(Object(PHPUnit_Framework_TestResult)) #6 /usr/share/php/PHPUnit/Framework/TestSuite.php(733): PHPUnit_Framework_TestSuite->runTest(Object(SeriesHelperTest), Object(PHPUnit_Framework_TestResult)) #7 /usr/share/php/PHPUnit/TextUI/TestRunner.php(305): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult), false, Array, Array, false) #8 /usr/share/php/PHPUnit/TextUI/Command.php(188): PHPUnit_TextUI_TestRunner->doRun(Object(PHPUnit_Framework_TestSuite), Array) #9 /usr/share/php/PHPUnit/TextUI/Command.php(129): PHPUnit_TextUI_Command->run(Array, true) #10 /usr/bin/phpunit(53): PHPUnit_TextUI_Command::main() #11 {main}"


Para registrar la traza

$e = new Exception; error_log(var_export($e->getTraceAsString(), true));

Gracias @Tobiasz



Si desea un seguimiento de pila que se parece mucho a cómo php formatea el rastreo de pila de excepción que utilizar esta función, escribí:

function debug_backtrace_string() { $stack = ''''; $i = 1; $trace = debug_backtrace(); unset($trace[0]); //Remove call to this function from stack trace foreach($trace as $node) { $stack .= "#$i ".$node[''file''] ."(" .$node[''line'']."): "; if(isset($node[''class''])) { $stack .= $node[''class''] . "->"; } $stack .= $node[''function''] . "()" . PHP_EOL; $i++; } return $stack; }

Esto devolverá una traza de pila formateada como esta:

#1 C:/Inetpub/sitename.com/modules/sponsors/class.php(306): filePathCombine() #2 C:/Inetpub/sitename.com/modules/sponsors/class.php(294): Process->_deleteImageFile() #3 C:/Inetpub/sitename.com/VPanel/modules/sponsors/class.php(70): Process->_deleteImage() #4 C:/Inetpub/sitename.com/modules/sponsors/process.php(24): Process->_delete()


Utilice debug_backtrace para obtener un debug_backtrace de qué funciones y métodos se han llamado y qué archivos se han incluido para llegar al punto en que se ha llamado a debug_backtrace .



phptrace es una gran herramienta para imprimir la pila de PHP en cualquier momento cuando lo desee sin instalar ninguna extensión.

Hay dos funciones principales de phptrace: primero, imprimir la pila de llamadas de PHP que no necesita instalar nada, segundo, rastrear los flujos de ejecución de php que necesitan instalar la extensión que suministra.

como sigue:

$ ./phptrace -p 3130 -s # phptrace -p <PID> -s phptrace 0.2.0 release candidate, published by infra webcore team process id = 3130 script_filename = /home/xxx/opt/nginx/webapp/block.php [0x7f27b9a99dc8] sleep /home/xxx/opt/nginx/webapp/block.php:6 [0x7f27b9a99d08] say /home/xxx/opt/nginx/webapp/block.php:3 [0x7f27b9a99c50] run /home/xxx/opt/nginx/webapp/block.php:10


debug_backtrace()


Si desea generar un backtrace, está buscando debug_backtrace y / o debug_print_backtrace .


El primero, por ejemplo, te dará una matriz como esta (citando el manual) :

array(2) { [0]=> array(4) { ["file"] => string(10) "/tmp/a.php" ["line"] => int(10) ["function"] => string(6) "a_test" ["args"]=> array(1) { [0] => &string(6) "friend" } } [1]=> array(4) { ["file"] => string(10) "/tmp/b.php" ["line"] => int(2) ["args"] => array(1) { [0] => string(10) "/tmp/a.php" } ["function"] => string(12) "include_once" } }


Aparentemente, no vaciarán el búfer de E / S, pero puede hacerlo usted mismo, con flush y / u ob_flush .

(vea la página del manual del primero para averiguar por qué "y / o" ;-))


var_dump(debug_backtrace());

¿Eso hace lo que quieres?