Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Скриптовый язык: отладка

Привет, коллеги. Сегодня поговорим об отладке.

Для отладки полезны команды типа echo, выводящие сообщения на экран. Очень полезны исключения, если вы умеете ими пользоваться: они позволяют передать сообщение из цикла, функции или чего-нибудь еще наружу, а блоки finally дадут возможность выполнить что-то "в любом случае" (например, сообщить о ситуации или записать диагностику в файл).

Но мы поговорим о режиме отладчика, который в Виме имеется. Он дает возможность выполнять код пошагово или от контрольной точки (breakpoint) до контрольной точки. И, конечно, просматривать значения переменных, чтобы понять, где мы и что происходит.

Логи - отладочный вывод. Брейкпоинты - контрольные точки. Баги - ошибки.
Логи - отладочный вывод. Брейкпоинты - контрольные точки. Баги - ошибки.

Есть несколько способов запустить отладчик, мы возьмем один: команду :debug. Она позволяет пошагово выполнить другую команду, такую, как call, например, или let (и отладить функцию) или source (и отладить скрипт).

В ходе выполнения мы можем смотреть значения переменных (опций, регистров и т.п.) обычным способом: echo var &sw @a

История команд у отладчика своя, так что делайте что хотите - потом это не будет видно.

Команда перед выполнением показывается вместе с номером строки, только номер строки отсчитывается от начала функции.

Управлять выполнением можно так:

  • cont - продолжать работу до следующей контрольной точки (breakpoint).
  • quit - прервать работу.
  • next - выполнить команду, которая ждет; при этом функции и вызовы скриптов выполняются целиком, без "захода" внутрь.
  • step - то же самое, но пошагово выполняются пользовательские функции и скрипты.
  • finish - заканчивает выполнение функции или скрипта и возвращается в режим отладки.
  • backtrace, where - обе команды покажут стек вызовов: какие функции кого вызывали и где мы находимся.
  • up, down - переходят на уровень выше или ниже по стеку вызовов.

Это не все команды. Нажатие <CR> повторяет команду. Команды можно сокращать, если это недвусмысленно. Автодополнения нет. Если вам нужны одноименные команды Вим (например, :next), они доступны с двоеточием.

Теперь обсудим контрольные точки. Это помеченное место в коде, на котором отладчик должен остановиться. По-английски это breakpoits, известны также под калькой "брейкпоинты". Они нужны, если, например, цикл должен выполниться много раз, а только потом что-то непонятное происходит. Так можно промотать всё до этой точки, а потом уж осмотреться.

Ставят точки команды семейства breakadd.

breakadd func принимает имя функции и, необязательно, номер строки (перед именем). Функция может еще не существовать. Номер строки по умолчанию 1 (относительно начала функции) и остановка будет не раньше этого номера. Так можно включить отладку на данной функции или даже на заданной строке функции.

breakadd file делает то же самое для файлов.

breakadd here ставит контрольную точку в данном файле на текущей строке.

В качестве имени может идти шаблон: не регулярное выражение, а шаблон вроде файлового. Символ * совпадает с любым текстом. Регистр учитывается, но можно это отключить ключом \c.

В случае файлов сравнивается полный путь. Если путь не указан, используется текущий каталог. Так,

breakadd file myscript.vim

совпадет с данным файлом в текущем каталоге. А

breakadd file *script.vim

совпадет с script.vim, myscript.vim, herscript.vim, а также с любым из этих файлов в любом каталоге. Наконец,

breakadd file */myscript.vim

совпадет с данным файлом в любом каталоге.

К имени функции может быть что-то добавлено (см. выдачу команды function), поэтому лучше указывать имя в виде *myfunc, если, конечно, вы не любитель использовать имена f, ff и т.п.

Надо иметь в виду, что для функции могут сработать сначала файловые, а потом функциональные контрольные точки.

Команда breaklist покажет созданные точки и их номерами. A breakdel позволит удалить точку по номеру или все (breakdel *). Можно удалять точки и так же, как создавали: замените breakadd на breakdel - синтаксис тот же. Только если номер строки опущен, удаляется первая точка в функции/файле. Имя надо указывать ровно так, как указывали в breakadd: другой шаблон, даже совпадающий там же, не сгодится!

Удачи в отладке, коллеги!

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022

Про скриптовый язык была целая серия заметок:

А следующая будет про профилировку, она же хронометрия!