VSCode Xdebug. Пошаговая отладка завершает работу с рекурсивным стеком

#php #recursion #visual-studio-code #xdebug

#php #рекурсия #visual-studio-code #xdebug

Вопрос:

Я использую VSCode PHP Xdebug. Написал рекурсивную функцию, пытаюсь ее отладить. Но когда отладчик достигает конца стека «return true«, он не возвращается обратно в стек, он просто завершает работу. Я думал, что рекурсия, вероятно, была плохой. Я попробовал это на простейшем примере, но все равно то же самое.

Например:

 function pow1($x, $n)
{
    if ($n == 1) {
        return $x;
    } else {
        return $x * pow1($x, $n - 1);
    }
}

$result = pow1(2, 3);

echo $result;

 

Отладчик достигает return $x; и завершает работу со стеком с правильным результатом.

 pow1 (d:OpenServerOSPaneldomainslocalhostindex.php:6)
pow1 (d:OpenServerOSPaneldomainslocalhostindex.php:8)
pow1 (d:OpenServerOSPaneldomainslocalhostindex.php:8)
{main} (d:OpenServerOSPaneldomainslocalhostindex.php:12)
 

И переходим сюда:

 {main} (d:OpenServerOSPaneldomainslocalhostindex.php:14)
 

Я облазил все настройки Xdebug, пробовал разные варианты, ни один из них не помог. Переписал функцию на JavaScript и отладил в браузере.

Комментарии:

1. Где находятся ваши точки останова? Я использую PhpStorm, и после достижения return $x; строки (после ее выполнения) элемент управления возвращается туда echo $resu< , где у меня также была точка останова. Вот screenshot:postimg.cc/v4nLGTyf Вы должны понимать, что PHP может генерировать байт-код иначе, чем JavaScript, и работа отладчика может отличаться и от других языков. Здесь, в вашем коде, у вас есть только операторы «return». AFAIK Xdebug не останавливается } перед выходом из функции.

2. Привет! Как я уже сказал, я проверил все, включая точки останова, которые я ставил везде, где это было возможно.

3. Ну .. на моем скриншоте показано, где находятся мои точки останова (строки # 4 и # 13) .. и он останавливается на них. После перехода return $x; отладчик останавливается на echo $resu< линии (где находится 2-я точка останова). Это правильное поведение: все ваши операторы в этой функции являются просто возвратами. Для этого используется PhpStorm 2020.2.4 / 2020.3, PHP 7.4.13 x64 NTS в Windows 10, Xdebug 3.0.1

4. Я использовал разные языки программирования и, соответственно, IDE. Везде поведение одинаковое, я столкнулся с этим впервые. Возможно, я что-то ткнул в настройках самого php. Поэтому было бы интересно узнать мнение разработчиков, использующих VSCode. Кстати, сюда отправляются разработанные с GitHub.