View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0001089 | Xdebug | Uncategorized | public | 2014-11-20 14:13 | 2015-01-07 10:26 |
| Reporter | edrjoe | Assigned To | derick | ||
| Priority | high | Severity | major | Reproducibility | always |
| Status | resolved | Resolution | no change required | ||
| Platform | Linux | OS | RHEL | OS Version | 6.4 |
| Product Version | 2.2.5 | ||||
| Summary | 0001089: Call to php_sapi_name() breaks exception handling | ||||
| Description | Combination of XDebug 2.2.5-6 + OpCache-7.0.4 + PHP 5.6.3 (turn either Xdebug OR ZO+ off, and problem goes away...), and a call to php_sapi_name() causes Exceptions that are caught and rethrown to immediately propagate to exception handler and ignore further catch statements. | ||||
| Steps To Reproduce | <?php if(php_sapi_name()) { | ||||
| Additional Information | Disabling either XDebug OR ZO+ fixes the issue. The call to php_sapi_name() is required. php_sapi_name() call has to be in logic - just calling it on it's own doesn't work. Workaround: use PHP_SAPI constant instead. | ||||
| Tags | No tags attached. | ||||
| Attached Files | opcode-on.txt (3,458 bytes)
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = 5, Position 2 = 20
Branch analysis from position: 5
Jump found. Position 1 = -2
Branch analysis from position: 20
Jump found. Position 1 = -2
Found catch point at position: 13
Branch analysis from position: 13
Jump found. Position 1 = 14, Position 2 = -2
Branch analysis from position: 14
Jump found. Position 1 = -2
Found catch point at position: 19
Branch analysis from position: 19
Jump found. Position 1 = 20, Position 2 = -2
Branch analysis from position: 20
filename: /home/derick/dev/php/derickr-xdebug/tests/bug01089.php
function name: (null)
number of ops: 22
compiled vars: !0 = $e, !1 = $e1
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > EXT_STMT
1 EXT_FCALL_BEGIN
2 DO_FCALL 0 $0 'php_sapi_name'
3 EXT_FCALL_END
4 > JMPZ $0, ->20
5 5 > EXT_STMT
6 FETCH_CLASS 0 :1 'Exception'
7 EXT_FCALL_BEGIN
8 NEW $0 :1
9 SEND_VAL 'Raaaa'
10 DO_FCALL_BY_NAME 1
11 EXT_FCALL_END
12 > THROW 0 $0
6 13 E > > CATCH 18 'Exception', !0
7 14 > EXT_STMT
15 ECHO 'hello'
8 16 EXT_STMT
17 > THROW 0 !0
10 18* JMP ->20
19 E > > CATCH 20 'Exception', !1
15 20 > EXT_STMT
21 > RETURN 1
hellobranch: # 0; line: 2- 2; sop: 0; eop: 4; out1: 5; out2: 20
branch: # 5; line: 5- 5; sop: 5; eop: 12; out1: -2
branch: # 13; line: 6- 6; sop: 13; eop: 13; out1: 14; out2: -2
branch: # 14; line: 7- 8; sop: 14; eop: 17; out1: -2
branch: # 19; line: 10- 10; sop: 19; eop: 19; out1: 20; out2: -2
branch: # 20; line: 15- 15; sop: 20; eop: 21; out1: -2
path #1: 0, 5,
path #2: 0, 20,
path #3: 13, 14,
path #4: 19, 20,
Fatal error: Uncaught exception 'Exception' with message 'Raaaa' in /home/derick/dev/php/derickr-xdebug/tests/bug01089.php on line 5
Exception: Raaaa in /home/derick/dev/php/derickr-xdebug/tests/bug01089.php on line 5
Call Stack:
0.0014 0 1. {main}() /home/derick/dev/php/derickr-xdebug/tests/bug01089.php:0
opcode-off.txt (3,576 bytes)
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = 5, Position 2 = 24
Branch analysis from position: 5
Jump found. Position 1 = -2
Branch analysis from position: 24
Jump found. Position 1 = -2
Found catch point at position: 16
Branch analysis from position: 16
Jump found. Position 1 = 17, Position 2 = -2
Branch analysis from position: 17
Jump found. Position 1 = -2
Found catch point at position: 22
Branch analysis from position: 22
Jump found. Position 1 = 23, Position 2 = -2
Branch analysis from position: 23
Jump found. Position 1 = 24
Branch analysis from position: 24
filename: /home/derick/dev/php/derickr-xdebug/tests/bug01089.php
function name: (null)
number of ops: 26
compiled vars: !0 = $e, !1 = $e1
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > EXT_STMT
1 EXT_FCALL_BEGIN
2 DO_FCALL 0 $0 'php_sapi_name'
3 EXT_FCALL_END
4 > JMPZ $0, ->24
3 5 > NOP
4 6 NOP
5 7 EXT_STMT
8 FETCH_CLASS 0 :1 'Exception'
9 EXT_FCALL_BEGIN
10 NEW $2 :1
11 SEND_VAL 'Raaaa'
12 DO_FCALL_BY_NAME 1
13 EXT_FCALL_END
14 > THROW 0 $2
6 15* JMP ->21
16 E > > CATCH 21 'Exception', !0
7 17 > EXT_STMT
18 ECHO 'hello'
8 19 EXT_STMT
20 > THROW 0 !0
10 21* JMP ->23
22 E > > CATCH 23 'Exception', !1
13 23 > > JMP ->24
15 24 > EXT_STMT
25 > RETURN 1
hellobranch: # 0; line: 2- 2; sop: 0; eop: 4; out1: 5; out2: 24
branch: # 5; line: 3- 5; sop: 5; eop: 14; out1: -2
branch: # 16; line: 6- 6; sop: 16; eop: 16; out1: 17; out2: -2
branch: # 17; line: 7- 8; sop: 17; eop: 20; out1: -2
branch: # 22; line: 10- 10; sop: 22; eop: 22; out1: 23; out2: -2
branch: # 23; line: 13- 13; sop: 23; eop: 23; out1: 24
branch: # 24; line: 15- 15; sop: 24; eop: 25; out1: -2
path #1: 0, 5,
path #2: 0, 24,
path #3: 16, 17,
path #4: 22, 23, 24,
xdebug-off-opcache-off.txt (2,734 bytes)
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = 2, Position 2 = 14
Branch analysis from position: 2
Jump found. Position 1 = -2
Branch analysis from position: 14
Jump found. Position 1 = -2
Found catch point at position: 8
Branch analysis from position: 8
Jump found. Position 1 = 9, Position 2 = -2
Branch analysis from position: 9
Jump found. Position 1 = -2
Found catch point at position: 12
Branch analysis from position: 12
Jump found. Position 1 = 13, Position 2 = -2
Branch analysis from position: 13
Jump found. Position 1 = 14
Branch analysis from position: 14
filename: /home/derick/dev/php/derickr-xdebug/tests/bug01089.php
function name: (null)
number of ops: 15
compiled vars: !0 = $e, !1 = $e1
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > DO_FCALL 0 $0 'php_sapi_name'
1 > JMPZ $0, ->14
5 2 > FETCH_CLASS 0 :1 'Exception'
3 NEW $2 :1
4 SEND_VAL 'Raaaa'
5 DO_FCALL_BY_NAME 1
6 > THROW 0 $2
6 7* JMP ->11
8 E > > CATCH 11 'Exception', !0
7 9 > ECHO 'hello'
8 10 > THROW 0 !0
10 11* JMP ->13
12 E > > CATCH 13 'Exception', !1
13 13 > > JMP ->14
15 14 > > RETURN 1
hellobranch: # 0; line: 2- 2; sop: 0; eop: 1; out1: 2; out2: 14
branch: # 2; line: 5- 5; sop: 2; eop: 6; out1: -2
branch: # 8; line: 6- 6; sop: 8; eop: 8; out1: 9; out2: -2
branch: # 9; line: 7- 8; sop: 9; eop: 10; out1: -2
branch: # 12; line: 10- 10; sop: 12; eop: 12; out1: 13; out2: -2
branch: # 13; line: 13- 13; sop: 13; eop: 13; out1: 14
branch: # 14; line: 15- 15; sop: 14; eop: 14; out1: -2
path #1: 0, 2,
path #2: 0, 14,
path #3: 8, 9,
path #4: 12, 13, 14,
xdebug-off-opcache-on.txt (2,438 bytes)
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = 2, Position 2 = 12
Branch analysis from position: 2
Jump found. Position 1 = -2
Branch analysis from position: 12
Jump found. Position 1 = -2
Found catch point at position: 7
Branch analysis from position: 7
Jump found. Position 1 = 8, Position 2 = -2
Branch analysis from position: 8
Jump found. Position 1 = -2
Found catch point at position: 11
Branch analysis from position: 11
Jump found. Position 1 = 12, Position 2 = -2
Branch analysis from position: 12
filename: /home/derick/dev/php/derickr-xdebug/tests/bug01089.php
function name: (null)
number of ops: 13
compiled vars: !0 = $e, !1 = $e1
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > DO_FCALL 0 $0 'php_sapi_name'
1 > JMPZ $0, ->12
5 2 > FETCH_CLASS 0 :1 'Exception'
3 NEW $0 :1
4 SEND_VAL 'Raaaa'
5 DO_FCALL_BY_NAME 1
6 > THROW 0 $0
6 7 E > > CATCH 10 'Exception', !0
7 8 > ECHO 'hello'
8 9 > THROW 0 !0
15 10* RETURN 1
10 11 E > > CATCH 12 'Exception', !1
15 12 > > RETURN 1
hellobranch: # 0; line: 2- 2; sop: 0; eop: 1; out1: 2; out2: 12
branch: # 2; line: 5- 5; sop: 2; eop: 6; out1: -2
branch: # 7; line: 6- 6; sop: 7; eop: 7; out1: 8; out2: -2
branch: # 8; line: 7- 8; sop: 8; eop: 9; out1: -2
branch: # 11; line: 10- 10; sop: 11; eop: 11; out1: 12; out2: -2
branch: # 12; line: 15- 15; sop: 12; eop: 12; out1: -2
path #1: 0, 2,
path #2: 0, 12,
path #3: 7, 8,
path #4: 11, 12,
| ||||
| Operating System | |||||
| PHP Version | 5.6.0-5.6.4 | ||||
|
|
Actually, this appears to happen with a host of different native function calls: php_uname() both cause the same error. |
|
|
I can reproduce this, and have pushed a test file (tests/bug01089.phpt) to From what I can see, there are different oparrays being generated for opcache.enable_cli=1 vs opcache.enable_cli=0 (with no other settings changes). I've added the different opcode dumps coming out of VLD for these both cases, as well as with xdebug off for each too. I can't figure out why this goes wrong though, as no valgrind warnings shows up (not even with USE_ZEND_ALLOC=0). |
|
|
This turns out not to be a bug in Xdebug, but in opcache. I can reproduce this on the command line by putting your code in a file (1089.php) and running on the command line: php -e -n -dzend_extension=opcache.so -dopcache.enable_cli=1 1089.php -n disables all INI settings (including loading opcache and xdebug) With the latter turned on, apparently, when Xinchem from Zend looked at it, he found: the problem is: <?php in zend_update_ext_info which is called in pass_two, the first thus, op_array->try_catch_array[0]->try_op is point to a NOP block,
|
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2014-11-20 14:13 | edrjoe | New Issue | |
| 2014-11-20 14:26 | edrjoe | Note Added: 0002914 | |
| 2015-01-05 23:03 | derick | Note Added: 0002957 | |
| 2015-01-05 23:03 | derick | Assigned To | => derick |
| 2015-01-05 23:03 | derick | Status | new => acknowledged |
| 2015-01-05 23:03 | derick | File Added: opcode-on.txt | |
| 2015-01-05 23:03 | derick | File Added: opcode-off.txt | |
| 2015-01-05 23:06 | derick | File Added: xdebug-off-opcache-off.txt | |
| 2015-01-05 23:06 | derick | File Added: xdebug-off-opcache-on.txt | |
| 2015-01-05 23:06 | derick | Note Edited: 0002957 | |
| 2015-01-07 10:26 | derick | Note Added: 0002963 | |
| 2015-01-07 10:26 | derick | Status | acknowledged => resolved |
| 2015-01-07 10:26 | derick | Resolution | open => no change required |
| 2016-07-31 12:36 | derick | Category | Usage problems => Usage problems (Crashes) |
| 2016-07-31 12:38 | derick | Category | Usage problems (Crashes) => Usage problems (Wrong Results) |
| 2020-03-12 16:35 | derick | Category | Usage problems (Wrong Results) => Variable Display |
| 2020-03-12 16:38 | derick | Category | Variable Display => Uncategorized |