debug_backtrace()在php中完全有效吗?

时间:2017-08-23 06:43:39

标签: php debugging error-handling core debug-backtrace

在我的PHP项目之一工作时,我在代码文件的开头有一个函数debug_backtrace() <?php debug_backtrace() || die ("Direct access not permitted"); ?>

在研究它时,我得到了一些解释,它的作用如下:

  

在Drupal网站上调试PHP问题可以快速进行   并且容易出现严重问题。 PHP包含一个调试功能   调用debug_backtrace,它将打印出代码链   导致回溯函数被调用的点。

当我将var_dump()debug_backtrace()一起使用时,我得到了以下结果:

array(2) {
  [0]=>
  array(3) {
    ["file"]=>
    string(61) "C:\xampp\htdocs\folder_name\templates\default\models\home.php"
    ["line"]=>
    int(30)
    ["function"]=>
    string(7) "include"
  }
  [1]=>
  array(4) {
    ["file"]=>
    string(37) "C:\xampp\htdocs\folder_name\index.php"
    ["line"]=>
    int(146)
    ["args"]=>
    array(1) {
      [0]=>
      string(61) "C:\xampp\htdocs\folder_name\templates\default\models\home.php"
    }
    ["function"]=>
    string(7) "include"
  }
}

我没有得到debug_backtrace()功能正常工作的内容。

欢迎任何人解释。提前谢谢。

研究过的链接:

debug_backtrace() from registered shutdown function in PHP

Debugging PHP Code with debug_backtrace

Assign debug_backtrace() To a variable in PHP

Print PHP Call Stack

How can I save a PHP backtrace to the error log?

2 个答案:

答案 0 :(得分:2)

给出一个基本的例子......

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

echo "Start...";
print_r(debug_backtrace());

function t1 ()  {
    echo "Start t1...";
    print_r(debug_backtrace());

}

function t2()   {
    echo "Start t2...";
    print_r(debug_backtrace());
    t1();
}

echo "before calls...";
print_r(debug_backtrace());
t1();
t2();

将输出......

Start...Array
(
)
before calls...Array
(
)
Start t1...Array
(
    [0] => Array
        (
            [file] => /home/nigel/workspace/PHPTest/TestSource/part3.php
            [line] => 22
            [function] => t1
            [args] => Array
                (
                )

        )

)
Start t2...Array
(
    [0] => Array
        (
            [file] => /home/nigel/workspace/PHPTest/TestSource/part3.php
            [line] => 23
            [function] => t2
            [args] => Array
                (
                )

        )

)
Start t1...Array
(
    [0] => Array
        (
            [file] => /home/nigel/workspace/PHPTest/TestSource/part3.php
            [line] => 17
            [function] => t1
            [args] => Array
                (
                )

        )

    [1] => Array
        (
            [file] => /home/nigel/workspace/PHPTest/TestSource/part3.php
            [line] => 23
            [function] => t2
            [args] => Array
                (
                )

        )

)

我希望这表明所有debug_backtrace函数都返回到目前为止所调用的内容。因此,当您第一次调用t1时,它只是对t1的调用的堆栈跟踪。 t2的开头也是如此,但当t2调用t1时,跟踪会列出对t2t1的调用。

但正如您所看到的那样,来自debug_backtrace的{​​{1}}没有显示任何内容,因为没有任何级别的代码导致打印此跟踪。

在您的情况下,它会调用Start..并使用debug_backtrace说“如果or die()没有返回任何内容,那么debug_backtrace&#39;

答案 1 :(得分:0)

我认为 debug_backtrace() 最有用的方法是跟踪哪个文件是 init 启动核心,例如

a.php
include 'b.php';

b.php
function test(){
     echo('whatever');
}
print_r(debug_backtrace())

php a.php


whateverArray
(
    [0] => Array
        (
            [file] => /opt/php/b.php
            [line] => 7
            [function] => test
            [args] => Array
                (
                )

        )

    [1] => Array
        (
            [file] => /opt/php/a.php
            [line] => 3
            [args] => Array
                (
                    [0] => /opt/php/b.php
                )

            [function] => include
        )

)

所以,你可以从

$backtrace = debug_backtrace()
echo $backtrace[count($backtrace) - 1]['file'];

获取开始调用的文件