====== PHP RFC: Error backtraces ======
* Version: 1.0
* Date: 2020-05-25
* Author: Max Semenik, maxsem.wiki@gmail.com
* Status: Inactive
* First Published at: https://wiki.php.net/rfc/error_backtraces
===== Introduction =====
PHP errors, unlike exceptions, are much more limited in programmers' ability to control their handling and get detailed information about them. I propose to fix some of these issues by recording a backtrace for every error.
This problem is so serious that, for example, Wikimedia has created [[https://github.com/wikimedia/php-wmerrors|an extension]] for this.
===== Proposal =====
Add backtraces to error output.
**Error output**: traces will be formatted exactly like for exceptions, and appended to error messages, e.g.:
Fatal error: Allowed memory size of 134217728 bytes exhausted in /var/www/test.php on line 123
#0 /var/www/test.php(123): spl_eat_all_memory()
#1 /var/www/foo.php(456): foo(123, 'foo')
#2 /var/www/bar.php(789): bar()
#3 {main}
**Logging**: backtraces will be logged just like for exceptions.
**''error_get_last()''** output will have another element added to it if a trace is available:
#1 {main}
array(5) {
["type"]=>
int(1)
["message"]=>
string(22) "Error, terrible error!"
["file"]=>
string(17) "/var/www/test.php"
["line"]=>
int(3)
["backtrace"]=>
string(123) "#0 /var/www/test.php(345): $this->causeTerribleError()
#1 {main}"
}
**Configuration**: while always having backtraces is nice for debugging, some people might not like the performance overhead of generating backtraces or the risk of having to generate a trace after a fatal error. I therefore propose to address this with an INI setting, ''debug_backtraces'' that allows to turn this feature on and off, as well as to limit the number of stack frames outputted:
* 0 - no backtraces
* positive number - output this number of frames
* negative value - no limit
By default it would be on in development settings but off in production.
===== Backward Incompatible Changes =====
* In the current proposed implementation, a new error flag ''E_UNHANDLED_EXCEPTION'' is introduced to [[https://github.com/php/php-src/pull/5642/files#diff-1a9cfc6173e3a434387996e46086da56R1310|avoid outputting backtraces for unhandled exceptions twice]], though it's not included in ''E_ALL'' and is invisible for userspace.
* From the userspace POV, everything will behave exactly as before with backtraces disabled, while turning them on would introduce a few minor changes to how errors are represented.
===== Proposed PHP Version(s) =====
8.0
===== php.ini Defaults =====
For ''error_backtraces'':
* Default value: 0
* php.ini-development value: 100
* php.ini-production value: 0
===== Open Issues =====
Make sure there are no open issues when the vote starts!
===== Unaffected PHP Functionality =====
Everything other than the minor stuff mentioned in //Backward Incompatible Changes//.
===== Future Scope =====
Backtrace handling code could use some unification and refactoring, but that doesn't require a RFC and thus can be addressed later.
===== Proposed Voting Choices =====
* Accept this RFC (yes/no)?
===== Patches and Tests =====
* WIP patch: https://github.com/php/php-src/pull/5642
===== References =====
Links to external references, discussions or RFCs
===== Rejected Features =====
Keep this updated with features that were discussed on the mail lists.