Hi!
I'm trying to make Xdebug up to date with master again, and after fixing
the static changes that Dmitry highlighted, I am still baffled by
something else.
My function traces now have an extra entry for each constructor - even
for classes that have no constructor, such as stdClass.
Code
<?php
$tf = xdebug_start_trace(sys_get_temp_dir() . '/'. uniqid('xdt', TRUE));
$a = new StdClass;
xdebug_stop_trace();
echo file_get_contents($tf);
?>
In PHP 7.1 (master) this generates:
=> $tf = '/tmp/xdt5724dfa31b3050.51884776.xt' /home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:2
0.0017 386376 -> {main}() /home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:0
=> $a = class stdClass { } /home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:4
0.0017 386472 -> xdebug_stop_trace() /home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:6
0.0018 386568
Where as in PHP 5.6 and 7.0, it generates:
TRACE START [2016-04-30 17:10:19]
=> $tf = '/tmp/xdt5724e6fb674b31.38510038.xt' /home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:2
=> $a = class stdClass { } /home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:4
0.0006 274008 -> xdebug_stop_trace() /home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:6
0.0006 274128
TRACE END [2016-04-30 17:10:19]
The master version has the extra {main}, which comes from an additional
call to zend_execute_internal.
When looking into this, I see that that extra frame is a handle
zend_pass_function / zif_pass. How has this changed recently, and more
importantly, how can I detect this? I can't do "edata.func ==
zend_pass_function" as neither zend_pass_function or zif_pass are
exported symbols.
Any hints on how to handle this?
cheers,
Derick
Hi!
I'm trying to make Xdebug up to date with master again, and after fixing
the static changes that Dmitry highlighted, I am still baffled by
something else.My function traces now have an extra entry for each constructor - even
for classes that have no constructor, such as stdClass.Code
<?php
$tf = xdebug_start_trace(sys_get_temp_dir() . '/'. uniqid('xdt', TRUE));$a = new StdClass;
xdebug_stop_trace();
echo file_get_contents($tf);
?>In PHP 7.1 (master) this generates:
=> $tf = '/tmp/xdt5724dfa31b3050.51884776.xt'
/home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:2
0.0017 386376 -> {main}()
/home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:0
=> $a = class stdClass { }
/home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:4
0.0017 386472 -> xdebug_stop_trace()
/home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:6
0.0018 386568Where as in PHP 5.6 and 7.0, it generates:
TRACE START [2016-04-30 17:10:19]
=> $tf = '/tmp/xdt5724e6fb674b31.38510038.xt'
/home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:2
=> $a = class stdClass { }
/home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:4
0.0006 274008 -> xdebug_stop_trace()
/home/derick/dev/php/derickr-xdebug/tests/assignment-trace11.php:6
0.0006 274128
TRACE END [2016-04-30 17:10:19]The master version has the extra {main}, which comes from an additional
call to zend_execute_internal.When looking into this, I see that that extra frame is a handle
zend_pass_function / zif_pass. How has this changed recently, and more
importantly, how can I detect this? I can't do "edata.func ==
zend_pass_function" as neither zend_pass_function or zif_pass are
exported symbols.Any hints on how to handle this?
cheers,
Derick
Hey Derick!
This change is due to
http://www.serverphorums.com/read.php?7,1439618,1439618 /
https://github.com/php/php-src/commit/8e5b139732893d2a5f6ba3ae0a0b2b5cf6dba09f
.
I don't see a good way for you to handle this as things stand now. I think
we should export the zend_pass_function symbol.
Nikita