为什么debug_backtrace()返回为空?
P粉204136428
P粉204136428 2023-07-31 11:21:13
[PHP讨论组]

我有一段PHP代码,运行在PHP 7.4上。

其中一部分是一个顶层的PHP脚本(/home/path/a.php),它包含了一系列的try-catch块,并且包含了对对象和包含文件的各种调用。

这些try-catch块会在遇到客户错误和运行时错误等情况时抛出异常。

在throw语句中,包含了一个错误日志,其中包括了一个debug_backtrace()打印到错误日志中。

// some code
use some/path/to/objects; 
$database = new Database();
include "some/file/reference.php";

try {
//   various things including $_SESSION data

    if (empty($_SESSION['b']) || empty($_POST['d'])) {
        if(empty($_SESSION['b'])) {
            error_log("session appears empty. No b");
        }
        if(empty($_POST['d'])) {
            error_log("POST appears empty. No d");
        }
        throw new RuntimeException('Incorrect validation/form details given.');
    }
}
catch (RuntimeException | Exception $ex) {
    error_log("Login Page: ".$_SESSION['message']);
    error_log("debug: ".print_r(debug_backtrace(),true));
}

然而,这段代码运行并正确收集了错误,但错误日志只显示了这个:

[31-Jul-2023 18:42:17 Europe/London] Some custom feedback message from $_SESSION['message']

[31-Jul-2023 18:42:17 Europe/London] Array

(
)

为什么debug_backtrace()在这里为空?我期望它至少能显示页面提供的参数和变量,或者SESSION数据或环境数据。

我在其他地方使用过这个方法,(据我回忆)它工作得很正常。我漏掉了什么吗?


P粉204136428
P粉204136428

全部回复(1)
P粉291886842

debug_backtrace() 提供了调用堆栈,可以追踪你所在的位置,但你已经处于最外层(即全局)作用域,并且没有进行任何调用,所以没有调用堆栈可用。

print_r(debug_backtrace());

产生的结果是:

Array
(
)

如果将代码放在一个函数中,你将会得到一个包含一个项的调用堆栈:

function foo()
{
    print_r(debug_backtrace());
}
foo();

产生的结果是:

Array
(
    [0] => Array
        (
            [file] => ...
            [line] => 6
            [function] => foo
            [args] => Array
                (
                )

        )

)

如果你想在全局作用域下获得一些(最小的)调试信息,你可以将所有的代码封装在一个闭包中,然后立即内联调用它:

(function() {
    // all your code here
    print_r(debug_backtrace());
})();

结果

Array
(
    [0] => Array
        (
            [file] => ...
            [line] => 5
            [function] => {closure}
            [args] => Array
                (
                )
        )
)

关于会话/环境数据,只有在将它们作为参数传递时,它们才会显示出来:

foo($_ENV);

结果:

Array
(
    [0] => Array
        (
            [file] => ...
            [line] => 6
            [function] => foo
            [args] => Array
                (
                    [0] => Array
                        (
                            [TERM] => xterm
                            [PATH] => /usr/bin:/bin
                            [LANG] => C
                            [SHELL] => /bin/sh
                            [MAIL] => /var/mail/nobody
                            [LOGNAME] => nobody
                            [USER] => nobody
                            [HOME] => /tmp
                        )
                )
        )
)

如果你想像这样记录会话/环境变量,最好的方法可能是显式地将它们输出:

error_log(print_r($_ENV, true));
error_log(print_r($_SESSION, true)); 
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号