最新要闻
- 特斯拉降价后:门店半小时售10台 老车主直呼被损失4万
- 焦点速读:特斯拉降价引海外热议:这是《孙子兵法》!欲消灭传统车企
- 你拿多少?报告称2022年终奖人均2.19万元 一线城市近3万元
- 环球今日讯!果香浓郁!徐福记DODO综合果味棒棒糖 60支19.9元
- 【世界速看料】保护隐私!微信键盘iOS 1.0.2版更新:体积膨胀到237MB
- 全球观天下!联想GeekPro 2023主机首销6199元起:13代i5+RTX 3060
- 【天天快播报】春节前最后一次成品油调价来了!或迎2023年首次降价
- 关注:畅想未来:2023年手机还能怎样进化?
- 对话郑刚:与罗永浩分歧关键不是商业利益
- 最野性的福特SUV!探险者Timberline亮相:超帅黑橙配色
- 33.58万起!比亚迪腾势D9成交付最快破万高端MPV
- 天天通讯!《魔兽世界》国服关闭倒计时!网易向玩家发短信安利《逆水寒》
- 从超前点映到480P投屏 视频平台赚钱只能靠“割韭菜”?
- 环球快消息!程序猿创造的AI虚拟漂亮老婆 被真女友强制“安乐死”了
- 天天热议:液金+水冷压住RTX 40系显卡:机械革命晒新旷世笔记本散热系统
- 特斯拉海外大降价!老外车主气炸请求维权:免费送FSD
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
当前关注:使用vscode调试PHP底层C源码
使用vscode调试PHP底层C源码
一直想着有机会调试一下php底层代码来着,这周正好心血来潮,就跟着教程配置了一下。本篇文章是基于macOS,可能在编译php源码之前的步骤对使用windows的师傅没啥可参考的。
【资料图】
windows下比较麻烦,主要是在编译php源码这一步,最方便的办法是用docker来远程调试。具体可以参考这篇文章vscode远程调试php底层代码。使用p牛的dockerfile来自己建一个调试用docker。
说回mac下调试PHP源码需要的准备
下载并编译PHP
使用git来下载源码,这样切换PHP版本会较为方便。(不过我现在应该不会这么做,因为下载下来的源码并不能直接编译成功,需要自己修改。改完的源码不舍得切换了)
git clone https://github.com/php/php-src cd php-src/ git checkout PHP-7.3.67
当然,不排除个人环境的原因,通过checkout切换分支,重新编译一下还是很方便的,如果编译不出错的话。
如果是mac,编译PHP前需要安装一下最新版的bison,mac自带的版本太老。
brew install bison# bison的具体路径可以通过brew list bison来查看export PATH=/opt/homebrew/Cellar/bison/3.8.2/bin:$PATH
编译需要调试的PHP。像我这里就开启了debug模式,开启了phar扩展,如果需要开启别的扩展,需要再./configure
命令后面自行指定。
./buildconf ./configure --disable-all --enable-debug --enable-phar --prefix=/source/php7.3.6/ make make install
编译完后,编译结果都在/source/php7.3.6/
文件夹下,/source/php7.3.6/bin/php
为可执行文件。
编译好的PHP,执行./php -v
会显示NTS DEBUG
。
编译过程中的错误
在进行make编译的时候,碰到了两次报错。
第一个报错:
/Users/niushaogang/jkbPhpPackage/php-5.4.45/main/reentrancy.c:139:23: error: too few arguments to function call, expected 3, have 2 readdir_r(dirp, entry); ~~~~~~~~~ ^/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/dirent.h:110:5: note: "readdir_r" declared hereint readdir_r(DIR *, struct dirent *, struct dirent **) __DARWIN_INODE64(readdir_r); ^1 error generated.make: *** [main/reentrancy.lo] Error 1
根据网上的教程,了解到这是php源码调用readdir_r函数的时候少传了一个参数。
查看php-src/main/reentrancy.c
函数定义:
int readdir_r(DIR *, struct dirent *, struct dirent **)
php调用:
readdir_r(dirp, entry)
readdir_r(dirp, entry)
修改为 readdir_r(dirp, entry,&entry)
即可编译通过
第二个报错:
/Users/dre0m1/CTF/学习笔记/PHP源码/php-src/Zend/zend_language_parser.y:1317:5: error: implicit declaration of function "yystpcpy" is invalid in C99 [-Werror,-Wimplicit-function-declaration] yystpcpy(yyres, "end of file"); ^ /Users/dre0m1/CTF/学习笔记/PHP源码/php-src/Zend/zend_language_parser.y:1317:5: note: did you mean "stpcpy"? /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h:130:7: note: "stpcpy" declared here char *stpcpy(char *__dst, const char *__src); ^ /Users/dre0m1/CTF/学习笔记/PHP源码/php-src/Zend/zend_language_parser.y:1324:29: error: implicit declaration of function "yystrlen" is invalid in C99 [-Werror,-Wimplicit-function-declaration] yystr_len = (unsigned int)yystrlen(yystr); ^ /Users/dre0m1/CTF/学习笔记/PHP源码/php-src/Zend/zend_language_parser.y:1324:29: note: did you mean "strlen"? /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h:82:9: note: "strlen" declared here size_t strlen(const char *__s); ^ /Users/dre0m1/CTF/学习笔记/PHP源码/php-src/Zend/zend_language_parser.y:1345:4: error: implicit declaration of function "yystpcpy" is invalid in C99 [-Werror,-Wimplicit-function-declaration] yystpcpy(yyres, buffer); ^ /Users/dre0m1/CTF/学习笔记/PHP源码/php-src/Zend/zend_language_parser.y:1352:10: error: implicit declaration of function "yystrlen" is invalid in C99 [-Werror,-Wimplicit-function-declaration] return yystrlen(yystr) - (*yystr == """ ? 2 : 0); ^ /Users/dre0m1/CTF/学习笔记/PHP源码/php-src/Zend/zend_language_parser.y:1365:2: error: implicit declaration of function "yystpcpy" is invalid in C99 [-Werror,-Wimplicit-function-declaration] yystpcpy(yyres, yystr); ^ 5 errors generated. make: *** [Zend/zend_language_parser.lo] Error 1
报错内容较多,出现在Zend/zend_language_parser.lo位置。当时查找了好久的资料,都没有找到相关的内容。只知道implicit declaration of function "yystrlen" is invalid in C99
这种报错类型是因为缺少相应的定义,由报错中的提示可以看出应该是缺少了yystpcpy这个函数。
访问文件php-src/Zend/zend_language_parser.c,可以看到这样一段代码
格式和yystpcpy
还有yystrlen
异常的统一,我当时就怀疑应该是在这个c文件中进行了函数重命名。
代码中出现yystpcpy
函数的位置一共有三处:
if (yyres) {yystpcpy(yyres, "end of file");}return sizeof("end of file")-1;}yystpcpy(yyres, buffer);yystpcpy(yyres, yystr);
看样子应该就是stpcpy
函数没错了,试着在上面的#define处加入yystpcpy
与yystrlen
的定义:
#define yystpcpy zendstpcpy#define yystrlen zenddtrlen
依旧报错,这边是我没动脑子了,光想着和上面的define内容结构统一,但是strlen和stpcpy这两个函数前面其实是不需要zend前缀的。
修改之后重新编译,make成功。
vscode调试
用vscode打开PHP源码,增加一个调试的配置:
选择环境c++(GDB/LLDB)-> Default Configuration,然后会生成一个配置文件:
{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "debuug php source", "type": "cppdbg", "request": "launch", "program": "/Users/dre0m1/CTF/学习笔记/PHP源码/source/bin/php", "args": ["-f","/Users/dre0m1/CTF/学习笔记/PHP源码/1.php"], "stopAtEntry": true, "cwd": "${fileDirname}", "environment": [], "externalConsole": false, "MIMode": "lldb" } ]}
参数详解:
- program 可执行的PHP文件的路径(编译生成的php文件)
- args 传给php的参数列表,像我上面所填写的执行的就是
php -f /Users/dre0m1/CTF/学习笔记/PHP源码/1.php
- cwd 当前目录,如果调试web应用,可以改成web根目录的路径
- stopAtEntry 是否在main函数的时候断下
之后就可以正常调试了。
当前关注:使用vscode调试PHP底层C源码
特斯拉降价后:门店半小时售10台 老车主直呼被损失4万
焦点速读:特斯拉降价引海外热议:这是《孙子兵法》!欲消灭传统车企
你拿多少?报告称2022年终奖人均2.19万元 一线城市近3万元
环球今日讯!果香浓郁!徐福记DODO综合果味棒棒糖 60支19.9元
【世界速看料】保护隐私!微信键盘iOS 1.0.2版更新:体积膨胀到237MB
全球观天下!联想GeekPro 2023主机首销6199元起:13代i5+RTX 3060
【天天快播报】春节前最后一次成品油调价来了!或迎2023年首次降价
关注:畅想未来:2023年手机还能怎样进化?
对话郑刚:与罗永浩分歧关键不是商业利益
最野性的福特SUV!探险者Timberline亮相:超帅黑橙配色
33.58万起!比亚迪腾势D9成交付最快破万高端MPV
天天通讯!《魔兽世界》国服关闭倒计时!网易向玩家发短信安利《逆水寒》
从超前点映到480P投屏 视频平台赚钱只能靠“割韭菜”?
环球快消息!程序猿创造的AI虚拟漂亮老婆 被真女友强制“安乐死”了
天天热议:液金+水冷压住RTX 40系显卡:机械革命晒新旷世笔记本散热系统
特斯拉海外大降价!老外车主气炸请求维权:免费送FSD
环球关注:4K缩水到480p 爱奇艺称“有权变更内容” 律师回应称肯定违约了
环球讯息:《流浪地球2》发行通知公开:片长173分钟对标《阿凡达2》
时讯:网友铁了心要等一加11 Pro 李杰:没有11 Pro、11 Ultra
遭黑客广泛利用:微软无奈计划淘汰诊断工具MSDT
你涨工资没?全国招聘平均月薪增幅最高城市 最低1.2万、还在加薪
世界微速讯:曾两个月涨粉上千万!张同学回应热度消退:可以坦然面对
视点!小米6钉子户换上Redmi K50至尊版:速度就是快
马斯克突然调整Twitter API:第三方客户端全灭
不再是小仪表盘 新款比亚迪秦PLUS DM-i曝光:续航猛增至1310km
热点聚焦:燃油版“宏光MINIEV”!三菱Delica Mini首发:配0.66L发动机
【环球快播报】“蓝兔”邮票黄永玉有多潇洒?北京第一辆私家车拥有者 93岁开法拉利飙车
每日信息:三星将长焦发挥到极致!曝Galaxy S24 Ultra支持150倍变焦
快资讯:iPhone 14兔年限量保护套售价398元贵吗?部分型号卖断货
TP-LINK发布新款AX3000双频千兆Wi-Fi 6光口AP:支持DC、PoE双供电
世界微速讯:长白山人参旗舰店:全须生晒参4盒99元狂促(300元大额券)
播报:联想拯救者刃7000K 2023今日开售:i5-13400F+RTX3060 首发7199元
焦点热议:豆瓣9.5高分国漫!《中国奇谭》第二季已在筹备:要打造IP宇宙
最新快讯!二十六位朗读主播!讯飞有声书图赏
当前热讯:“1888万彩礼”事件作者承认编故事 知乎:永久封禁账号
热资讯!奇葩公司发大鹅当年货 员工开心又无奈:放公司很吵
天天微速讯:故意排放能怎样?日本决定核废水2023春夏排入海 多国网友愤怒
2022年动力电池装车量排名:“宁迪”双王吃下超7成市场
每日关注!73岁保安徒手接住4楼坠落女子获奖 网友:见义勇为、值得点赞
HarmonyOS智能座舱是怎样炼成的?华为官方揭秘软件开发标准
全球讯息:大手笔!蔚来官宣:春节高速路换电全免费、不限次数
今日最新!(六)elasticsearch 源码之选主流程分析
环球今日讯!java中关于继承,多态及方法调用的底层细节
如何构建基于 DDD 领域驱动的微服务?
世界新资讯:火山引擎 DataTester:一次 A/B 测试,帮助产品分享率提升超 20%
珠江的源头在哪里?珠江的长度是多少千米?
当前热文:被称作“电费刺客” 商家:踢脚线取暖器耗电量可达空调3倍
蜀国的皇帝有哪些?蜀国的皇帝列表排名
当前视点!明晚8点开播!央视网络春晚第二波阵容官宣:王心凌、撒贝宁等加盟
魔兽国服关闭当天 老外喜迎新版本升级 网友:暴雪杀人诛心
豆瓣9.2分神作!《新·福音战士剧场版:终》终于官宣引进
天天时讯:2023年电脑城奸商依然猖狂:3千元笔记本卖5千 出库不能退
为黛西小姐开车故事背景是什么?为黛西小姐开车故事梗概是什么?
打电动是什么意思?打电动是什么游戏?
特百惠是哪国的牌子?特百惠卖什么产品?
电视机顶盒怎么连接电视机?电视机顶盒怎么破解?
怎么给冰箱加氟?冰箱加氟一般需要多少钱?
excel怎么转化为在线表格?excel怎么转化为PDF?
lol怎么亮徽章?lol徽章有什么用?
斗鱼鱼丸多少钱一个?斗鱼鱼丸怎么兑换人民币?
用SGDK开发世嘉MD游戏:入门篇
快资讯:FAA飞航系统已有30年历史 老迈程度堪比N64
环球百事通!90后女孩神还原蔡明春晚40年造型火了 本尊回应5个字
焦点观察:果粉愿望要实现!iPhone 16 Pro直接256GB存储起步
环球快消息!12月轿车销量排名出炉:传统“豪强”反攻、比亚迪也挡不住?
世界观点:超大范围降雪来袭:全国多地上百条高速局部路段公路封闭
最新:误将磁盘格式化的应急响应
头条:【Python爬虫项目实战】Python爬虫豆瓣Top250电影短评数据保存本地
2023最新nacos的windows 10安装(保姆级)
滚动:我国让科幻片成了现实!全球首艘智能型无人系统科考母船交付使用
世界热点评!6英寸墨水屏带来全新听书体验!讯飞有声书评测:内置26种朗读主播 方言英语都能读
全球观速讯丨微软经典Media Player获新生:新版本面向全部Win10用户推出
焦点快看:读编程与类型系统笔记06_函数类型的高级应用
全球热消息:NVIDIA发布GeForce 527.37驱动 4倍性能提升的DLSS3游戏再加一
焦点播报:苹果A处理器不玩性能!iPhone 16曝光:屏幕更完美、2TB售价欲超2万
环球信息:美国家庭平均月薪出炉引热议:超出想象!就这还靠信用卡续命
你贡献过几部iPhone?全球最强打工人:苹果库克年薪近1亿美元 自愿降薪40%
每日速递:监管新规下车险保费最高可降23%?业内人士:有些还会变贵
天天即时看!打破多项纪录!我国汽车产销总量连续14年全球第一:新能源暴涨翻倍
《王者荣耀》兔年春节福利一览:武则天神器传说皮肤来了
我国第一型“金牌火箭” 长二丙火箭成功发射亚太6E卫星
全球动态:[概率论与数理统计]笔记:3.5 大数定律与中心极限定理
环球滚动:Spring Cloud Alibaba 2022.0.0.0 版本发布啦!
国产高端手机份额第一!卢伟冰:小米13系列好评99% 自然销量高
【天天快播报】史上第一颗6GHz CPU!i9-13900KS发布:性能涨3% 价格涨20%
理想汽车CEO曾试图接触威马沈晖?本人回应:纯属放屁!
世界新资讯:韩国第一个月球探测器发回第一张照片:地月黑白合影
每日资讯:【深度学习】常用PyTorch CUDA版本whl下载及在线安装命令
世界今日讯!「闲话随笔」势能分析法
全球短讯!MQ——如何选择消息队列
微头条丨女子乘火车遇麻将专列生意火爆 还能K歌引围观:网友直呼想买站票
全球观焦点:三级应急响应启动!寒潮预警升级 降温图又变紫了:局地降超20度
天天观天下!盖茨自曝他的主力机是三星Galaxy Z Fold4:李在镕送的
全球热文:《卧龙:苍天陨落》中配预告 声优大佬云集、虎牢关战吕布超燃
学习笔记——Mybatis中缓存机制
播报:区块链特辑——solidity语言基础(五)
热文:Python实现希尔排序、快速排序、归并排序
苹果兔年新春大片《过五关》发布!iPhone 14 Pro拍摄国粹京剧
天天看点:Matplotlib学习笔记1 - 上手制作一些图表吧!