7

我已经为 Mac OS(Apache 2.2.22、PHP 5.3.15)设置了 XDebug(2.2.1)和 PHPStorm-IDE(Mac OS X 10.7.5)以及标准 LAMP 堆栈。

/etc/php.ini

[xdebug]
zend_extension=/usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so
xdebug.file_link_format="txmt://open?url=file://%f&line=%1"
xdebug.remote_enable = On
xdebug.remote_autostart = "PHPSTORM"
xdebug.var_display_max_data = 1024
xdebug.dump.GET=*
xdebug.dump.POST=*
xdebug.show_local_vars=On
xdebug.dump.SERVER=*
xdebug.dump_globals=On
xdebug.collect_params=4

我遵循了这两个教程,它适用于我 99% 的项目文件:

我使用 Zend Frameworks MVC 架构。我可以在大多数控制器类中的断点处停止,但在其他一些控制器中,PHPStorm 会忽略我所有的断点。

你有什么建议吗?如何调试调试器?什么样的配置错误会导致这种情况?

谢谢你的帮助。

4

5 回答 5

11

这几乎必须是 phpstorm 中路径映射错误的结果。您可以在 Settings->PHP->Servers 中配置路径。我遇到了类似的问题,我所要做的就是在 phpstorm 中我的代码根的映射中在服务器(运行 xdebug 的地方)上设置正确的绝对路径。例如c:\my\code\lives\here\on\my\dev\box=> /myserver/my/code/lives/here/on/my/actual/server

这是一个更完整的解决方案,以及一般调试 XDebug 的一些技巧:

  1. 将远程日志文件添加到您的 xdebug 设置中: xdebug.remote_log = /path/to/logs/xdebug.log

  2. 重启阿帕奇

  3. 跟踪日志(我假设您可以在 OSX 中执行此操作) tail -f /path/to/logs/xdebug.log

-- 下次尝试调试页面时,通过跟踪日志内容,您可能会发现明显错误。如果是这样,只需做任何你需要做的事情。如果不是,我们仍然假设它是路径的错误映射并继续尝试修复它:--

  1. 在您知道 PHPStorm/XDebug 将实际停止并使其停止的地方设置一个断点。在网络上的很多地方,人们报告 index.php 是让 PHPStorm 第一次真正停止在断点处的最简单的地方。

  2. 在您无法让 PHPStorm/XDebug 停止的文件中,设置和取消设置断点,同时 PHPStorm 在 index.php 文件中的断点处停止。您应该在 xdebug 日志文件中看到如下所示的行:

<- breakpoint_set -i 19 -t line -f file:///myserver/my/code/lives/here/on/my/actual/server/file.php -n 159 ->

  1. 查看文件是否确实存在于 XDebug 正在寻找它的位置,例如

tail /myserver/my/code/lives/here/on/my/actual/server/file.php

  1. 如果文件实际上并不存在,请调整 PHPStorm 设置中的路径映射,直到 PHPStorm 告诉 XDebug 查看实际存在的文件。例如,如果 XDebug 说过file=/mysrver/my/code/lives/here/on/my/actual/server/file.php,那么在第 6 步中您会注意到该文件在服务器上不存在,然后您可能会意识到“哦,哎呀,我在路径映射中拼写 myserver 错误”,然后在 PHPStorm 中修复拼写可能会解决问题。

这是一个旧线程,但希望这最终会帮助某人:)

于 2014-03-07T01:18:09.293 回答
6

好的,我遇到了同样的问题,并在 PHPStorm 错误跟踪以及他们的开发论坛中进行了挖掘。

事实证明,您需要确保断点不起作用的文件的路径与 MAC 上的路径完全相同(小写/大写)。我刚刚从 Windows 迁移了一个项目,该项目在驱动器上混合了大写/小写文件夹和文件名,以及 require_once 指令中的不同大小写。

一旦我确定 require_once 中的路径与磁盘上的大小写匹配,我的断点就会再次开始工作!

见这里http://devnet.jetbrains.com/message/5488439

于 2013-09-28T23:49:55.267 回答
0

这也发生在我身上好几次。通常调试器的配置是原因。您必须在“运行 > 编辑配置”下正确设置调试服务器的路径映射。

于 2014-01-31T08:50:43.537 回答
0

这通常意味着不调用控制器。如果它确实适用于某些控制器(在同一个项目中),它只是意味着:代码不会被调用。

因此,请执行几个步骤以查看调用了正确的控制器。(例如,从调度开始,然后潜入直到控制器被加载)。

您是否可以远程工作(例如从本地到另一台服务器)。将代码放在服务器上可能需要一些时间。只需等待几秒钟,然后再试一次。既然它怎么能在它不知道的点上突破呢?

希望这有助于您开始调试它。

于 2013-08-19T14:06:49.103 回答
0

不在断点处停止的可能原因:

  1. IDE 拒绝来自远程服务器的调试连接请求。为了避免这种情况,电话图标必须是绿色的(运行 -> 开始监听 PHP 调试连接)。
  2. 所有断点都被静音。关闭断点静音。
  3. 未选中特定断点的暂停复选框。在Run -> View Breakpoints中一一检查它们。打勾的意思是“暂停执行”,而不是人们可能认为的“暂停断点”。(我使用的当前版本的 PHPStorm 似乎有问题,如果我选中Suspend复选框,那么它还没有生效。我必须单击另一个断点,然后单击返回以“提交”选中复选框。)
  4. 如果要调试从浏览器调用的脚本,则浏览器应使用 idekey 的值设置一个名为 XDEBUG_SESSION 的 cookie。您可以通过以下方式扩展 URL 来启动它:http://192.168.99.100/?XDEBUG_SESSION_START=PHPStorm。请注意 cookie 的到期时间仅为一小时。有一些有用的浏览器插件可以轻松处理调试器 cookie。有关更多信息,请参阅https://xdebug.org/docs/remote#starting
  5. 单个断点未启用在Run -> View Breakpoints中一一检查它们。
  6. 单个断点有一些不满足的条件。检查Run -> View Breakpoints中断点的Condition设置。
  7. 远程服务器和 IDE 之间存在一些映射问题。当您在 IDE 中设置断点时,它会向远程服务器发送执行应在 F 文件的第 N 行停止的信息。您的本地文件和远程服务器上的文件之间存在映射。映射在 IDE 中的以下位置定义:
  • Preferences -> Languages & Frameworks -> PHP页面的路径映射字段上
  • 首选项 -> 语言和框架 -> PHP -> 服务器页面上

如果这些映射不正确,例如本地的F1.php不小心映射到了远程的F2.php,那么你可能会遇到问题。如果您在本地文件F1.php的第 #N 行设置断点,则只有在执行到达文件F2.php的第 #N 行(而不是F1.php的行)时,服务器才会停止执行。如果这是问题所在,那么如果您打开Run -> Break at first line in PHP scripts标志,您仍然可以调试代码。请注意开发操作系统的目录和文件名与远程服务器的不同区分大小写!

  1. 由于某些网络设置问题,IDE 未从远程服务器接收调试连接请求。检查Preferences -> Languages & Frameworks -> PHP -> Debug页面是否 IDE 正在为 XDebug 监听端口 9000,检查它是否可以接受外部连接,等等。
  2. 远程服务器的 XDEBUG 相关设置不正确。我在 php.ini 中使用以下设置

.

xdebug.default_enable = 1
xdebug.remote_enable = 1
xdebug.remote_connect_back = 0
xdebug.idekey = "PHPStorm"
xdebug.remote_autostart = 1
xdebug.remote_host=192.168.1.26

您应该将remote_host设置为您的开发计算机的 IP 地址,或者如果您的服务器位于localhost上,则可以省略整行。

另外,我设置了以下环境变量:

export PHP_IDE_CONFIG="serverName=halmaiXdebug"
export XDEBUG_CONFIG="idekey=PHPStorm"

其中serverName的值是我在 IDE的Preferences -> Languages & Frameworks -> PHP -> Servers页面上定义的服务器名称。

更新:太旧的 PhpStorm 版本也可能导致断点问题。使用服务器上的 PHP 7.4 和本地的 PhpStorm 2018.2,执行在第一条指令处停止,但在任何其他指令处都没有。升级到较新的 PhpStorm 版本 (2020.1) 后,它可以按预期工作。

于 2017-03-09T02:58:48.977 回答