在VSCode中使用Docker调试PHP [英] Debug PHP using Docker in VSCode

查看:621
本文介绍了在VSCode中使用Docker调试PHP的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

看起来一切正常,但是VSCode不会停止调试。我有一个运行PHP映像的Docker容器。

It looks like everything is OK, but VSCode does not stop debugging. I have a docker container running a PHP image.

我需要做些什么才能在断点处停止?

What I need to do to stop in the break points?

我看不到日志中的错误,相反,似乎他们是在说断点配置正确,代码正确运行。

I can't see errors in the log, quite the contrary, it seems that they are saying that the break points were well configured, and that the code ran correctly.


  • 容器的IP地址为 172.22.0.2 ,我的主机的IP地址为 172.22.0.1

  • 文件 xdebugo.so 存在于容器内:
    / usr / local / lib / php / extensions / no-debug-non-zts-20190902 / xdebug.so

  • 已设置主机 host.docker.internal 正确地。

  • 我使用以下命令构建了映像: docker build -t phpdebug:5。

  • The正在运行的容器中存在文件 /usr/local/etc/php/conf.d/xdebug.ini

  • The container has the IP 172.22.0.2, my host has the IP 172.22.0.1
  • The file xdebugo.so exists inside the container: /usr/local/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so
  • The host host.docker.internal was set up correctly.
  • I built my image using: docker build -t phpdebug:5 .
  • The file /usr/local/etc/php/conf.d/xdebug.ini exists in the running container.

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "log": true,
            "externalConsole": false,
            "pathMappings": {
                "/": "${workspaceRoot}/"
            }
        }
    ]
}

docker- compose.yml

version: '2'

services:
  app:
    restart: 'no'
    image: phpdebug:5
    command: php -S 0.0.0.0:8000
    ports:
      - "8000:8000"
    volumes:
      - phpdata:/app
    environment:
      PHP_EXTENSION_XDEBUG: 1

volumes:
  phpdata:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/home/element/php/tuto'

/usr/local/etc/php/conf.d/xdebug.ini

zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so"
xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_connect_back=0
xdebug.remote_host=host.docker.internal
xdebug.idekey=VSCODE
xdebug.remote_autostart=1
xdebug.remote_log=/usr/local/etc/php/xdebug.log

/ etc / hosts

127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.22.0.2  d484e93eed2a
172.22.0.1      host.docker.internal

Dockerfile:

FROM php

RUN pecl install xdebug

RUN ip -4 route list match 0/0 | awk '{print $3 "host.docker.internal"}' >> /etc/hosts

COPY custom.ini /usr/local/etc/php/conf.d/xdebug.ini

/usr/local/etc/php/xdebug.log

[1] Log opened at 2020-02-25 03:31:45
[1] I: Connecting to configured address/port: host.docker.internal:9000.
[1] I: Connected to client. :-)
[1] -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" fileuri="file:///app/index.php" language="PHP" xdebug:language_version="7.4.3" protocol_version="1.0" appid="1" idekey="VSCODE"><engine version="2.9.2"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[https://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2020 by Derick Rethans]]></copyright></init>

[1] <- breakpoint_list -i 1
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_list" transaction_id="1"></response>

[1] <- breakpoint_list -i 2
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_list" transaction_id="2"></response>

[1] <- breakpoint_set -i 3 -t line -f file:///home/element/php/tuto/dies.php -n 2
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="3" id="10001"></response>

[1] <- breakpoint_set -i 4 -t line -f file:///home/element/php/tuto/dies.php -n 10
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="4" id="10002"></response>

[1] <- breakpoint_set -i 5 -t line -f file:///home/element/php/tuto/result.php -n 4
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="5" id="10003"></response>

[1] <- breakpoint_list -i 6
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_list" transaction_id="6"><breakpoint type="line" filename="file:///home/element/php/tuto/dies.php" lineno="2" state="enabled" hit_count="0" hit_value="0" id="10001"></breakpoint><breakpoint type="line" filename="file:///home/element/php/tuto/dies.php" lineno="10" state="enabled" hit_count="0" hit_value="0" id="10002"></breakpoint><breakpoint type="line" filename="file:///home/element/php/tuto/result.php" lineno="4" state="enabled" hit_count="0" hit_value="0" id="10003"></breakpoint></response>

[1] <- breakpoint_list -i 7
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_list" transaction_id="7"><breakpoint type="line" filename="file:///home/element/php/tuto/dies.php" lineno="2" state="enabled" hit_count="0" hit_value="0" id="10001"></breakpoint><breakpoint type="line" filename="file:///home/element/php/tuto/dies.php" lineno="10" state="enabled" hit_count="0" hit_value="0" id="10002"></breakpoint><breakpoint type="line" filename="file:///home/element/php/tuto/result.php" lineno="4" state="enabled" hit_count="0" hit_value="0" id="10003"></breakpoint></response>

[1] <- breakpoint_set -i 8 -t exception -x *
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="8" id="10004"></response>

[1] <- run -i 9
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="run" transaction_id="9" status="stopping" reason="ok"></response>

[1] <- stop -i 10
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="stop" transaction_id="10" status="stopped" reason="ok"></response>

[1] Log closed at 2020-02-25 03:31:45

[1] Log opened at 2020-02-25 03:31:48
[1] I: Connecting to configured address/port: host.docker.internal:9000.
[1] I: Connected to client. :-)
[1] -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" fileuri="file:///app/dies.php" language="PHP" xdebug:language_version="7.4.3" protocol_version="1.0" appid="1" idekey="VSCODE"><engine version="2.9.2"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[https://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2020 by Derick Rethans]]></copyright></init>

[1] <- breakpoint_list -i 1
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_list" transaction_id="1"></response>

[1] <- breakpoint_list -i 2
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_list" transaction_id="2"></response>

[1] <- breakpoint_set -i 3 -t line -f file:///home/element/php/tuto/dies.php -n 2
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="3" id="10005"></response>

[1] <- breakpoint_set -i 4 -t line -f file:///home/element/php/tuto/dies.php -n 10
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="4" id="10006"></response>

[1] <- breakpoint_set -i 5 -t line -f file:///home/element/php/tuto/result.php -n 4
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="5" id="10007"></response>

[1] <- breakpoint_list -i 6
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_list" transaction_id="6"><breakpoint type="line" filename="file:///home/element/php/tuto/dies.php" lineno="2" state="enabled" hit_count="0" hit_value="0" id="10005"></breakpoint><breakpoint type="line" filename="file:///home/element/php/tuto/dies.php" lineno="10" state="enabled" hit_count="0" hit_value="0" id="10006"></breakpoint><breakpoint type="line" filename="file:///home/element/php/tuto/result.php" lineno="4" state="enabled" hit_count="0" hit_value="0" id="10007"></breakpoint></response>

[1] <- breakpoint_list -i 7
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_list" transaction_id="7"><breakpoint type="line" filename="file:///home/element/php/tuto/dies.php" lineno="2" state="enabled" hit_count="0" hit_value="0" id="10005"></breakpoint><breakpoint type="line" filename="file:///home/element/php/tuto/dies.php" lineno="10" state="enabled" hit_count="0" hit_value="0" id="10006"></breakpoint><breakpoint type="line" filename="file:///home/element/php/tuto/result.php" lineno="4" state="enabled" hit_count="0" hit_value="0" id="10007"></breakpoint></response>

[1] <- breakpoint_set -i 8 -t exception -x *
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="8" id="10008"></response>

[1] <- run -i 9
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="run" transaction_id="9" status="stopping" reason="ok"></response>

[1] <- stop -i 10
[1] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="stop" transaction_id="10" status="stopped" reason="ok"></response>

[1] Log closed at 2020-02-25 03:31:48

vscode中的调试控制台:

<- launchResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 2,
  command: 'launch',
  success: true
}
new connection 1
<- threadEvent
ThreadEvent {
  seq: 0,
  type: 'event',
  event: 'thread',
  body: { reason: 'started', threadId: 1 }
}
<- initializedEvent
InitializedEvent { seq: 0, type: 'event', event: 'initialized' }
-> setBreakpointsRequest
{
  command: 'setBreakpoints',
  arguments: {
    source: { name: 'dies.php', path: '/home/element/php/tuto/dies.php' },
    lines: [ 2, 10 ],
    breakpoints: [ { line: 2 }, { line: 10 } ],
    sourceModified: false
  },
  type: 'request',
  seq: 3
}
-> setBreakpointsRequest
{
  command: 'setBreakpoints',
  arguments: {
    source: { name: 'result.php', path: '/home/element/php/tuto/result.php' },
    lines: [ 4 ],
    breakpoints: [ { line: 4 } ],
    sourceModified: false
  },
  type: 'request',
  seq: 4
}
<- setBreakpointsResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 3,
  command: 'setBreakpoints',
  success: true,
  body: {
    breakpoints: [ { verified: true, line: 2 }, { verified: true, line: 10 } ]
  }
}
<- setBreakpointsResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 4,
  command: 'setBreakpoints',
  success: true,
  body: { breakpoints: [ { verified: true, line: 4 } ] }
}
-> setFunctionBreakpointsRequest
{
  command: 'setFunctionBreakpoints',
  arguments: { breakpoints: [] },
  type: 'request',
  seq: 5
}
<- setFunctionBreakpointsResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 5,
  command: 'setFunctionBreakpoints',
  success: true,
  body: { breakpoints: [] }
}
-> setExceptionBreakpointsRequest
{
  command: 'setExceptionBreakpoints',
  arguments: { filters: [ '*' ] },
  type: 'request',
  seq: 6
}
<- setExceptionBreakpointsResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 6,
  command: 'setExceptionBreakpoints',
  success: true
}
-> configurationDoneRequest
{ command: 'configurationDone', type: 'request', seq: 7 }
<- configurationDoneResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 7,
  command: 'configurationDone',
  success: true
}
<- threadEvent
ThreadEvent {
  seq: 0,
  type: 'event',
  event: 'thread',
  body: { reason: 'exited', threadId: 1 }
}
-> threadsRequest
{ command: 'threads', type: 'request', seq: 8 }
<- threadsResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 8,
  command: 'threads',
  success: true,
  body: { threads: [] }
}
-> threadsRequest
{ command: 'threads', type: 'request', seq: 9 }
<- threadsResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 9,
  command: 'threads',
  success: true,
  body: { threads: [] }
}
new connection 2
<- threadEvent
ThreadEvent {
  seq: 0,
  type: 'event',
  event: 'thread',
  body: { reason: 'started', threadId: 2 }
}
<- initializedEvent
InitializedEvent { seq: 0, type: 'event', event: 'initialized' }
-> setBreakpointsRequest
{
  command: 'setBreakpoints',
  arguments: {
    source: { name: 'dies.php', path: '/home/element/php/tuto/dies.php' },
    lines: [ 2, 10 ],
    breakpoints: [ { line: 2 }, { line: 10 } ],
    sourceModified: false
  },
  type: 'request',
  seq: 10
}
-> setBreakpointsRequest
{
  command: 'setBreakpoints',
  arguments: {
    source: { name: 'result.php', path: '/home/element/php/tuto/result.php' },
    lines: [ 4 ],
    breakpoints: [ { line: 4 } ],
    sourceModified: false
  },
  type: 'request',
  seq: 11
}
<- setBreakpointsResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 10,
  command: 'setBreakpoints',
  success: true,
  body: {
    breakpoints: [ { verified: true, line: 2 }, { verified: true, line: 10 } ]
  }
}
<- setBreakpointsResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 11,
  command: 'setBreakpoints',
  success: true,
  body: { breakpoints: [ { verified: true, line: 4 } ] }
}
-> setFunctionBreakpointsRequest
{
  command: 'setFunctionBreakpoints',
  arguments: { breakpoints: [] },
  type: 'request',
  seq: 12
}
<- setFunctionBreakpointsResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 12,
  command: 'setFunctionBreakpoints',
  success: true,
  body: { breakpoints: [] }
}
-> setExceptionBreakpointsRequest
{
  command: 'setExceptionBreakpoints',
  arguments: { filters: [ '*' ] },
  type: 'request',
  seq: 13
}
<- setExceptionBreakpointsResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 13,
  command: 'setExceptionBreakpoints',
  success: true
}
-> configurationDoneRequest
{ command: 'configurationDone', type: 'request', seq: 14 }
<- configurationDoneResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 14,
  command: 'configurationDone',
  success: true
}
<- threadEvent
ThreadEvent {
  seq: 0,
  type: 'event',
  event: 'thread',
  body: { reason: 'exited', threadId: 2 }
}
-> threadsRequest
{ command: 'threads', type: 'request', seq: 15 }
<- threadsResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 15,
  command: 'threads',
  success: true,
  body: { threads: [] }
}
-> threadsRequest
{ command: 'threads', type: 'request', seq: 16 }
<- threadsResponse
Response {
  seq: 0,
  type: 'response',
  request_seq: 16,
  command: 'threads',
  success: true,
  body: { threads: [] }
}

我在这里尝试了以下答案:

在Docker容器上使用Xdebug作为调试器在VSCode上调试Laravel

I tried the answers here:
Debugging Laravel with VSCode on Docker container using Xdebug as debugger

和此处:

使用VSCode和Docker调试PHP

推荐答案

日志显示在< init 数据包中:

file:///app/index.php

所有断点的配置如下:

file:///home/element/php/tuto/result.php

这表明路径您进行的映射不正确:

This indicates that the path mappings that you have made, are not correct:

"pathMappings": {
    "/": "${workspaceRoot}/"
}

在您的情况下,我认为应该是以下情况:前提是这两个目录都具有 index.php result.php 文件。如果没有,则需要调整第二条路径,使该路径具有 index.php result.php 文件。

In your case, I believe it should be the following, providing that both these directories have an index.php and result.php file. If not, you need to adjust the second path so that is the path that has the index.php and result.php files.

"pathMappings": {
    "/app": "/home/element/php/tuto"
}

这篇关于在VSCode中使用Docker调试PHP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆