PHP Conference Japan 2024

debug_print_backtrace

(PHP 5, PHP 7, PHP 8)

debug_print_backtrace打印回溯

描述

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

debug_print_backtrace() 打印 PHP 回溯。它打印函数调用、include / require 的文件以及 eval() 的内容。

参数

options

此参数是以下选项的位掩码

debug_print_backtrace() 选项
DEBUG_BACKTRACE_IGNORE_ARGS 是否省略 "args" 索引以及所有函数/方法参数以节省内存。

limit

此参数可用于限制打印的堆栈帧数。默认情况下 (limit=0) 它打印所有堆栈帧。

返回值

不返回任何值。

示例

示例 #1 debug_print_backtrace() 示例

<?php
// include.php 文件

function a() {
b();
}

function
b() {
c();
}

function
c(){
debug_print_backtrace();
}

a();

?>
<?php
// test.php 文件
// 这是您应该运行的文件

include 'include.php';
?>

以上示例将输出类似以下内容

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

参见

添加备注

用户贡献的注释 4 条注释

bishop
15 年前
另一种操作和打印回溯的方法,无需使用输出缓冲

<?php
// 打印回溯,去除每个文件上重复的绝对路径
$e = new Exception();
print_r(str_replace('/path/to/code/', '', $e->getTraceAsString()));
?>
dany dot dylan at gmail dot com
16 年前
我喜欢 debug_print_backtrace() 的输出,但我有时希望它是一个字符串。

bortuzar 使用输出缓冲的解决方案很棒,但我希望将其分解成一个函数。但是,这样做总是会导致我在堆栈顶部出现任何函数名,这是多余的。

下面是我的简单解决方案。如果您不关心重新编号调用堆栈,请省略第二个 preg_replace()。

<?php
function debug_string_backtrace() {
ob_start();
debug_print_backtrace();
$trace = ob_get_contents();
ob_end_clean();

// 从回溯中删除第一个项目,因为它是不必要的此函数
// 是多余的。
$trace = preg_replace ('/^#0\s+' . __FUNCTION__ . "[^\n]*\n/", '', $trace, 1);

// 重新编号回溯项目。
$trace = preg_replace ('/^#(\d+)/me', '\'#\' . ($1 - 1)', $trace);

return
$trace;
}
?>
sun at drupal dot org
1 个月前
如果您看到字符串参数被截断,例如:

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

您可以通过 PHP INI 设置增加打印跟踪中参数的最大长度

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

…这样您就可以阅读完整的参数

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

在极端情况下,它甚至可能会发现您以前没有注意到的嵌套跟踪。
David Spector
4 年前
如果您在 HTML 中显示错误消息(使用实体进行适当的安全处理),此函数将无法正常工作,因为它使用换行符进行格式化。

这是一个类似的函数,但使用 <BR> 标记。将其插入程序的开头以仅向警告输出添加堆栈,或根据需要修改它

// 这是在 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; // 执行常规错误处理程序
}
set_error_handler("error_handler_callback");
To Top