如何准确的查看opline对应的handler名字

我们在分析opcode对应的handler的时候,往往会根据opcode的命名规则来推断具体的handler。然而,如果我们使用PHP8的话,我们可以利用jitdebug功能来快速的看到opcode对应的handler。我举个例子:

有如下代码:

1
2
$a = [1, 2, 3];
$a[2];

像这个$a[2]对应的handler还是非常的长的,我们很难一口气推断出来。我们只需要配置一下php.ini就可以方便的拿到handler

1
2
3
4
5
6
7
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1

opcache.jit=1201
opcache.jit_buffer_size=64M
opcache.jit_debug=0x01

执行结果如下:

1
2
3
4
5
6
JIT$/Users/hantaohuang/codeDir/cCode/php-src/test.php: ; (/Users/hantaohuang/codeDir/cCode/php-src/test.php)
# 省略其他的汇编代码
mov $ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UNUSED_HANDLER, %rax
# 省略其他的汇编代码
mov $ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST_HANDLER, %rax
# 省略其他的汇编代码

可以看到,handlerZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST_HANDLER