Maison  >  Questions et réponses  >  le corps du texte

Pourquoi debug_backtrace() renvoie-t-il vide ?

<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粉204136428P粉204136428468 Il y a quelques jours423

répondre à tous(1)je répondrai

  • P粉291886842

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

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

    répondre
    0
  • Annulerrépondre