WikiDer > Справка: отладка Lua - Википедия

Help:Lua debugging - Wikipedia
 РГ: Lua
(разговаривать)
 Помощь
 
 Сделать
 
 Ресурсы
mw: справочное руководство
 

Эта справочная страница, Справка: отладка Lua, объясняет вопросы написания Lua скрипт и отладка то исходный код, чтобы удалить ошибки или повысить производительность. Поскольку Lua представляет собой "частично скомпилированный" интерпретируемый язык, он не выполняет предварительный просмотр всех распространенных синтаксических ошибок и не обнаруживает переменные с ошибками, которые обнаруживаются только во время выполнения при отображении символа "Ошибка сценария"сообщение. Кроме того, в отличие от wp: templates который может быть запущен интерактивно с помощью редактирования-предварительного просмотра, сценарий Lua должен быть протестирован путем предварительного просмотра (или предварительного просмотра) другой страницы, которая использует шаблон, который #invokeредактируется модуль Lua. В общем, вносите одно небольшое изменение за раз, выполняйте предварительный просмотр и сохраняйте после нескольких хороших изменений, чтобы иметь версию для восстановления на случай возникновения ужасных ошибок после многочисленных последующих изменений. Примечание: сохранить рабочую копию можно в автономном текстовом файле, а не сохранять каждую версию в ревизиях модуля.

Другие предварительно скомпилированные или частично скомпилированные языки могут точно определить номер строки или кодовую фразу, где была обнаружена синтаксическая ошибка или неопределенное имя переменной; однако для выполнения этой обработки может потребоваться дополнительное время. Вместо этого можно было бы использовать лексический анализ инструмент, специально для сценария Lua, чтобы лучше обнаруживать и точно определять переменные с ошибками или логические ошибки в исходном коде Lua.

Предварительный просмотр с предварительным просмотром

Текущие изменения модулей Lua могут быть протестированы во время редактирования, как предварительный просмотр, с помощью новой опции предварительного просмотра для шаблонов / модулей, чтобы «Показать предварительный просмотр» страницы, которая использует шаблон / модуль. В противном случае модули Lua не могут быть запущены в интерактивном режиме для просмотра результатов, что есть только в шаблонах на основе разметки. Вместо этого модули Lua обычно редактируются, сохраняются и запускаются (вызывающим шаблоном), чтобы увидеть, могут ли какие-либо синтаксические ошибки быть обнаружены полукомпиляцией во время редактирования-сохранения. Между тем, хотя предварительный просмотр запуска не сообщает о простых синтаксических ошибках, он позволяет редактировать модуль в реальном времени, а затем выбирать «Показать предварительный просмотр» на странице вызывающего абонента, чтобы увидеть результаты или, если во время предварительного просмотра возникает «Ошибка сценария», многие раз, прежде чем фактически сохранить редактирование. Однако сохранение редактирования дает преимущество в виде просмотра некоторых полукомпилированных сообщений для проверки простых синтаксических ошибок, таких как дублирование «затем, то», о которых не будет сообщено во время предварительного просмотра.

Причины ошибки скрипта

Может быть много причин, по которым модуль Lua вызывает сообщение "Ошибка сценария"при запуске на другой странице. При щелчке по тексту ошибки отображается всплывающее окно, содержащее фактическое сообщение об ошибке, сгенерированное Lua, которое можно использовать в поисковой системе, чтобы найти подробное описание того, что это сообщение означает, и распространенные способы устранения, а также трассировка стека, чтобы помочь определить часть кода, которая действительно вызвала ошибку.

Однако некоторые ошибки встречаются чаще, чем другие:

  • Недопустимая конкатенация пустой строки:   my_str = my_str .. "xx" - Строка с именем my_str не должна быть нулевой при использовании внутри операции конкатенации строк.
  • Недопустимое соединение оператором "+", а не "..":   my_str = my_str + "z" - Оператор конкатенации - это двойная точка «..», и попытка использовать знак плюса «+» может пройти во время предварительной компиляции редактирования-сохранения, но при выполнении этой части Lua-скрипта произойдет ошибка «Script error».
  • Неверное имя функции:   len = строка.long (my_str) - Оператор длины строки - это знак решетки '#' (как в: #my_str) или используйте функцию 'строка.len (my_str)'но пытаюсь использовать неизвестную функцию'строка.long (my_str)'будет успешно проходить во время предварительной компиляции редактирования-сохранения, но при выполнении этой части сценария Lua выдает сообщение «Ошибка сценария».

Есть много других причин "Ошибка сценария"но всегда ищите возможность иметь неустановленную, неинициализированную переменную, которая могла бы остановить программу в этот момент.

Сохранение резервных стабильных версий

Чтобы избежать одновременного появления слишком большого количества ошибок, общая стратегия состоит в том, чтобы вносить «одно небольшое изменение» за раз, выполнять предварительный просмотр и затем сохранять эту протестированную версию после нескольких хороших изменений, чтобы получить стабильную версию для восстановления, в случае возникновения ужасных ошибок после многочисленных последующих изменений. Примечание: сохранение каждой рабочей копии может быть выполнено в наборе автономных текстовых файлов, возможно, каждый с определенным именем версии (и внутренними комментариями), вместо того, чтобы сохранять каждую версию в редакциях модуля Википедии.

Как отлаживать

Простой обзор

Чтобы увидеть значение переменной в одной точке модуля:

Изменение кода

В ошибка() функция (для любой точки модуля) может быть использована. Чтобы узнать переменную a (названную здесь вар) значение, добавляя только строку в модуле с ошибка (var) необходимо.

Но в случае, если эта переменная была таблицей (вкладка, в следующем объяснении) mw.dumpObject (вкладка) будет использоваться или, если у него нет вложенных таблиц, table.concat (табуляция, ',') также может использоваться как параметр в ошибка() функция.

Без изменения кода

Для получения переменных и значений, возвращаемых функциями (не локальными в обоих случаях), можно использовать «Консоль отладки». «Консоль отладки» отображается ниже на странице модуля (когда он находится в режиме редактирования). потом mw.log, mw.logObject, и = может быть использован. Давайте посмотрим на его полезность на следующем примере:

местный п = {}п.Привет = 'Привет'функция п.расчет(число)   возвращаться числоконецфункция п.sum_mult(число)   возвращаться число + число, число * числоконецфункция п.таблица(число)   возвращаться {число, число+1}конецвозвращаться п

Запросы к «Консоли отладки»:

ЗапросВозвращаемое значение
mw.log (p.Hello)"Привет"
mw.log (p.calc (10/2))5
mw.log (p.sum_mult (3))6   9
mw.log (p.mtable (4))стол
mw.logObject (p.mtable (4))

Таблица 1 {

4,
5,

}

= p.sum_mult (10)20 100
= p.Hello .. ', Мир!'Привет, мир!

Попробуйте это в модуле: Пример отладки lua. Консоль отладки не сохраняет запросы, тогда их придется копировать или переписывать заново при каждой модификации модуля.

Обзор расхода и значений переменных в нескольких точках

Функции Модуль: SimpleDebug может использоваться для таких случаев, как упомянутые выше, или для более сложных случаев:

  • Когда переменные или возвращаемое значение (или значения) функцией являются локальными.
  • Чтобы увидеть, проходит ли поток программы через точку (которую вы отметите).
  • Чтобы ограничить количество значений, возвращаемых из цикла, или установить условия для включения регистрации значений.

Отладка старых модулей

В некоторых ситуациях модуль Lua может быть более старым, возможно, модифицированным различными другими редакторами по пути, с множеством неизвестных проблем. Модуль Lua может содержать множество логических ошибок и даже переменных с ошибками, если модуль не был должным образом протестирован для всех функций при первоначальной разработке. Сообщение "Ошибка сценария"возникает только тогда, когда тестовые данные запускают недопустимый раздел кода Lua, поэтому непроверенный модуль может содержать множество скрытых ошибок, обнаруживаемых только тогда, когда более широкие тестовые данные активируют больше областей исходного кода или используют больше внутренних функций.

Распространенная и сложная проблема состоит в том, чтобы попытаться расширить старый модуль для получения новых функций, но не знаете, как некоторые предыдущие, нерешенные ошибки будут обнаружены только при добавлении расширенных функций. Обратите внимание на то, что ошибки часто возникают не во вновь добавленном скрипте Lua, а скорее в молчаливом ожидании в старых разделах, чтобы сработать (сюрприз), когда новый код активирует другие части скрипта Lua. Скрытая ошибка может быть такой же простой, как неопределенное (или неправильно написанное) имя переменной, которое было обработано со значением по умолчанию, но при использовании с новыми добавленными функциями генерирует совершенно загадочные результаты, как если бы в новом коде были ошибки, когда на самом деле старые переменные с ошибками в других областях полностью нарушили работу новых функций.

Тактика работы с более старыми ошибками состоит в том, чтобы запланировать запуск специальных дополнительных тестовых данных для активации областей кода или отображения вывода отладки, где может быть добавлен новый сценарий Lua, чтобы обеспечить санитарная проверка что затронутые области функционируют нормально, прежде чем добавлять слишком много новой, подробной логики. В большинстве случаев обратите внимание: "корректура - самая быстрая форма тестирования » если у вас хватит терпения или умственной памяти, чтобы просмотреть детали старого исходного кода. Однако другая тактика - зарезервировать определенные значения тестовых данных для запуска кода отображения отладки, который выводит значения всех связанных данных на экран или предоставляет список дерева вызовов, чтобы гарантировать, что логика перетекает в различные функциональные секции, как ожидалось. Во многих случаях человеческая память не может справиться с деталями, выходящими за пределы 5-9 переменных, поэтому отображение отладки становится более простым вариантом, несмотря на дополнительное время, необходимое для записи операторов отладки-печати в модуль Lua. Будьте осторожны, продвигайтесь медленно, потому что после добавления большого количества нового Lua-скрипта это может стать загадочной игрой в угадывание того, были ли проблемы вызваны «всем новым», а не уже существующими ошибками в старом Lua-скрипте.

Использование персональной песочницы для разработки скриптов

В английской Википедии есть Песочница шаблона расширение установлено. Между «песочницей шаблона» и расширениями «Scribunto» существует синергия, которая позволяет разрабатывать и изменять модули Lua на частных страницах (то есть в пользовательском пространстве) перед их перемещением в глобальное пространство.

Использование «песочницы шаблона» для разработки модулей Lua

Возьмем практический пример. в этом примере предположим, что ваше имя пользователя - «Разработчик Lua». Допустим, вы хотите протестировать исправление ошибки или улучшение Нить модуль. Есть две причины, по которым вы не можете сделать это напрямую: этот модуль содержит функции, которые используются в сотнях шаблонов, включенных в миллионы статей. Любая ошибка нанесет огромный ущерб Википедии. Вторая причина более прозаична: поскольку этот модуль является центральным, он также защищен, и у нашего пользователя «Lua Developer» нет необходимых разрешений для изменения этого модуля.

Итак, первый шаг в «песочнице» - скопировать Модуль: Строка на личную страницу Пользователь: Разработчик Lua / песочница / Модуль: Строка. Теперь наш разработчик может редактировать модуль, как ей нравится. В любой момент она может открыть Специально: TemplateSandbox, используя по умолчанию «Префикс песочницы», которым в ее случае будет «Пользователь: разработчик Lua / песочница». Это означает, что просмотр любой страницы со страницы песочницы всякий раз, когда парсер обнаруживает шаблон Т или модуль M, он сначала проверит, существует ли страница с именем «Пользователь: Lua Developer / sandbox / Template: T» или «Пользователь: Lua Developer / sandbox / Module: M», и если да, синтаксический анализатор будет использовать их для анализируемого page, а не в "реальных" пространствах имен Module и Template. Любой шаблон или модуль, которые не существуют под «префиксом песочницы», будут извлечены анализатором из соответствующего пространства имен.

В песочнице шаблона разработчик может просматривать любую страницу, а также может ввести необработанный викитекст и попросить синтаксический анализатор проанализировать его, используя искусственные шаблоны и модули, которые он создал под «префиксом песочницы»

Небольшая оговорка: случай неправильного корпуса

В Википедии есть небольшое извращение относительно регистра имени страницы: он преобразует первый символ имени страницы в верхний регистр, независимо от того, как он был введен. Чтобы компенсировать это, он также преобразует первую букву шаблона (при включении) и модуля (при вызове) в верхний регистр. однако это не распространяется на модули, хранящиеся в пространстве имен User :, просматриваемых через специальный Песочница шаблона, потому что в песочнице «первая буква» уже не первая буква. Вот реальный пример: для реальных модулей, скажем, Модуль: String, программное обеспечение mediawiki позволит вам использовать {{#invoke: String | replace | Hara I am | a | e}}, чтобы вернуть "Here I em" (попробуйте). Это также позволит вам использовать {{#invoke: string | replace | Hara I am | a | e}} для получения того же результата:

wikitextрезультат
{{#invoke: String | заменить | Хара, я | a | e}}Вот я
{{#invoke: string | заменить | Хара, я | a | e}}Вот я

Однако, если бы наш разработчик создал страницу с именем Пользователь: Разработчик Lua / песочница / Модуль: строка, она не сможет вызвать этот модуль каким-либо образом, поскольку парсер будет искать страницу с именем «Module: String», а не «Module: string» под префиксом песочницы, Википедия не преобразует имя в «Module: String »(потому что он преобразует только 1-й символ в имени страницы) и не найдет его, поэтому он возьмет модуль из основного пространства имен (если такой модуль существует) или будет жаловаться на то, что модуль не существует.

Верхний / нижний регистр правильно обрабатывается для всех модулей при нормальном использовании, которые размещены в пространстве имен Module :.

Планируйте расширенный код отображения отладки

В качестве еще одной проблемы стратегии добавление разделов отображения отладки не замедляет код Lua, как это может снизить скорость выполнения шаблона на основе разметки, поскольку Lua может обрабатывать сотни условий if с высокой скоростью. Даже добавление дополнительного оператора if для каждой переменной Lua имеет небольшое замедление скорости по сравнению с замедлением шаблона, возможно, на 50% при добавлении похожих if-выражений внутри шаблона разметки. Не стесняйтесь добавлять множество разделов отображения отладки в модуль Lua или добавлять несколько проверка параметров тесты как дополнительные операторы if для проверки значений переменных с целью обнаружения типичных неверных данных.

Случайные ошибки тайм-аута

Программное обеспечение Lua изначально было настроено с небольшим ограничением времени ожидания в 10 секунд для совместной работы всего кода Lua при форматировании страницы. Для сравнения: шаблоны на основе разметки имеют тайм-аут 60 секунд (ограничение по времени в 6 раз больше), а когда серверы работают медленно, шаблоны на основе разметки могут идеально отформатироваться, до 59 секунд, но части шаблонов Lua будут остановился на 10-секундном пределе. Сообщение об ошибке может быть таким:

Lua 'ошибка сценария': «Истекло время, отведенное для выполнения сценариев».

В отличие от шаблонов на основе разметки, отформатированная страница будет содержать «ошибку сценария» для каждого последующего вызываемого модуля Lua в виде текста для сохранения в копии кэша страниц. Опасность ограничения тайм-аута возникает в редкие периоды задержки сервера в 3-4 раза медленнее, когда 3-секундная операция Lua может замедляться до 12-секундной продолжительности с загруженными серверами и, таким образом, искажать обработку для сохранения «ошибки сценария» в форматированная страница для просмотра тысяч читателей.

Общие усилия кажутся нестабильными или ненадежными, как будто Lua внезапно «слишком устает» и начинает жаловаться, сохраняя «Ошибка сценария» на результирующей странице, где вместо этого ожидался бы форматированный текст. Проблема тайм-аута возникает довольно редко, и когда отформатированная статья содержит текст «Ошибка сценария» внутри страницы, возможно, немного отредактируйте страницу, чтобы внести небольшое изменение, чтобы принудительно заменить страницу чистым запуском Lua.

Поддерживать

Если вы все еще застряли и не знаете, что делать дальше, оставьте сообщение на Википедия: запросы Lua запрос помощи по отладке.

Смотрите также