#docker #visual-studio-code #xdebug
#docker #visual-studio-code #xdebug
Вопрос:
Я настраиваю Xdebug в настройке Docket’а. Я использую редактор VSCode.
Мое дерево исходных текстов VSCode выглядит следующим образом:
Мой файл Docker выглядит следующим образом:
FROM php:7.3-fpm
WORKDIR /var/www/html
RUN docker-php-ext-install mysqli pdo pdo_mysql amp;amp; docker-php-ext-enable mysqli
RUN apt-get update amp;amp; apt-get install -y iputils-ping amp;amp; apt-get install -y vim
RUN pecl install xdebug
RUN echo 'zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so' | tee /usr/local/etc/php/conf.d/xdebug.ini
amp;amp; echo "xdebug.remote_enable=1" | tee -a /usr/local/etc/php/conf.d/xdebug.ini
amp;amp; echo "xdebug.remote_port=9000" | tee -a /usr/local/etc/php/conf.d/xdebug.ini
amp;amp; echo "xdebug.remote_autostart=1" | tee -a /usr/local/etc/php/conf.d/xdebug.ini
amp;amp; echo "xdebug.remote_connect_back=0" | tee -a /usr/local/etc/php/conf.d/xdebug.ini
amp;amp; echo "xdebug.idekey=VSCODE" | tee -a /usr/local/etc/php/conf.d/xdebug.ini
amp;amp; echo "xdebug.remote_host=host.docker.internal" | tee -a /usr/local/etc/php/conf.d/xdebug.ini
RUN docker-php-ext-enable xdebug
Мой файл компоновки выглядит следующим образом:
php:
build:
context: .
dockerfile: Dockerfile
container_name: php
volumes:
- ./src:/var/www/html
ports:
- "9002:9000"
networks:
- laravelAdmin
environment:
PHP_EXTENSION_XDEBUG: 1
Мой файл launch.json выглядит следующим образом:
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"port": 9000,
"pathMappings": {
"/var/www/html": "${workspaceRoot}",
// "/var/www/html": "${workspaceRoot}/html",
// "/var/www/html": "${workspaceRoot}/www",
// "/src": "${workspaceRoot}/src"
// "/src": "${workspaceRoot}"
},
"ignore": [
"**/vendor/**/*.php"
],
"log": true,
},
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 9000
}
]
}
При отладке точка останова не работает.
Хотя, если я удалю раздел ‘Ignore’ из launch.json, он покажет мне ошибку из папки поставщика, но она не сломается в моем коде.
Можете ли вы, пожалуйста, помочь мне найти проблему здесь?
В журнале xdebug говорится.
[14] Log opened at 2020-09-15 04:37:54
[14] I: Connecting to configured address/port: host.docker.internal:9000.
[14] I: Connected to client. :-)
[14] -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" fileuri="dbgp://stdin" language="PHP" xdebug:language_version="7.3.20" protocol_version="1.0" appid="14" idekey="VSCODE"><engine version="2.9.6"><![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>
[14] <- breakpoint_list -i 1
[14] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_list" transaction_id="1"></response>
[14] <- breakpoint_set -i 2 -t line -f file:///var/www/html/src/app/Http/Controllers/CreateUsers.php -n 16
[14] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="2" id="140001"></response>
[14] <- breakpoint_set -i 3 -t line -f file:///var/www/html/src/app/Http/Controllers/CreateUsers.php -n 27
[14] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="3" id="140002"></response>
[14] <- breakpoint_list -i 4
[14] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_list" transaction_id="4"><breakpoint type="line" filename="file:///var/www/html/src/app/Http/Controllers/CreateUsers.php" lineno="16" state="enabled" hit_count="0" hit_value="0" id="140001"></breakpoint><breakpoint type="line" filename="file:///var/www/html/src/app/Http/Controllers/CreateUsers.php" lineno="27" state="enabled" hit_count="0" hit_value="0" id="140002"></breakpoint></response>
[14] <- breakpoint_list -i 5
[14] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_list" transaction_id="5"><breakpoint type="line" filename="file:///var/www/html/src/app/Http/Controllers/CreateUsers.php" lineno="16" state="enabled" hit_count="0" hit_value="0" id="140001"></breakpoint><breakpoint type="line" filename="file:///var/www/html/src/app/Http/Controllers/CreateUsers.php" lineno="27" state="enabled" hit_count="0" hit_value="0" id="140002"></breakpoint></response>
[14] <- breakpoint_set -i 6 -t exception -x *
[14] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="6" id="140003"></response>
[14] <- run -i 7
[14] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="run" transaction_id="7" status="stopping" reason="ok"></response>
[14] <- stop -i 8
[14] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="stop" transaction_id="8" status="stopped" reason="ok"></response>
[14] Log closed at 2020-09-15 04:37:5
4
Комментарии:
1. 1) Какая у вас операционная система хоста (где запущен Docker / VSCode)? Это важно (поскольку
host.docker.internal
недоступно в Linux (проблема с Docker), и вам нужно вручную узнать правильный IP-адрес вашей хост-ОС). 2) Включите и соберите журнал Xdebug для такого неудачного сеанса отладки: он сообщит, куда он пытается подключиться (если это произойдет). Возможно, что Xdebug сталкивается с php-fpm (который вы, возможно, установили), поскольку они оба используют TCP 9000 по умолчанию. В таком случае использование 9001 или другого порта для Xdebug может решить эту проблему.2. Я использую Windows 10. Я добавил журнал xdebug сверху. кажется, все прошло хорошо, но все еще не останавливается на точке останова в редакторе vscode.
3. Что ж, журнал показывает, что VSCode успешно установил 2 точки останова в
/var/www/html/src/app/Http/Controllers/CreateUsers.php
— в строках 16 и 27. 1) Действительно ли эти строки были выполнены здесь? 2) В журнале также говорится, что сеанс отладки был инициирован дляfileuri="dbgp://stdin"
… чего я не уверен, что это такое (никогда не видел в моей настройке .. поскольку обычно здесь указано фактическое имя файла, напримерfileuri="file:///app/web/info.php"
) .. и я предполагаю, что это может быть какая-то интерактивная оболочка или что-то в этом роде.4. Какой скрипт вы отлаживаете? Пожалуйста, создайте какой-нибудь автономный простой скрипт (например, каждую инструкцию в новой строке:
<?php $a = 1; $b = 3; $c = $a $b; echo $c;
) и попробуйте вместо этого отладить его? Есть ли у вас другая информация в журнале Xdebug сейчас?5. Строки в CreateUsers.php выполняется. проблема в том, что элемент управления не останавливается в точках останова. Консоль отладки в редакторе vscode показывает все происходящие действия. я отлаживаю php, если вы спрашиваете об этом. иногда кажется, что это может быть вызвано неправильными сопоставлениями путей, поэтому я пробовал разные сопоставления путей, но все еще безуспешно.