Become a Patron!

My Amazon wishlist can be found here.

Life Line

Xdebug 2.3: Munging errors

This is the third article in a series about new features in Xdebug 2.3, which was first released on February 22nd.

One of the first features I added to Xdebug was the interception of error messages, so that it was possible to shows stack traces when an error occurred. Xdebug 2.3 has a few additional settings to control the behaviour of interception.

First, we have the new xdebug.halt_level. This setting allows you to tell Xdebug to convert certain warnings into fatal errors. Due to the way how PHP works, you can currently only do this for E_WARNING, E_NOTICE, E_USER_WARNING, and E_USER_NOTICE.

Setting xdebug.halt_level to E_NOTICE | E_USER_NOTICE will make the following script not show Hi!:

<?php
ini_set('xdebug.halt_level', E_USER_NOTICE | E_NOTICE);
trigger_error("Testing");
echo "Hi!\n";
?>

Instead, it will show the call stack, and then abort the script:

Notice: Testing in - on line 3

Call Stack:
        0.0082     258480   1. {main}() -:0
        0.0085     259400   2. trigger_error() -:3

This feature was requested by Rob Allen, who also wrote about it.

The second related improvement is the addition of the xdebug.force_display_errors and xdebug.force_error_reporting settings. These php.ini only settings can be used to override PHP's display_errors and error_reporting settings. This is typically useful in a legacy code base where developers tried to be clever about not showing warnings, or for example turning of notices that now hamper developer - or upgrade efforts.

Take the following script:

<?php
ini_set("display_errors", 0);
trigger_error("two");
?>

When you run this with just php thescript.php, the output will be nothing (because you are hiding errors). Running the example script with php -d xdebug.force_display_errors=1 thescript.php, the output becomes:

Notice: two in /tmp/thescript.php on line 3

Call Stack:
        0.0002     261072   1. {main}() /tmp/thescript.php:0
        0.0002     261944   2. trigger_error() /tmp/thescript.php:3

The related setting xdebug.force_error_reporting acts at a bit mask to force certain errors to be shown. Even with error_reporting set to 0, the following script run with php -d xdebug.force_error_reporting /tmp/otherscript.php will still show the errors:

<?php
ini_set("error_reporting", E_ERROR | E_WARNING | E_USER_WARNING);
trigger_error("two", E_USER_NOTICE);
?>

With as output:

Notice: two in /tmp/otherscript.php on line 3

Call Stack:
        0.0002     261432   1. {main}() /tmp/otherscript.php:0
        0.0003     262352   2. trigger_error() /tmp/otherscript.php:3


Other parts in this series:

Shortlink

This article has a short URL available: https://drck.me/errors23-bns

Comments

Both features are awesome! No more die() debugging on strangely configured systems.

Add Comment

Name:
Email:

Will not be posted. Please leave empty instead of filling in garbage though!
Comment:

Please follow the reStructured Text format. Do not use the comment form to report issues in software, use the relevant issue tracker. I will not answer them here.


All comments are moderated