Rumah  >  Soal Jawab  >  teks badan

Mengapakah debug_backtrace() kembali kosong?

<p>Saya mempunyai sekeping kod PHP yang dijalankan pada PHP 7.4. <br /><br />Sebahagian daripadanya ialah skrip PHP peringkat atas (/home/path/a.php), yang mengandungi satu siri blok cuba-tangkap dan termasuk objek dan pelbagai fail panggilan. <br /><br />Blok tangkap cuba ini akan membuang pengecualian apabila menghadapi ralat pelanggan dan ralat masa jalan. <br /><br />Dalam pernyataan lontaran, log ralat disertakan, termasuk debug_backtrace() yang dicetak pada log ralat. </p><p><kod></kod></p> <pre class="brush:php;toolbar:false;">// beberapa kod gunakan beberapa/laluan/ke/objek; $database = Pangkalan Data baharu(); sertakan "some/file/reference.php"; cuba { // pelbagai perkara termasuk data $_SESSION if (kosong($_SESSION['b']) || kosong($_POST['d'])) { if(kosong($_SESSION['b'])) { error_log("session nampak kosong. No b"); } if(kosong($_POST['d'])) { error_log("POST kelihatan kosong. Tiada d"); } buang RuntimeException baru('Pengesahan tidak betul/butiran borang diberikan.'); } } tangkapan (RuntimeException | Exception $ex) { error_log("Halaman Log Masuk: ".$_SESSION['message']); error_log("debug: ".print_r(debug_backtrace(),true)); }</pre> <p>Walau bagaimanapun, kod ini berjalan dan mengumpul ralat dengan betul, tetapi log ralat hanya menunjukkan ini: </p> <blockquote> <p>[31-Jul-2023 18:42:17 Eropah/London] Beberapa mesej maklum balas tersuai daripada $_SESSION['message']</p><p> [31-Jul-2023 18:42:17 Eropah/London] Array</p><p> (<br /> )</p> </blockquote> <p>Mengapakah debug_backtrace() kosong di sini? Saya menjangkakan ia sekurang-kurangnya memaparkan parameter dan pembolehubah yang disediakan oleh halaman, atau data SESI atau data persekitaran. <br /><br />Saya telah menggunakan kaedah ini di tempat lain dan (seingat saya) ia berfungsi dengan baik. Adakah saya terlepas sesuatu? </p><p><br /></p>
P粉204136428P粉204136428417 hari yang lalu390

membalas semua(1)saya akan balas

  • P粉291886842

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

    debug_backtrace() Tindanan panggilan disediakan untuk menjejaki di mana anda berada, tetapi anda sudah berada dalam skop paling luar (iaitu global) dan belum membuat sebarang panggilan, jadi tiada tindanan panggilan tersedia.

    print_r(debug_backtrace());
    

    Hasil yang dihasilkan ialah:

    Array
    (
    )
    

    Jika anda meletakkan kod di dalam fungsi, anda akan mendapat timbunan panggilan yang mengandungi satu item:

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

    Hasil yang dihasilkan ialah:

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

    Jika anda ingin mendapatkan beberapa maklumat penyahpepijatan (minimum) dalam skop global, anda boleh membungkus semua kod dalam penutupan dan memanggilnya sebaris dengan segera:

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

    Hasilnya

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

    Berkenaan data sesi/persekitaran, ia hanya akan dipaparkan jika anda melepasinya sebagai parameter:

    foo($_ENV);
    

    Hasil:

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

    Jika anda ingin log pembolehubah sesi/persekitaran seperti ini, cara terbaik mungkin adalah dengan mengeluarkannya secara eksplisit:

    error_log(print_r($_ENV, true));
    error_log(print_r($_SESSION, true)); 

    balas
    0
  • Batalbalas