首頁  >  問答  >  主體

為什麼debug_backtrace()回傳為空?

<p>我有一段PHP程式碼,運行在PHP 7.4上。 <br /><br />其中一部分是一個頂層的PHP腳本(/home/path/a.php),它包含了一系列的try-catch區塊,並且包含了對物件和包含文件的各種調用。 <br /><br />這些try-catch區塊會在遇到客戶錯誤和執行時間錯誤等情況時拋出異常。 <br /><br />在throw語句中,包含了一個錯誤日誌,其中包含了一個debug_backtrace()列印到錯誤日誌中。 </p><p><code></code></p> <pre class="brush:php;toolbar:false;">// 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)); }</pre> <p>然而,這段程式碼運行並正確收集了錯誤,但錯誤日誌只顯示了這個:</p> <blockquote> <p>[31-Jul-2023 18:42:17 Europe/London] Some custom feedback message from $_SESSION['message']</p><p> [31-Jul-2023 18:42:17 Europe/London] Array</p><p> (<br /> )</p> </blockquote> <p>為什麼debug_backtrace()在這裡為空?我期望它至少能顯示頁面提供的參數和變量,或SESSION數據或環境數據。 <br /><br />我在其他地方使用過這個方法,(據我回憶)它工作得很正常。我漏掉了什麼嗎? </p><p><br /></p>
P粉204136428P粉204136428417 天前392

全部回覆(1)我來回復

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

    回覆
    0
  • 取消回覆