在VSCode中使用Docker调试PHP [英] Debug PHP using Docker in VSCode
问题描述
看起来一切正常,但是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屋!