94 lines
2.8 KiB
PHP
94 lines
2.8 KiB
PHP
|
<?php
|
||
|
function show_no_backtrace() {
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
function show_backtrace(){
|
||
|
static $sent_css = false;
|
||
|
if (!function_exists("debug_backtrace")) {
|
||
|
return show_no_backtrace();
|
||
|
}
|
||
|
|
||
|
$bt = debug_backtrace();
|
||
|
|
||
|
$return = "";
|
||
|
if (!$sent_css){
|
||
|
$return .= "<style type='text/css'>
|
||
|
.stacktrace { background-color: #FFFFFF; color: #000000; }
|
||
|
.stacktrace .function { color: #0000FF; }
|
||
|
.stacktrace .number { color: #FF0000; }
|
||
|
.stacktrace .string { color: #009900; }
|
||
|
.stacktrace .bool { color: #000099; font-weight: bold; }
|
||
|
.stacktrace .null { color: #999999; font-weight: bold; }
|
||
|
.stacktrace .object { color: #009999; font-weight: bold; }
|
||
|
.stacktrace .array { color: #990099; }
|
||
|
.stacktrace .unknown { color: #669900; font-weight: bold; }
|
||
|
.stacktrace blockquote { padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; }
|
||
|
</style>";
|
||
|
}
|
||
|
$return .= "<div class='stacktrace'><b>Call Stack:</b><br>";
|
||
|
reset($bt);
|
||
|
$x=0;
|
||
|
while(list($key,$val)=each($bt)){
|
||
|
if ($x > 0 && $val['function'] != 'logd_error_handler'){
|
||
|
$return .= "<b>$x:</b> <span class='function'>{$val['function']}(";
|
||
|
$y=0;
|
||
|
if ($val['args'] && is_array($val['args'])) {
|
||
|
reset($val['args']);
|
||
|
while (list($k,$v) = each($val['args'])){
|
||
|
if ($y > 0) $return.=", ";
|
||
|
$return.=backtrace_getType($v);
|
||
|
$y++;
|
||
|
}
|
||
|
} elseif ($val['args']) {
|
||
|
// If for some reason it's not an array, don't barf.
|
||
|
$return.=backtrace_getType($val['args']);
|
||
|
}
|
||
|
$return.=")</span> called from <b>{$val['file']}</b> on line <b>{$val['line']}</b><br>";
|
||
|
}
|
||
|
$x++;
|
||
|
}
|
||
|
$return.="</div>";
|
||
|
return $return;
|
||
|
}
|
||
|
function backtrace_getType($in){
|
||
|
$return = "";
|
||
|
if (is_string($in)){
|
||
|
$return.="<span class='string'>\"";
|
||
|
if (strlen($in) > 25){
|
||
|
$return.=htmlentities(substr($in,0,25)."...", ENT_COMPAT, getsetting("charset", "ISO-8859-1"));
|
||
|
}else{
|
||
|
$return.=htmlentities($in, ENT_COMPAT, getsetting("charset", "ISO-8859-1"));
|
||
|
}
|
||
|
$return.="\"</span>";
|
||
|
}elseif (is_bool($in)){
|
||
|
$return.="<span class='bool'>".($in?"true":"false")."</span>";
|
||
|
}elseif (is_int($in)){
|
||
|
$return.="<span class='number'>{$in}</span>";
|
||
|
}elseif (is_float($in)){
|
||
|
$return.="<span class='number'>".round($in,3)."</span>";
|
||
|
}elseif (is_object($in)){
|
||
|
$return.="<span class='object'>".get_class($in)."</span>";
|
||
|
}elseif (is_null($in)){
|
||
|
$return.="<span class='null'>NULL</span>";
|
||
|
}elseif (is_array($in)){
|
||
|
if (count($in)>0){
|
||
|
$return.="<span class='array'>Array(<blockquote>";
|
||
|
reset($in);
|
||
|
$x=0;
|
||
|
while (list($key,$val)=each($in)){
|
||
|
if ($x>0) $return.=", ";
|
||
|
$return.=backtrace_getType($key)."=>".backtrace_getType($val);
|
||
|
$x++;
|
||
|
}
|
||
|
$return.="</blockquote>)</span>";
|
||
|
}else{
|
||
|
$return.="<span class='array'>Array()</span>";
|
||
|
}
|
||
|
}else{
|
||
|
$return.="<span class='unknown'>Unknown[".gettype($in)."]</span>";
|
||
|
}
|
||
|
return $return;
|
||
|
}
|
||
|
?>
|