Décalage dans la stacktrace
Submitted by PiTiLeZarD on Sun, 05/20/2007 - 13:06
Tagged:
Bon je me suis habitué aux stacktrace Java ... une exception pour chaque ligne on a le fichier, la classe, la fonction et la ligne ... normal !
Ben en php il y a un décalage dans la stacktrace ... Pour chaque ligne on a la fonction qui correspond au fichier de la ligne d'après !
Ceci est du que php log les appels aux fonctions et non leur provenance ! Alors je suis tout déboussolé parce que quand je regarde une ligne, c'est celle d'avant qu'il faut que je regarde ...
Bref si comme moi vous voulez afficher une stacktrace plus logique (au sens java de la logique naturellement :)) voici une fonction qui affiche ça correctement :
function displayException(Exception $e) { echo '<style type="text/css">'; echo '#mainPanelError {'; echo ' text-align:left;'; echo ' padding:10px;'; echo ' background:#ffea50;'; echo ' border:4px double red;'; echo '}'; echo '#stackTrace {'; echo ' text-align:left;'; echo ' background:white;'; echo ' border:1px solid black;'; echo ' margin:30px;'; echo '}'; echo '.stackTraceElement {'; echo ' text-align:left;'; echo ' background:white;'; echo ' margin:0 0 5px 0;'; echo '}'; echo '.fileInfo {'; echo ' font-size:0.8em;'; echo ' color:#999999;'; echo ' margin:0 0 0 15px;'; echo '}'; echo '</style>'; echo '<div id="mainPanelError"><strong>'; echo $e->getMessage(); echo '</strong>'; $trace = $e->getTrace(); if ($trace) { function getInfo($traceElt) { $info = $traceElt['class'] . $traceElt['type'] . $traceElt['function']; $info .= '('; if ($traceElt['args']) { $count = count($traceElt['args']); for ($i = 0; $i < $count; $i++) { $arg = $traceElt['args'][$i]; $info .= is_object($arg) ? get_class($arg) : gettype($arg); if ($i < $count - 1) { $info .= ', '; } } } $info .= ')'; return $info; } echo '<br /><em>in '.getInfo($trace[0]).'</em>'; echo '<div id="stackTrace">'; echo '<b>StackTrace :</b><br /><br />'; foreach ($trace as $k => $line) { echo '<div class="stackTraceElement">'; $callInfo = ($k < count($trace) - 1) ? getInfo($trace[$k + 1]) : ""; echo $callInfo . ' (' .basename($line['file']) .':'.$line['line'].')<br />'; echo '<span class="fileInfo">in file '.$line['file'].'</span>'; echo '</div>'; } echo '<div>'; } echo '</div>'; }
et un screenshot qui va bien :

