suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Warum gibt debug_backtrace() leer zurück?

<p>Ich habe einen Teil des PHP-Codes, der auf PHP 7.4 läuft. <br /><br />Ein Teil davon ist ein PHP-Skript der obersten Ebene (/home/path/a.php), das eine Reihe von Try-Catch-Blöcken sowie verschiedene Objekte und enthaltene Dateien enthält Anrufe. <br /><br />Diese Try-Catch-Blöcke lösen Ausnahmen aus, wenn Kundenfehler und Laufzeitfehler auftreten. <br /><br />In der throw-Anweisung ist ein Fehlerprotokoll enthalten, einschließlich eines debug_backtrace(), das in das Fehlerprotokoll gedruckt wird. </p><p><code></code></p> <pre class="brush:php;toolbar:false;">// etwas Code benutze some/path/to/objects; $database = new Database(); include „some/file/reference.php“; versuchen { // verschiedene Dinge, einschließlich $_SESSION-Daten if (empty($_SESSION['b']) || empty($_POST['d'])) { if(empty($_SESSION['b'])) { error_log("Sitzung erscheint leer. Kein b"); } if(empty($_POST['d'])) { error_log("POST erscheint leer. Kein d"); } throw new RuntimeException('Falsche Validierung/Formulardetails angegeben.'); } } Catch (RuntimeException | Exception $ex) { error_log("Anmeldeseite: ".$_SESSION['message']); error_log("debug: ".print_r(debug_backtrace(),true)); }</pre> <p>Dieser Code wird jedoch ordnungsgemäß ausgeführt und sammelt Fehler, das Fehlerprotokoll zeigt jedoch nur Folgendes an: </p> <blockquote> <p>[31.07.2023 18:42:17 Europa/London] Einige benutzerdefinierte Feedback-Nachrichten von $_SESSION['message']</p><p> [31.07.2023 18:42:17 Europa/London] Array</p><p> (<br /> )</p> </blockquote> <p>Warum ist debug_backtrace() hier leer? Ich habe erwartet, dass es zumindest die von der Seite bereitgestellten Parameter und Variablen oder SESSION-Daten oder Umgebungsdaten anzeigt. <br /><br />Ich habe diese Methode anderswo verwendet und (soweit ich mich erinnere) hat sie gut funktioniert. Habe ich etwas verpasst? </p><p><br /></p>
P粉204136428P粉204136428486 Tage vor448

Antworte allen(1)Ich werde antworten

  • P粉291886842

    P粉2918868422023-08-01 00:11:59

    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)); 

    Antwort
    0
  • StornierenAntwort