summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Pritz <bluewind@xinu.at>2014-12-06 21:19:08 +0100
committerFlorian Pritz <bluewind@xinu.at>2014-12-06 21:19:08 +0100
commit38db82116dfd543a08a553ae75112e6992a7718d (patch)
tree26fdff80825ac13d2a2c375a2033791c7547f2b0
parentcdb983cfa7da19294ab82993aa073f0116026e9a (diff)
Improve backtraces
PHP's default functions truncate longer argument values so backtrace will not be as helpful as they could be. This code tries to mimic PHP's way of printing traces except it prints full arguments. Signed-off-by: Florian Pritz <bluewind@xinu.at>
-rw-r--r--index.php15
1 files changed, 13 insertions, 2 deletions
diff --git a/index.php b/index.php
index 00ab370c3..abca7afb1 100644
--- a/index.php
+++ b/index.php
@@ -219,18 +219,29 @@ function _actual_exception_handler($e)
$GLOBALS["is_error_page"] = true;
$heading = "Internal Server Error";
$message = "<p>An unhandled error occured.</p>\n";
+
+ $backtrace = "";
+ $i = 0;
+ foreach ($e->getTrace() as $key => $frame) {
+ $backtrace .= sprintf("#%d %s(%d): %s(%s)\n",
+ $i++, isset($frame["file"]) ? $frame["file"] : "[internal function]",
+ isset($frame["line"]) ? $frame["line"] : "", $frame["function"], implode(", ", array_map(
+ function ($e) { return var_export($e, true); }, $frame["args"])));
+ }
+
if ($display_errors) {
$message .= '<div>';
$message .= '<b>Fatal error</b>: Uncaught exception '.get_class($e).'<br>';
$message .= '<b>Message</b>: '.$e->getMessage().'<br>';
- $message .= '<pre>'.(str_replace(FCPATH, "./", $e->getTraceAsString())).'</pre>';
+ $message .= '<pre>'.(str_replace(FCPATH, "./", $backtrace)).'</pre>';
$message .= 'thrown in <b>'.$e->getFile().'</b> on line <b>'.$e->getLine().'</b><br>';
$message .= '</div>';
} else {
$message .="<p>More information can be found in syslog or by enabling display_errors.</p>";
}
- error_log($e);
+ $heading = sprintf("Exception '%s' with message '%s' in %s:%d", get_class($e), $e->getMessage(), $e->getFile(), $e->getLine());
+ error_log($heading."\n".$backtrace);
$message = "$message";
include APPPATH."/errors/error_general.php";