Another way to manipulate and print a backtrace, without using output buffering:
<?php
// print backtrace, getting rid of repeated absolute path on each file
$e = new Exception();
print_r(str_replace('/path/to/code/', '', $e->getTraceAsString()));
?>
debug_print_backtrace
(PHP 5)
debug_print_backtrace — Prints a backtrace
설명
void debug_print_backtrace
( void
)
debug_print_backtrace() prints a PHP backtrace. It prints the function calls, included/required files and eval()ed stuff.
인수
This function has no parameters.
반환값
값을 반환하지 않습니다.
예제
Example #1 debug_print_backtrace() example
<?php
// include.php file
function a() {
b();
}
function b() {
c();
}
function c(){
debug_print_backtrace();
}
a();
?>
<?php
// test.php file
// this is the file you should run
include 'include.php';
?>
위 예제의 출력 예시:
#0 eval() called at [/tmp/include.php:5] #1 a() called at [/tmp/include.php:17] #2 include(/tmp/include.php) called at [/tmp/test.php:3] #0 c() called at [/tmp/include.php:10] #1 b() called at [/tmp/include.php:6] #2 a() called at [/tmp/include.php:17] #3 include(/tmp/include.php) called at [/tmp/test.php:3]
debug_print_backtrace
bishop
29-Jul-2009 05:20
29-Jul-2009 05:20
bradley dot giesbrecht at gmail dot com
14-Jan-2009 09:51
14-Jan-2009 09:51
I was using the function by dany dot dylan at gmail dot com and found that preg_replace had string length limits. So here is yet another output format function.
<?php
if ( !function_exists ( "mydie" ) ) {
function mydie ( ) { $this_file = __FILE__ ; $this_line = __LINE__ ;
$buffer = array ( ) ;
$trace_calls = "" ;
ob_start ( ) ;
debug_print_backtrace ( ) ;
$buffer[ "0" ] = ob_get_contents ( ) ;
ob_end_clean ( ) ;
$buffer[ "0" ] = array_slice ( explode ( "#" , $buffer[ "0" ] ) , 1 , -1 , false ) ;
foreach ( $buffer[ "0" ] as $key => $value ) {
$value = explode ( ") called at [" , $value ) ;
if ( $key == 0 ) {
$value[ "0" ] = "0 " . __FUNCTION__ . "(see above vars)" ;
}
$trace_calls .= "#" . implode ( ")\n\tcalled at [" , $value ) ;
}
unset ( $buffer , $key , $value ) ;
echo "<pre>function " . __FUNCTION__ . " lives here:{$this_file}:{$this_line}</pre>" ;
echo ( "<pre>" . print_r( func_get_args ( ) , true ) . "</pre>" ) ;
if ( $trace_calls == "" ) $trace_calls = "No functions were called." ;
echo ( "<pre>" . $trace_calls . "</pre>" ) ;
die ;
}
}
function a ( ) {
b ( func_get_args ( ) , 2 ) ;
}
function b ( ) {
c ( func_get_args ( ) , 3 ) ;
}
function c ( ) {
mydie ( func_get_args ( ) , 4 ) ;
}
a ( 1 ) ;
?>
## outputs
function mydie lives here:/path/file.php:4
Array
(
[0] => Array
(
[0] => Array
(
[0] => Array
(
[0] => 1
)
[1] => 2
)
[1] => 3
)
[1] => 4
)
#0 mydie(see above vars))
called at [/path/file.php:54]
#1 c(Array ([0] => Array ([0] => 1),[1] => 2), 3)
called at [/path/file.php:49]
#2 b(Array ([0] => 1), 2)
called at [/path/file.php:43]
dany dot dylan at gmail dot com
11-Nov-2008 02:51
11-Nov-2008 02:51
I like the output of debug_print_backtrace() but I sometimes want it as a string.
bortuzar's solution to use output buffering is great, but I'd like to factorize that into a function. Doing that however always results in whatever function name I use appearing at the top of the stack which is redundant.
Below is my noddy (simple) solution. If you don't care for renumbering the call stack, omit the second preg_replace().
<?php
function debug_string_backtrace() {
ob_start();
debug_print_backtrace();
$trace = ob_get_contents();
ob_end_clean();
// Remove first item from backtrace as it's this function which
// is redundant.
$trace = preg_replace ('/^#0\s+' . __FUNCTION__ . "[^\n]*\n/", '', $trace, 1);
// Renumber backtrace items.
$trace = preg_replace ('/^#(\d+)/me', '\'#\' . ($1 - 1)', $trace);
return $trace;
}
?>
mr dot davin at gmail dot com
24-Oct-2008 04:32
24-Oct-2008 04:32
@harmor
Notice that the second line of the output outputs "::" instead of "->" when calling the function using an object.
Which is the resolved scope.
harmor
20-Feb-2008 06:54
20-Feb-2008 06:54
Input (Using: PHP Version 5.2.5-pl1-gentoo):
<?php
class CTest
{
public static function say($a_szVar)
{
debug_print_backtrace();
echo '<br />';
}
}
CTest::say('static call');
$obj = new CTest;
$obj->say('object call');
?>
Output:
#0 CTest::say(static call) called at [C:\PHPDocument4.php:11]
#0 CTest::say(object call) called at [C:\PHPDocument4.php:15]
Notice that the second line of the output outputs "::" instead of "->" when calling the function using an object.
taner
21-Aug-2007 08:52
21-Aug-2007 08:52
bortuzar: a simpler version, w/o output buffering:
<?php
$query = sprintf("INSERT INTO EventLog (Trace) VALUES ('%s')",
mysql_real_escape_string(join("\n", debug_backtrace())) );
mysql_query($query);
?>
bortuzar at gmail dot com
06-Jun-2007 03:23
06-Jun-2007 03:23
If you want to get the trace into a variable or DB, I suggest to do the following:
<?php
ob_start();
debug_print_backtrace();
$trace = ob_get_contents();
ob_end_clean();
$query = sprintf("INSERT INTO EventLog (Trace) VALUES ('%s')",
mysql_real_escape_string($trace));
mysql_query($query);
?>
petermarkellis at googlemail dot com
28-Mar-2007 07:10
28-Mar-2007 07:10
A cleaner example:
<?php
function a() {
b();
}
function b() {
c();
}
function c(){
debug_print_backtrace();
}
a();
?>
outputs:
#0 c() called at [C:\debugbacktracetest.php:7]
#1 b() called at [C:\debugbacktracetest.php:3]
#2 a() called at [C:\debugbacktracetest.php:14]
aidan at php dot net
15-Mar-2005 06:47
15-Mar-2005 06:47
This functionality is now implemented in the PEAR package PHP_Compat.
More information about using this function without upgrading your version of PHP can be found on the below link:
http://pear.php.net/package/PHP_Compat
