Pourquoi debug_backtrace() renvoie-t-il vide ?
P粉204136428
P粉204136428 2023-07-31 11:21:13
0
1
566
<p>J'ai un morceau de code PHP exécuté sur PHP 7.4. <br /><br />Une partie de celui-ci est un script PHP de niveau supérieur (/home/path/a.php), qui contient une série de blocs try-catch et inclut des objets et divers fichiers inclus. appels. <br /><br />Ces blocs try-catch lèveront des exceptions en cas d'erreurs client et d'exécution. <br /><br />Dans l'instruction throw, un journal des erreurs est inclus, y compris un debug_backtrace() imprimé dans le journal des erreurs. </p><p><code></code></p> <pre class="brush:php;toolbar:false;">// du code utilisez some/path/to/objects ; $base de données = nouvelle base de données(); inclure "some/file/reference.php" ; essayer { // diverses choses, y compris les données $_SESSION if (vide($_SESSION['b']) || vide($_POST['d'])) { si(vide($_SESSION['b'])) { error_log("la session apparaît vide. Non b"); } si(vide($_POST['d'])) { error_log("POST apparaît vide. Non d"); } throw new RuntimeException('Détails de validation/formulaire incorrects donnés.'); } } catch (RuntimeException | Exception $ex) { error_log("Page de connexion : ".$_SESSION['message']); error_log("debug: ".print_r(debug_backtrace(),true)); }</pré> <p>Cependant, ce code s'exécute et collecte les erreurs correctement, mais le journal des erreurs affiche uniquement ceci : </p> <blockquote> <p>[31-Jul-2023 18:42:17 Europe/Londres] Un message de retour personnalisé de $_SESSION['message']</p><p> [31 juillet 2023 18:42:17 Europe/Londres] Array</p><p> (<br /> )</p> </blockquote> <p>Pourquoi debug_backtrace() est-il vide ici ? Je m'attendais à ce qu'il affiche au moins les paramètres et variables fournis par la page, ou les données de SESSION ou les données d'environnement. <br /><br />J'ai utilisé cette méthode ailleurs et (pour autant que je me souvienne), elle a bien fonctionné. Ai-je manqué quelque chose? </p><p><br /></p>
P粉204136428
P粉204136428

répondre à tous(1)
P粉291886842

debug_backtrace() Une pile d'appels est fournie pour savoir où vous vous trouvez, mais vous êtes déjà dans la portée la plus externe (c'est-à-dire globale) et n'avez effectué aucun appel, donc aucune pile d'appels n'est disponible.

print_r(debug_backtrace());

Le résultat produit est :

Array
(
)

Si vous mettez le code dans une fonction, vous obtiendrez une pile d'appels contenant un élément :

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

Le résultat produit est :

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

        )

)

Si vous souhaitez obtenir des informations (minimales) de débogage dans la portée globale, vous pouvez envelopper tout le code dans une fermeture et l'appeler immédiatement en ligne :

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

Résultats

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

Concernant les données de session/environnement, elles ne seront affichées que si vous les passez en paramètres :

foo($_ENV);

Résultat :

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

Si vous souhaitez enregistrer des variables de session/environnement comme celle-ci, le meilleur moyen est probablement de les afficher explicitement :

error_log(print_r($_ENV, true));
error_log(print_r($_SESSION, true)); 
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal