Mengapakah debug_backtrace() kembali kosong?
P粉204136428
P粉204136428 2023-07-31 11:21:13
0
1
425
<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粉204136428
P粉204136428

membalas semua(1)
P粉291886842

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)); 
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan