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;
}
?>
debug_print_backtrace
(PHP 5)
debug_print_backtrace — Prints a backtrace
Description
void debug_print_backtrace
( void
)
debug_print_backtrace() prints a PHP backtrace. It prints the function calls, included/required files and eval()ed stuff.
Parameters
This function has no parameters.
Return Values
No value is returned.
Examples
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';
?>
The above example will output something similar to:
#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
dany dot dylan at gmail dot com
11-Nov-2008 06:51
11-Nov-2008 06:51
mr dot davin at gmail dot com
23-Oct-2008 09:32
23-Oct-2008 09: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
19-Feb-2008 10:54
19-Feb-2008 10: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 01:52
21-Aug-2007 01: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
05-Jun-2007 08:23
05-Jun-2007 08: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 12:10
28-Mar-2007 12: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 10:47
15-Mar-2005 10: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
