Imprimir pila de llamadas PHP
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 de IO.
Aceptado
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}"
Si desea generar un seguimiento, está buscando debug_backtrace
y/o debug_print_backtrace
.
El primero, por ejemplo, le 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 buffer de E/S, pero puedes hacerlo tú mismo, con flush
y/o ob_flush
.
(consulte la página del manual del primero para descubrir por qué "y/o" ;-))
Es extraño que nadie haya publicado de esta manera:
debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
En realidad, esto imprime el seguimiento sin basura: solo qué método se llamó y dónde.
Para registrar el seguimiento
$e = new Exception;
error_log(var_export($e->getTraceAsString(), true));
Gracias @Tobiasz