Imprimir pila de llamadas PHP

Resuelto Justin asked hace 54 años • 16 respuestas

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.

Justin avatar Jan 01 '70 08:01 Justin
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}"
Tobias Cudnik avatar Aug 12 '2011 11:08 Tobias Cudnik

Si desea generar un seguimiento, está buscando debug_backtracey/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 flushy/o ob_flush.

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

Pascal MARTIN avatar Sep 14 '2009 18:09 Pascal MARTIN

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.

AbstractVoid avatar Mar 14 '2016 17:03 AbstractVoid

Para registrar el seguimiento

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

Gracias @Tobiasz

Sydwell avatar Oct 24 '2011 15:10 Sydwell