PHP 8.4.2 Released!

debug_print_backtrace

(PHP 5, PHP 7, PHP 8)

debug_print_backtraceGibt die Daten für eine Ablaufverfolgung aus

Beschreibung

debug_print_backtrace(int $options = 0, int $limit = 0): void

debug_print_backtrace() gibt eine PHP-Ablaufverfolgung aus. Diese enthält Ausgaben zu allen Funktionsaufrufen, mit include oder require eingebundenen Dateien und mit eval() ausgeführtem Code.

Parameter-Liste

options

Über diesen Parameter kann eine Bitmaske mit folgenden möglichen Optionen übergeben werden:

debug_print_backtrace()-Optionen
DEBUG_BACKTRACE_IGNORE_ARGS Gibt an, ob der "args"-Index aller Funktions- und Methoden-Argumente weggelassen werden soll (z. B. um Speicher zu sparen).

limit

Hiermit kann die Anzahl der auszugebenden Aufrufebenen begrenzt werden. Der Vorgabewert (limit=0) führt zur Ausgabe aller Aufrufe.

Rückgabewerte

Es wird kein Wert zurückgegeben.

Beispiele

Beispiel #1 debug_print_backtrace()-Beispiel

<?php
// include.php-Datei

function a() {
b();
}

function
b() {
c();
}

function
c(){
debug_print_backtrace();
}

a();

?>
<?php
// test.php-Datei
// Dies ist die Datei, die Sie ausführen sollten

include 'include.php';
?>

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

#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]

Siehe auch

add a note

User Contributed Notes 4 notes

up
88
bishop
15 years ago
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()));
?>
up
25
dany dot dylan at gmail dot com
16 years ago
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;
}
?>
up
1
sun at drupal dot org
2 months ago
If you see string arguments and parameters getting cut off like this:

#0 hook.php(324): output_notice('checkout_before...')
#1 hook.php(348): invoke_hook('checkout_before...', Array)

You can increase the maximum length of arguments and parameters in the printed trace through an PHP INI setting:

<?php
ini_set
('zend.exception_string_param_max_len', 100);
debug_print_backtrace();
?>

…so you can read the full arguments:

#0 hook.php(324): output_notice('checkout_before_payment')
#1 hook.php(348): invoke_hook('checkout_before_payment', Array)

In edge cases, it might even uncover nested traces that you didn't notice before.
up
-1
David Spector
4 years ago
If your show your error messages in HTML (with suitable safety using entities), this function won't work nicely because it uses newlines for formatting.

Here is a function that works similarly, but using <BR> tags. Insert it near the beginning of your program to add a stack to Warning output only, or modify it as you like:

// Here is code for error stack output in HTML:
function error_handler_callback($errno,$message,$file,$line,$context)
{
if ($errno === E_WARNING)
echo "Stack, innermost first:<br>".nl2br((new Exception())->getTraceAsString());
return false; // to execute the regular error handler
}
set_error_handler("error_handler_callback");
To Top