Looks fine.
On 12/24/18 12:17 AM, Derick Rethans wrote: > Hi, > > VLD is not a zend extension, so gets loaded/initialised later anyway. > And it seems your hint with post_startup works. I'd appreciate if you > could have a look at my change though: > > https://github.com/xdebug/xdebug/commit/3ef3c63ffc831426a45439dbf8b56b998f84d5b1 > > cheers, > Derick > > On Mon, 17 Dec 2018, Dmitry Stogov wrote: > >> Hi Derick, >> >> >> First, check why VLD works out of the box. >> >> At second, you may plug into post_startup hook to reassign zend_compile >> after opcache. >> >> >> Thanks. Dmitry. >> >> ________________________________ >> From: Derick Rethans <der...@php.net> >> Sent: Saturday, December 15, 2018 10:01:37 PM >> To: Dmitry Stogov >> Cc: Nikita Popov; PHP Developers Mailing List >> Subject: Changes to when OPcache initialises >> >> Hi! >> >> I am working on making Xdebug work properly with PHP 7.3, and over the >> last week I have been tearing my hair out as to why Xdebug's view of >> opcodes was no longer showing the opcodes that OPcache had >> modified/optimised. In PHP 7.2, the order in which you load Xdebug and >> OPcache made a difference. >> >> OPcache optimises out line 6, which has dead code: >> >> 1 <?php >> 2 >> 3 try >> 4 { >> 5 throw new Exception(); >> 6 echo strlen( "Revenge is a dish best served cold.\n" ); >> 7 } >> 8 catch(Exception $e) >> 9 { >> 10 } >> 11 >> 12 echo strlen( "The fire is always hotter on someone elses face." ), "\n"; >> 13 ?> >> >> >> derick@singlemalt:~/dev/php/derickr-xdebug $ /usr/local/php/7.2.13/bin/php >> -n -dzend_extension=opcache.so -d "zend_extension=xdebug.so" -d >> "opcache.enable=1" -d "opcache.enable_cli=1" -d "xdebug.extended_info=1" >> -dvld.active=1 -f >> "/home/derick/dev/php/derickr-xdebug/tests/bug00213-php73-opcache.php" >> 48 >> /home/derick/dev/php/derickr-xdebug/tests/bug00213-php73-opcache.php:7: >> array(4) { >> [5] => >> int(1) >> [8] => >> int(1) >> [12] => >> int(1) >> [14] => >> int(1) >> } >> >> [GIT: issue1598-no-code-coverage-with-opcache][PHP: 7.2.13 ] >> derick@singlemalt:~/dev/php/derickr-xdebug $ /usr/local/php/7.2.13/bin/php >> -n -d "zend_extension=xdebug.so" -dzend_extension=opcache.so -d >> "opcache.enable=1" -d "opcache.enable_cli=1" -d "xdebug.extended_info=1" >> -dvld.active=1 -f >> "/home/derick/dev/php/derickr-xdebug/tests/bug00213-php73-opcache.php" >> 48 >> /home/derick/dev/php/derickr-xdebug/tests/bug00213-php73-opcache.php:7: >> array(5) { >> [5] => >> int(1) >> [6] => >> int(-2) >> [8] => >> int(1) >> [12] => >> int(1) >> [14] => >> int(1) >> } >> >> Where as with PHP 7.3.0, they both show the *unoptimised* version: >> >> derick@singlemalt:~/dev/php/derickr-xdebug $ /usr/local/php/7.3.0/bin/php >> -n -dzend_extension=opcache.so -d "zend_extension=xdebug.so" -d >> "opcache.enable=1" -d "opcache.enable_cli=1" -d "xdebug.extended_info=1" >> -dvld.active=1 -f >> "/home/derick/dev/php/derickr-xdebug/tests/bug00213-php73-opcache.php" >> 48 >> /home/derick/dev/php/derickr-xdebug/tests/bug00213-php73-opcache.php:7: >> array(5) { >> [5] => >> int(1) >> [6] => >> int(-2) >> [8] => >> int(1) >> [12] => >> int(1) >> [14] => >> int(1) >> } >> [GIT: issue1598-no-code-coverage-with-opcache][PHP: 7.2.13 ] >> derick@singlemalt:~/dev/php/derickr-xdebug $ /usr/local/php/7.3.0/bin/php >> -n -d "zend_extension=xdebug.so" -dzend_extension=opcache.so -d >> "opcache.enable=1" -d "opcache.enable_cli=1" -d "xdebug.extended_info=1" >> -dvld.active=1 -f >> "/home/derick/dev/php/derickr-xdebug/tests/bug00213-php73-opcache.php" >> 48 >> /home/derick/dev/php/derickr-xdebug/tests/bug00213-php73-opcache.php:7: >> array(5) { >> [5] => >> int(1) >> [6] => >> int(-2) >> [8] => >> int(1) >> [12] => >> int(1) >> [14] => >> int(1) >> } >> >> Curiously, vld, would always show the right (optimised) opcodes: >> >> filename: /home/derick/dev/php/derickr-xdebug/tests/bug00213.inc >> function name: (null) >> number of ops: 12 >> compiled vars: !0 = $e >> line #* E I O op fetch ext return >> operands >> ------------------------------------------------------------------------------------- >> 5 0 E > EXT_STMT >> 1 NEW $1 >> :-5 >> 2 EXT_FCALL_BEGIN >> 3 DO_FCALL 0 >> 4 EXT_FCALL_END >> 5 > THROW 0 >> $1 >> 8 6 E > > CATCH >> 'Exception', !0 >> 12 7 > EXT_STMT >> 8 ECHO >> 48 >> 9 EXT_STMT >> 10 ECHO >> '%0A' >> 14 11 > RETURN 1 >> >> branch: # 0; line: 5- 5; sop: 0; eop: 5; out0: -2 >> branch: # 6; line: 8- 8; sop: 6; eop: 6; out0: 7; out1: -2 >> branch: # 7; line: 12- 14; sop: 7; eop: 11; out0: -2 >> path #1: 0, >> path #2: 6, 7, >> >> >> So I did some digging and found out that OPcache in PHP 7.3 has had a change >> to the loading order. This was done in: >> https://github.com/php/php-src/commit/b4903aef16ec215f2095ff0a3615524656401660: >> >> commit b4903aef16ec215f2095ff0a3615524656401660 >> Author: Dmitry Stogov <dmi...@zend.com> >> Date: Wed Oct 18 17:18:54 2017 +0300 >> >> Move a part of opcache initialization into post_startup >> phase (when all extensions already loaded). >> >> Both Xdebug and OPcache hook into zend_compile. In PHP 7.2, when as per >> documentation, OPcache was loaded after Xdebug, OPcache's zend_compile >> (accel_startup) was run *first*, so that Xdebug sees the optimised >> opcodes. >> >> In PHP 7.3, after the above commit, Xdebug's zend_compile hook >> (xdebug_compile_file) is run before OPcache's — *no matter which >> extension is loaded first*. Due to this, Xdebug can not properly do code >> coverage anymore when OPcache is also present, as it can only see >> *unoptimised* oparrays during its zend_compile hook. >> >> Because opcodes may now differ between when Xdebug analyses oparrays >> (zend_compile stage) and when it uses it (zend_execute stage) the >> results can be inconsistent in OPcache has optimised things away, and/or >> rearranged branches. >> >> Right now, I don't think I have a choice but to disallow code coverage >> analysis when OPcache is present, but I would prefer finding a solution >> to this so that OPcache and Xdebug work together again, as it did for >> PHP versions before 7.3. >> >> cheers, >> Derick >> >> -- >> https://derickrethans.nl | https://xdebug.org | https://dram.io >> Like Xdebug? Consider a donation: https://xdebug.org/donate.php, >> or become my Patron: https://www.patreon.com/derickr >> twitter: @derickr and @xdebug >> > -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php