源码分析必备:用vld查看opcode信息

JavaScript性能优化:全链路性能优化策略 JavaScript性能优化是提升Web应用质量的核心要素,直接影响用户体验与业务成果。研究表明,页面加载延迟1秒可能导致转化率下降7%。高效的JavaScript执行能减少主线程阻塞,避免动画卡顿或操作延迟,尤其在移动端低性能设备上更为关键。优化内存管理与减少冗余计算可降低浏览器资源消耗,防止因内存泄漏导致的崩溃,提升应用稳定性。在竞争激烈的互联网环境中,性能优势已成为产品差异化的关键因素,直接影响用户留存与商业价值。因此,性能优化应作为开发全周期的核心实践,而非事后补救措施。 阅读详情

 VLD(Vulcan Logic Dumper)的简介如下:

The Vulcan Logic Dumper hooks into the Zend Engine and dumps all the opcodes (execution units) of a script. It can be used to see what is going on in the Zend Engine.

 

     之前的文章 PHP解释器引擎执行流程 结尾处提到了VLD的原理,此扩展利用PHP对扩展模块提供的请求初始化钩子函数(PHP_RINIT_FUNCTION),在每此请求到来的时候将默认的编译函数指针zend_compile_file和执行函数指针zend_execute指向自己定义的vld_compile_file函数和vld_execute函数,这两个函数中,对原函数进行了封装,原编译函数能返回一个op_array的指针,所以在新的编译函数中可以截获这个op_array的指针,然后输出相关opcode信息。  

    关于PHP扩展模块的安装这里就不介绍了,网络上很多相关资料。

    那么让我们看看这个扩展安装后的实际效果,以下为一个非常简单的PHP脚本,test.php:

 

在命令行下执行该脚本:

php -dvld.active=1 test.php

 

于是可以看到vld输出的内容:

 

希望看到跟详细的内容可以用以下方式:

php -dvld.active=1 -dvld.verbosity=3 test.php

 

 

这里简单的说说输出内容的含义:

这段代码一共有3个op分别是:

1:ASSIGN          // #define ZEND_ASSIGN                           38

2:ECHO             // #define ZEND_ECHO                             40

3:RETURN         //  #define ZEND_RETURN                          62

 

第1个op ASSIGN的操作句柄是将OP2的值赋值给OP1,对应的就是$a = "Hello world"这句代码,那么OP2就是"Hello world"的,OP1应该就是$a,但是实际上输出的内容中显示的是!0,实际上$a属于编译后的变量,!0就代表了$a,可以在输出op list的上一行看到

compiled vars:  !0 = $a

这样的优化可以避免每次查找变量$a都在变量符号表中去检索,起到一定的缓存的作用。在这条op执行结束之后,!0的值就等于"Hello world"了。

 

第2个op ECHO的操作句柄是将 OP1的内容送到标准输出,对应的就是echo $a这句代码,这样就把"Hello world"输出到终端了

 

第3个op RETURN 是在每个PHP文件结尾都会自动加上的,它的操作句柄是将OP1的常量值返回

 

这样我们就能很清晰的知道一段PHP代码会得到什么样的OP code,vld真的是一个不错的分析工具。

 

 

也许有人会问,你怎么知道每个op对应的执行句柄是什么呢,vld能输出这些信息吗?非常可惜,vld不能帮助我们输出OP对应的执行句柄信息。在默认以CALL方式执行op的模式下,每个op对应的handler都是一个函数,vld中截获的op中有这些handler的指针,但是无法通过这些指针知道相应的函数名,c语言没有一些更高级的语言那样的反射特性。所以如果想知道每个op对应的handler,就需要另外想办法了,目前为止,我只发现了两种方法可以得到这些信息。下面简单的介绍这两种方法。

 

 方法一:

    在之前的文章 PHP代码如何执行?中介绍过,op的handler都定义在{PHPSRC}/Zend/zend_vm_execute.h中,这是一个由PHP生成的极大的c源文件,其中有每个handler的函数定义以及op映射到handler的算法,在zend_init_opcodes_handlers函数中,初始化一个 static const opcode_handler_t labels[]数组,这个 labels数组就是handlers的一张表,这个表有近4000个项,每个项都是一个handler的函数指针,当然有大量的NULL指针,还有一些重复的指针。如果我们能有一个跟labels数组对应的数组handler_names,数组中的每一个项对应的是labels中相应项中函数指针的函数名,那么我们就可以通过现有的op到handler的映射算法从handler_names中得到该op的handler的函数名。但是事情没有想象的那么容易,我们如何正确生成这个拥有4000个项的数组handler_names,答案就在{PHPSRC}/Zend/zend_vm_gen.php,这个PHP文件是用来生成{PHPSRC}/Zend/zend_vm_execute.h,可以在其中找到生成labels数组的部分,只要添加相关代码通过类似方式生成handler_names数组就可以了。有兴趣的读者可以尝试生成这个handler_names数组文件,然后编译到vld扩展中,在输出op list的时候把每个op执行的句柄函数名也一并输出。

 

方法二:

   此方法是我目前经常用到的,相对来说比较方便,还是在{PHPSRC}/Zend/zend_vm_gen.php这个文件里面想办法。这个文件会生成每个op的handler,所以如果想办法在每个handler函数的代码中输出该handler名字,那么就知道哪些handler被调用。这个并不太难,在zend_vm_gen.php第380行左右可以看到类似以下PHP代码:

if (0 && strpos($code, '{') === 0) {

    ...

}

 

实际上这个条件中的代码就是在每个handler开始的一行中输出内容,但是因为条件永远无法满足,所以实际条件中的代码无法执行,可以将if中的条件改成true,然后大括号输出函数的名字就可以了,具体的代码如下:

 代码具体的原理就不介绍了。在修改好zend_vm_gen.php之后,在命令行下执行该脚本,就会生成一个新的zend_vm_execute.h( 同时会生成zend_vm_opcodes.h),打开zend_vm_execute.h文件,可以看到很多函数开头都多出了这么一句:

fprintf(stderr, "ZEND_***/n");

这样每个函数开始执行的时候就会把自己的名字输出到标准错误。下面的工作,就是重新编译Zend/zend_execute.lo,然后重新链接sapi/cli/php,如果你不知道如何单独完成这些操作,那么也可以更暴力一点重新安装整个PHP,需要注意的是修改后的PHP千万不要用在正式环境,因为会输出一大量不需要的信息,自己单独为试验安装一个PHP吧。 另外这个方法也会输出一些非直接的hanlder的函数名,有可能一个handler会调用另外一个函数,这样可能会输出这个handler的名字和那个被调用的函数的名字,所以实际输出的函数名字会多于op的数量。

    我们用方法二来查看前面的test.php的op handler的名字,直接用修改后的php 执行test.php得到以下内容:

 

ZEND_ASSIGN_SPEC_CV_CONST_HANDLER
ZEND_ECHO_SPEC_CV_HANDLER
Hello worldZEND_RETURN_SPEC_CONST_HANDLER
zend_leave_helper_SPEC_HANDLER

 

可以看到一共输出了4个函数的名字,其中ZEND_ASSIGN_SPEC_CV_CONST_HANDLER函数就是ASSIGN的handler,ZEND_ECHO_SPEC_CV_HANDLER就是ECHO的handler,ZEND_RETURN_SPEC_CONST_HANDLER是RETURN的handler,这个handler会调用zend_leave_helper_SPEC_HANDLER函数,所以会输出4个函数的名字,知道了这些函数的名字,我们就能在zend_vm_execute.h中去找到其具体定义,这样就知道每个op到底是怎么在执行了。

 

详解MegatronLM序列模型并行训练(Sequence Parallel) MegatronLM的第三篇论文是2022年出的。在大模型训练过程中显存占用过大往往成为瓶颈,一般会通过recomputation重计算的方式降低显存占用,但会带来额外的计算代价。这篇论文提出了两种方法,分别是和,这两种方法和Tensor并行是可以相结合的,可以有效减少不必要的计算量。下图中绿色部分表示不同模型中需要用于保存activation需要的显存大小,蓝色部分表示不同模型中需要用于保存parameter和optimizer state需要的显存大小。红色线表示A100的显存大小80G。 阅读详情

相关推荐

win10删除vmware12后,重新安装失败(遗留注册表问题)解决总结

之前安装过一次VMware虚拟机,后来由于某些已遗忘原因把它卸载了,但是没有卸载完全,为以后安装留下了一些麻烦,现在根据我google很多内容总结后写下了自己的解决办法。 一些我搜的的可以用的VM12的注册码 5A02H-AU243-TZJ49-GTC7K-3C61N ZZ510-DYX47-48ERP-D6XZG-YCKU2 YV5MU-2FX5H-M841P-LZX5X-PYHX8

Jeason的博客 2万+

PHP VLD扩展使用

1、 VLD 是什么? 答:vld 是 PECL extensions 扩展之一 ,也就是我们在 php.ini 中 extension=php_mysql.dll 这种,它的主要功能是方便我们查看php 底层编译的 opcode . 2、opcode 是什么? 3、如何安装使用VLD? 1)windows 下 PHP 添加 VLD 1、确定PHP版本 ts? nts? ...

人间正道 2186

Zabbix在Ubuntu 22.04上的性能优化与监控实战:从基础安装到高级配置

本文详细介绍了在Ubuntu 22.04系统上部署和优化Zabbix监控系统的完整流程,从基础安装到高级配置。内容包括MySQL数据库设置、Zabbix服务器与Web前端优化、性能调优策略以及实战监控场景应用,帮助用户构建高效的企业级监控解决方案。

sss66的博客 895

PHP函数源码之VLD实现原理

vld功能的实现要依赖 Zend引擎初始化(zend_startup)的时候 将zend_execute和zend_compile_file定义为函数指针的功劳了   默认的 zend_execute 指向 execute zend_compile_file 指向 compile_file   试想如果我们在实际编译和执行之前将zend_execute和zend_

编程二哥 1524

RL调参侠之BipedalWalker BipedalWalkerHardcore SAC

前几天用PPO训练了个很一般的agent: RL调参侠之BipedalWalker PPO 我看SpinningUp上面说PPO和SAC是两个领域里各自的State_of_the_art的方法,所以就打算跑SAC试试看,之前因为Open AI Five的原因,一直感觉PPO很牛掰,实际上现在很多自动驾驶的算法也是用PPO在跑,毕竟有一个“必定能够提升期望”的理论保证在这里,我理解这对做项目很大的诱惑。 不过我跑出来的结果明显是SAC更好。 调参侠时间 策略熵的权重alpha用的0.2,我一开始没有看SAC的

weixin_48370148的博客 2101

哈工大集合论与图论(下)慕课MOOC答案

答案选自2023哈工大集合论与图论慕课,慕课的题重复率很高并且具有极高的相似性,选答案时要格外注意对比选项,能力有限答案不一定面面俱到,整理不易读者且用且珍惜。

qq_34168477的博客 2903

动手实践,Linux 安装 php-vld 全过程实录

开篇三问 对于一些新手小白可能会发问:VLD 是什么? 答:vld 是 PECL extensions 扩展之一 ,也就是我们在 php.ini 中 extension=php_mysql.dll 这种,它的主要功能是方便我们查看 php 底层编译的 opcode。 紧接着又有第二问:opcode 是什么? 答:当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode)。Opcode cache 的目地是避免重复编译,减少 CPU.

架构精进之路 628

OpenBCI脑电数据处理实战:用MNE库从Raw对象到可视化分析全流程

本文提供了使用MNE-Python库处理OpenBCI脑电数据的完整实战指南。从通过BrainFlow库获取原始数据流、创建核心的Raw对象,到进行工频滤波、带通滤波等关键预处理步骤,最后实现时域信号、功率谱密度及地形图等多种专业可视化分析,手把手教你完成脑机接口数据处理的全流程。

gin88的博客 369

php vld 安装,PHP性能之语言性能优化:vld

vld介绍vld是PECL(PHP 扩展和应用仓库)的一个PHP扩展,现在最新版本是0.14.0(2016-12-18),它的作用是:显示转储PHP脚本(opcode)的内部表示(来自PECL的vld简介)。简单来说,可以查看PHP程序的opcode。vld扩展的安装1、下载官方插件安装压缩包下载命令:# wget http://pecl.php.net/get/vld-0.14.0.tgz注:...

weixin_36354351的博客 578

银行监管报送系统系列介绍(二十一):银行监管报送系统总览

为保护法院案件当事人、利害关系人的合法权益,全面落实《最高人民法院、中国银行业监督管理委员会关于人民法院与银行业金融机构开展网络执行查控和联合信用惩戒工作的意见》(法【2014】266号),最高人民法院和银监会联合下发了《人民法院、银行业金融机构网络执行查控工作规范》(法【2015】321号),要求银行金融机构配合最高人民法院开展 “总对总”网络执行查控工作,并建立相应的业务系统,实现与法院的网络对接,协助法院完成对被执行人银行账户存款及其他金融资金的网络查询、冻结与扣划工作。

银行信息系统应用架构详解 2866

Python 中 dpkt 库的详细使用指南(强大的 Python 数据包解析库)

dpkt 是一个功能强大的 Python 网络数据包解析库,支持解析和构造以太网、IP、TCP/UDP 等多种协议的数据包。其核心功能包括解析各层协议头部、读写 pcap 文件、构造自定义数据包及分析 HTTP 流量等。dpkt 提供简单易用的 API,适用于网络分析、安全研究和流量监控场景。优化技巧包括数据包过滤、批量处理和选择性解析以提高性能,常见问题如数据不完整或协议识别错误可通过异常处理和字段验证解决。典型应用场景涵盖协议分析、网络调试和自定义数据包生成。

数据知道的博客 1万+

i春秋——“百度杯”CTF比赛 十月场——Vld(Vulcan Logic Dumper 、php opcode、sql 报错注入)...

打开题目看到提示 "do you know Vulcan Logic Dumper?" ,再查看源码看到"<!-- index.php.txt ?>",访问后发现一堆看不懂的东西 这肯定就是所谓的Vulcan Logic Dumper了,先了解下相关概念 PHP内核-Zend引擎:http://www.php.cn/php-weizijiaocheng-355597.ht...

weixin_30553837的博客 660

ATECC508A芯片开发笔记(三):获取508A串号、随机数源码及I2C抓包分析

ATECC508A芯片开发笔记(三):读取508A串号、获取随机数源码及I2C抓包分析 APP层函数编写及源码分析 At508_GetSernum() GetSernum抓包记录 At508_GetRandom( ) GetRandom抓包记录 经过前两章节,CryptoAuthlib库已经成功适配在代码中了,下面简单测试一下API函数,并分析下I2C通讯流程: APP层函数编写及源码分析利用li

HowieXue 薛永浩的博客 2万+

PHP使用vld扩展查看opcodes

PHP使用vld扩展查看opcodes 需要分析PHP代码的性能,或者说实现同样功能的代码到底哪个更好呢?或者说想知道底层的实现可以使用VLD查看opcode。 下载安装vld扩展 该扩展以收录在 PECL 下载对应的版本安装 修改 php.ini,增加 extension=php_vld.dll php -m 简单使用vld 代码 <?php echo 1 + 2; 执行 $ php -dvld.active=1 test.php Finding entry points Branch analy

猛犸象 1154

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VLD:深入理解PHP底层结构的必备工具

VLD:深入理解PHP底层结构的必备工具 VLD(Variable Length Decomposer)是由Derick Rethans开发的一个强大的PHP扩展,专门用于展示PHP的低级结构信息。这个开源项目以C为主要编程语言,并融入了少量的PHP和M4代码,展现出了对PHP内部运作机制的深刻洞察。 核心功能 VLD的核心价值在于其能够详细分解并显示PHP脚本在执行时的指令序列(opcodes)...

gitblog_00670的博客 557

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

CTF日记之 “百度杯”CTF比赛 十月场

CTF日记:“百度杯”CTF比赛 十月场 Vld 点开之后发现: 还是先查看源代码: 访问: index.php.txt 发现了一堆这个东西,然后根据之前的界面上写的do you know Vulcan Logic Dumper?,百度一下“Vulcan Logic Dumper”: 这肯定就是所谓的Vulcan Logic Dumper了,先了解下相关概念 PHP内核-Zend引擎:http://www.php.cn/php-weizijiaocheng-355597.html PHP中的opc

sunleibaba的博客 607

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【亲测免费】 VLD项目常见问题解决方案

VLD项目常见问题解决方案 项目基础介绍 VLD(Vulcan Logic Dumper)是一个开源的PHP扩展,用于显示PHP脚本的底层结构。它可以帮助开发者理解和调试PHP代码的内部工作机制。VLD项目主要使用C语言编写,同时也包含少量的PHP、M4和Shell脚本。 新手使用注意事项及解决方案 1. 安装失败问题 问题描述:新手在尝试安装VLD扩展时,可能会遇到编译失败或PECL安装不成功的...

gitblog_00750的博客 468

VLD扩展使用方法

VLD(Vulcan Logic Dumper)是一个挂钩在Zend引擎下, 并且输出PHP脚本生成的中间代码(OPCode)的扩展。 它可以在一定程序上查看Zend引擎内部的一些实现原理。 VLD扩展是一个开源的项目下载地址 <?php $start = new DateTime(); echo $start->format("Y-m-d H:i:s"); 使用VLD查看OPCod...

小熊的专栏 1396

php windows vld,PHP之opcode及VLD使用

OpCode,即Operation Code,操作码。通常是指计算机指令中的一部分,用于指定要执行的操作, 指令的格式和规范由处理器的指令规范指定。通常opcode还有另一种称谓:字节码(byte codes)。例如Java编译后生成的class文件。PHP中的opcode则属于后者,PHP构建在Zend虚拟机(Zend VM)之上。PHP的opcode就是Zend虚拟机中的指令。当Zend 引擎...

weixin_42613018的博客 859

php vld解密zend,基于PHP7维护vld扩展的总结

vld扩展可以输出PHP编译阶段产生的中间码:opcode,对于想要了解PHP内核的人是极好的辅助工具。在研究PHP7的过程中需要这个利器,可是官方发布的最新扩展不兼容PHP7,所以只能自己动手,修复了这个问题。patch文件已经提交,有兴趣的同学可以去看一下:https://bugs.php.net/bug.php?id=70587在维护过程中发现PHP7与之前版本的不同之处有:1、64位操作系...

weixin_39815943的博客 501

PHP安装与使用VLD查看opcode代码【PHP安装第三方扩展的方法】

需要分析PHP代码的性能,或者说实现同样功能的代码到底哪个更好呢?或者说想知道底层的实现可以使用VLD查看opcode下载与安装VLD# wget http://pecl.php.net/get/vld-0.11.2.tgz# tar zxvf vld-0.11.2.tgz# cd ./vld-0.11.2# /usr/local/php/bin/phpize              或者直接p

深度Java 2万+

PHP性能之语言性能优化:安装VLD扩展——检测性能

使用Linux命令安装 //下载安装包 wget http://pecl.php.net/get/vld-0.14.0.tgz //解压包 tar zxvf vld-0.14.0.tgz //进入编译、安装目录 cd vld-0.14.0/ //扩展PHP的扩展木块 phpize //使用locate找到php-config路径 locate php-config 如果提示没有该...

weixin_30408165的博客 151

PHP扩展编写、PHP扩展调试、VLD源码分析、基于嵌入式Embed SAPI实现opcode查看

catalogue 1. 编译PHP源码 2. 扩展结构、优缺点 3. 使用PHP原生扩展框架wizard ext_skel编写扩展 4. 编译安装VLD 5. Debug调试VLD 6. VLD源码分析 7. 嵌入式Embed SAPI编程 1. 编译PHP源码 wget http://cn2.php.net/distributions/php-5.5.31.tar....

hevenue的专栏 1398

解密ZEND加密后的PHP

下载地址 http://www.huanle.net/down/vld.php执行#tar -xzf vld-0.8.0.tgz //解压#mv vld-0.8.0 vld //重命名#cd -R vld ../php-4.3.8/ext //拷贝vld目录到php的解压目录下的ext中#cd php-4.3.8#rm configure //删除configure

计算机编程痴迷者的乐园 2482

【Visual Leak Detector】QT 中 VLD 输出解析(三)

程序运行结束后,检测到了内存泄漏,VLD 会输出以下报告(本例中出现三处内存泄漏),第 1~3 行显示 VLD 运行状态,第 4~19 行显示。程序运行结束后,检测到了内存泄漏,VLD 会输出以下报告(本例中出现两处内存泄漏),第 1~3 行显示 VLD 运行状态,第 4~19 行显示。函数泄漏内存的详细信息,第 58~60 行总结此次泄漏情况,第 61 行显示 VLD 退出状态。函数泄漏内存的详细信息,第 40~42 行总结此次泄漏情况,第 43 行显示 VLD 退出状态。第 40~41 行中的。

m0_37803477的博客 475
上一篇: 变量的内部存储:值和类型
下一篇: OPcode简介
phpkernel
博客等级 码龄16年 96粉丝 13原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值