XDebug (V3) не останавливается на точках останова в VSCODE + Podman

Вопрос или проблема

Сначала я настроил XDebug на своем хосте Windows, чтобы убедиться, что могу правильно его конфигурировать. Он работал, и я смог установить точки останова в своем коде, и XDebug останавливался на них.

Затем я захотел, чтобы он работал в моем контейнере Podman, поэтому я изменил Dockerfile, чтобы использовать другой client_host: вместо 127.0.0.1, используйте host.docker.internal.

XDebug, похоже, правильно подключается, но не останавливается на точках останова, может быть, это связано с чем-то другим?

Вывод xdebug_info() не показывает ошибок и говорит, что он успешно подключен к host.docker.internal:9003 и отладчик активен.

Вот Dockerfile:

# Используйте официальный образ PHP с FPM и CLI
FROM php:8.2-fpm

# Установите системные зависимости и расширения PHP для Laravel
RUN apt-get update && apt-get install -y \
    git \
    unzip \
    libpq-dev \
    libonig-dev \
    libxml2-dev \
    libzip-dev \
    && docker-php-ext-install pdo pdo_mysql pdo_pgsql zip mbstring xml

# Установите Xdebug
RUN pecl install xdebug && docker-php-ext-enable xdebug

# Настройка Xdebug
RUN echo "zend_extension=xdebug.so" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.mode=debug" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.client_port=9003" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.remote_port=9003" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.log=/tmp/xdebug.log" >> /usr/local/etc/php/php.ini  \
    && echo "xdebug.idekey=VSCODE" >> /usr/local/etc/php/php.ini 

# Установите Composer глобально
COPY --from=composer:2.4 /usr/bin/composer /usr/bin/composer

# Укажите рабочий каталог на /var/www
WORKDIR /var/www

# Скопируйте проект Laravel в контейнер
COPY . .

# Установите зависимости Laravel
RUN composer install --no-interaction --prefer-dist --optimize-autoloader

# Установите права на хранилище и кэш
RUN chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache

# Откройте порт 8000 для artisan serve Laravel
EXPOSE 8000

# Запустите сервер разработки Laravel
CMD php artisan serve --host=0.0.0.0 --port=8000

Вот как я запускаю контейнер:

podman run -d -p 8000:8000 -p 9003:9003 xdebug

Что происходит?

Я наткнулся на этот вопрос на GitHub, где кто-то предложил добавить:

"hostname": "localhost"
"pathMappings": {
"/container/files/path": "${workspaceRoot}"
}

хотя я не уверен, в какой раздел, и какой мой /container/files/path: https://github.com/xdebug/vscode-php-debug/issues/653#issuecomment-919385770

Ответ или решение

Для решения проблемы с остановкой XDebug на точках останова в среде Podman с использованием Visual Studio Code (VSCode), следует обратить внимание на несколько ключевых моментов.

1. Конфигурация XDebug

Ваш Dockerfile в целом выглядит хорошо, однако, обратите внимание на следующие настройки:

RUN echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.client_port=9003" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.idekey=VSCODE" >> /usr/local/etc/php/php.ini
  • Убедитесь, что xdebug.client_host установлен в host.docker.internal, что правильно для вашего случая.

2. Проверка подключений

Вам необходимо убедиться, что VSCode настроен правильно для работы с XDebug. Для этого создайте или обновите файл конфигурации launch.json в папке .vscode вашего проекта с следующими настройками:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9003,
            "pathMappings": {
                "/var/www": "${workspaceFolder}"  // Замените это на путь, который вы используете
            },
            "hostname": "localhost"
        }
    ]
}
  • pathMappings: Убедитесь, что путь /var/www соответствует тому, где находится ваш код внутри контейнера. ${workspaceFolder} — это стандартный путь к каталогу проекта в вашей локальной машине.

3. Запуск контейнера

Контейнер запускается с используемыми вами командами, но убедитесь, что порт 9003 действительно проброшен:

podman run -d -p 8000:8000 -p 9003:9003 --name xdebug_container your_image_name
  • Убедитесь, что вы используете правильное имя образа вместо your_image_name.

4. Логи XDebug

Проверьте лог файл XDebug, который вы настроили в php.ini:

xdebug.log=/tmp/xdebug.log

Загляните в этот файл, чтобы увидеть, есть ли сообщения, которые могут указать на проблему. Например, вы можете увидеть ошибки или подтверждение подключения.

5. Отладка

  • Убедитесь, что у вас установлен плагин "PHP Debug" в Visual Studio Code.
  • Проверьте, запущен ли ваш сервер (с помощью php artisan serve) и доступен ли он на localhost:8000.
  • Убедитесь, что вы действительно запускаете код, где установлены точки останова.

6. Проверка прав доступа

Иногда проблемой может быть отсутствие прав на запись/чтение в каталоге проекта. Убедитесь, что ваш пользователь имеет необходимые права доступа.

Итог

Следуя вышеуказанным шагам, вы сможете настроить XDebug для работы с Podman и VSCode. Если после выполнения всех рекомендаций проблема останется, попробуйте перезапустить контейнер и VSCode. Иногда это может помочь освежить соединение и настройки.

Оцените материал
Добавить комментарий

Капча загружается...