Xdebug не работает в настройках Docker для редактора VSCode

#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, если вы спрашиваете об этом. иногда кажется, что это может быть вызвано неправильными сопоставлениями путей, поэтому я пробовал разные сопоставления путей, но все еще безуспешно.