我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PHPStorm+Xdebug进行emote Debug时无法进入断点问题排查

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PHPStorm+Xdebug进行emote Debug时无法进入断点问题排查

最近一直在研究Xdebug的用法,主要是因为Xdebug对PHP的开发效率提升确实很大,而却能帮我们解决很多问题。所以这里就总结下我在配置PHPStorm+Xdebug环境中遇到的坑,给遇到进不去断点的朋友一些排查的建议。

运行环境

  • PHP Version 7.1.22
  • Xdebug v2.6.0
  • PHP2016.2;
  • 操作系统:MacOS 10.12.3

如果遇到无法进入断点的问题,可以按照以下的步骤进行排查

确认运行Web程序的PHP安装了Xdebug扩展

PHP永久了,难免会在电脑上多装几个版本。这个时候就必须注意,你是否将Xdebug安装到了你需要调试的PHP版本中,而且要注意,命令行运行的php,不一定是Web程序运行的PHP。例如你安装了PHP的5.6和7.1两个版本,命令行跑的是5.6,但fpm跑的是7.1。这时如果你给5.6安装Xdebug,你运行php -m | grep xdebug确实可以看到Xdebug扩展,但是如果想调试7.1运行的Web程序,当然是不可能的。所以这里最关键一点,就是:

在Web程序中输出phpinfo();exit; ,来确认运行fpm的php中是否安装了Xdubug扩展。

确认Xdebug扩展的版本与PHP版本匹配

如果你安装了Xdebug,但是版本与PHP不匹配,也是没办法正常工作的。如何正确的选择PHP对应的Xdebug版本。

确认Xdebug配置了有效的参数

在PHPStorm中调试不同的PHP程序,需要配置不同的Xdebug参数。在Remote Debug模式下:

必须要设置的参数有:

  • remote_enable=1 开启远程调试,不开启这个参数的话,自然无法Remote Debug;
  • remote_host=127.0.0.1(本机情况) or remote_connect_back=1,由于这两个配置项有紧密联系,所以放在一起讲。 首先,如果你指针对单个调试用户,比如就你自己调试,你可以将remote_host设成你的Web程序运行的ip(比如本机,就设置为127.0.0.1),remote_connect_back的值不设置或者设置为0(你不设置默认也是0)。这样Xdebug每次调试的时候会固定连接remote_host指定的ip;但是如果你支持的是多人调试,明显设置一个remote_host是没办法的。这个时候就可以用remote_connect_back=1来设置。当remote_connect_back设置为1的时候,xdebug会根据请求来的ip自动回连,进行调试,从而支持多人调试。同时,这个值设为1的话会使remote_host的设置无效;一般情况下,推荐使用remote_connect_back=1的配置
  • remote_port=9001 PHP进程与DebugClient通信的端口号,必须要设置与PHPStorm中的一致,否则无法正常通信;
  • idekey=PHPSTORM 可以理解为通信用到的口令,必须要设置与PHPStorm中的一致;

推荐设置的参数:

remote_autostart=1
默认状态下,触发调试需要在url中增加get参数:XDEBUG_SESSION_START= {xdebug.idekey},如果想自动启动调试,即不加这个参数也能自动触发调试,可以将这个值设为1,所以推荐将这个值设为1;

确认PHPStorm监听的端口是Xdebug中配置的端口

一定要在此确认Xdebug中配置的remote_port(最好使用打印出phpinfo来查看)和PHPStorm中配置的一致,否则无法进入调试。

确认PHPStorm中的debugclient顺利启动

在PHPStorm的工具栏中启动了Remote Debug之后,需要检查是否顺利启动了DebugClient进程。这个进程就是PHPStorm启动来进行调试的,所以只需要查看PHPStorm是否监听了我们设置的端口(remote_port)就可以了。例如我指定的端口是9001,那么在Mac上可以通过lsof -i tcp:9001命令查看:

确认PHPStorm中的IDEKey和Xdebug中配置的一致

一定要确认PHPStorm中配置的IDEKey和Xdebug中配置的idekey是一样的,否则无法进入调试。

代码部署在远程,需要开启目录映射

如果你是调试远程的Web程序(即代码不是部署在本机),必须要设置目录映射,否则找不到代码所在,是无法调试的。设置的方法如下图:

确认PHPStorm和Xdebug+PHP的版本匹配

使用Xdebug调试,是PHP进程通过Xdebug扩展和PHPStorm的debugclient通信的过程,所以必须这三方在版本上兼容才可以。有的时候碰到一些奇葩的问题,比如我就碰到过可以进入断点,但是无法单步调试(点击下一步调试进程就卡死)的情况。这种情况很有可能是PHPStorm的版本和Xdebug+PHP的版本不兼容。比如我碰到的这个问题就是因为我用了最新版本的Xdebug2.7,但是使用的PHPStorm却是2017.2的版本,而我将xdebug降到2.6之后就可以正常调试了。所以,最好保证PHPStorm、Xdebug和PHP的版本协调一致。

总结

如果按照上面说的还是不行,那么就需要查看remote_log,来看下问题到底出在哪了。
这个时候需要在xdebug的配置中增加:xdebug.remote_log=/tmp/xdebug.log来打开remote_log。
配置完成之后,重新启动fpm,查看phpinfo,确认remote_log生效之后(默认是不启动remote_log的)之后,调试的时候就可以tail -f /tmp/xdebug.log来查看日志了。举个例子,我故意将remote_port设置为一个不存在的9999端口,然后查看remote_log的报错信息:

从日志中看出,Xdebug尝试去连接127.0.0.1的9999端口,但是失败了。这样,我们就能看出到底问题出在哪里,当我们是在找不到配置的问题时,可以借助日志,再结合google、百度,看看能否找到问题的所在。

以上就是PHPStorm+Xdebug进行emote Debug时无法进入断点问题排查的详细内容,更多关于PHP断点排查的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PHPStorm+Xdebug进行emote Debug时无法进入断点问题排查

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录