Xdebug 如何知道 IDE 中的断点?

How does Xdebug know about breakpoints in an IDE?

我是 Xdebug 的坚定支持者并且喜欢 PhpStorm。我为本地环境使用过许多不同的设置,每次配置似乎都有些不同。

我当前的环境是本地计算机上的 docker 容器 运行。我知道 PhpStorm 正在监听 0.0.0.0,又名 - 所有网络接口,并在指定端口上(我正在使用 9004)。我还看到我可以从托管 Xdebug 的 docker 容器 ping 我的本地计算机。

我不明白的是:当我在 PhpStorm 中放置一个断点时,Xdebug 如何知道它存在,以便当它遇到该行时它应该告诉 PhpStorm 停止?

当 Xdebug 第一次连接到 IDE 时,IDE 发送它希望 Xdebug 中断 PHP 的断点列表。如果您查看日志文件(使用 xdebug.log=/tmp/xdebug.log 创建),那么您将看到正在发送的命令以 breakpoint_set 开头。然后有一个类型 (-t),通常 line 用于 file/line 断点,以及文件名和行号。

当 PHP 运行代码时,Xdebug 拦截执行,当它看到匹配的 filename/line 数字组合时,它暂停执行并进入命令模式,以便 IDE可以发送命令来检查当前范围(通过发送 content_get)以及有关变量的更多信息(通过 property_get)。然后,当您单击“继续”或“越过”时,IDE 会向 Xdebug 发送命令以执行等效操作。

要查看协议的完整说明,请阅读 DBGp protocol specification