Debugging: stacktraces
Een van de dingen die PHP lang niet (standaard) gehad heeft is een stacktrace mogelijkheid. Een stacktrace is een overzicht van hoe je op een bepaald punt in je script beland bent. Een klein voorbeeldje:

Deze stacktraces kun je sinds PHP 4.3.0 zelf ook maken, met de hulp van debug_backtrace() en das best handig als je knie diep in de classes staat en geen idee hebt waar er nu precies iets fout gaat.
De functie debug_backtrace() geeft een array met arrays terug. Voor elke functie of klasse methode die is aangeroepen vanaf het globale bereik (global scope) krijg je een associatieve array met daarin de volgende elementen (sleutels):
- function: naam van de aangeroepen functies
- line: het regelnummer waar de functie werd aangeroepen
- file: het bestand waar deze functie vanuit werd aangeroepen
- class: de naam van de klasse (mogelijk van een object) waarvan een methode werd aangeroepen
- type: geeft aan op welke manier de methode van een klasse werd aangeroepen. '->' als de aanroep op een object was, '::' als het een statische aanroep was
- args: De argumenten die aan de functie werden gegeven
De naam zegt het al, het is een stacktrace en dat houdt in dat de array die debug_backtrace() retourneert zich gedraagd als een stack. Voor degene die onder een steen leven: een stack is een data structuur waar je de meest recent toegevoegde waarde bovenaan de lijst terugvindt. De bovenste array bevat dus informatie over de laatst aangeroepen functie.
-
/**
-
* Kleine klasse om een stack trace mee te tonen.
-
*
-
* Voorbeeld aanroep:
-
*
-
* function test() {
-
* DevTools::Stacktrace();
-
* }
-
*
-
* Mathieu Kooiman <info (op) scriptorama punt nl>
-
* http://www.scriptorama.nl/
-
*/
-
-
class DevTools
-
{
-
/**
-
* Toon een stacktrace
-
*
-
* @param returnString boolean Flag om aan te geven of het resultaat terug gegeven moet worden ipv. weergegeven
-
* @return string of niks
-
*/
-
function Stacktrace($returnString = false)
-
{
-
-
/* De aanroep naar DevTools::Stacktrace() zit er
-
* standaard ook bij. Dat geloven we wel, dus
-
* die halen we er maar vanaf. */
-
-
-
$result = "<style type=\"text/css\">\n.trace td { font-family: arial; font-size: 11px;}\n " ;
-
$result .= ".trace h3 { font-size: .9em; color: red; border-bottom: 1px dashed #c0c0c0; }</style>";
-
$result .= '<table class="trace" border="0" cellpadding="3">';
-
$result .= '<tr><td colspan="3"><h3>Stacktrace</h3></td>';
-
-
foreach ($trace as $level => $data)
-
{
-
$result .= '</tr><tr><td>#'. $level . '</td>';
-
$result .= '<td>';
-
-
$result .= $data['class'] . $data['type'];
-
}
-
-
$result .= $data['function'] . "()</td>";
-
$result .= "</tr>";
-
-
$result .= '<tr>';
-
$result .= '<td> </td>';
-
$result .= '<td valign="top">Arguments:<br /></td>';
-
$result .= '<td>';
-
-
foreach ($data['args'] as $key => $argument) {
-
}
-
-
$result .= '</td></tr>';
-
}
-
-
}
-
$result .= "</table>";
-
-
if ($returnString) {
-
return $result;
-
}
-
-
echo $result;
-
}
-
-
}
Volg Scriptorama via RSS!
Reageer ook!
Je doet $result .=, terwijl $result nog niet bestaat. Voor een site als dit vind ik dit toch een grote fout;)
Door JeXuS
op 08.05.06 @ 1:34 pm | Permalink
Ach, grote fout, het lijkt me meer iets dat even bij het editten is misgelopen.
Bedankt voor de heads up! Het is verholpen.
Door Mathieu Kooiman
op 08.05.06 @ 1:41 pm | Permalink
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>