Перейти к содержимому

Улучшенный debug.debug()

Fingercomp

166 просмотров

Сейчас я покажу, как сделать это:

yPbJWEs.png

 

На скрине выше — улучшенный debug.debug().

 

Он умеет:

  • Бегать вверх-вниз по стэку вызовов независимо от того, где запущен.
  • Показывать красивые стэктрейсы.
  • Имитировать динамический скоуп: получать значения локальных переменных, редактировать их, не требуя возни с либой debug. При этом учитывает, на каком уровне в стэке вызовов он находится.

 

Он не умеет:

  • «Шагать» по коду, заходить внутрь функций, проскакивать над ними.

 

Таким образом, это не совсем дебаггер. Но он может показать состояние всех доступных переменных.

 

Чтобы заюзать в коде, нужно сделать так:

require("dbg")()

 

Впрочем, если в проге есть какой-то часто вызываемый сегмент, то безусловно падать в мини-дебаггер на каждой итерации очень печально. Поэтому можно задать условие, при котором его запускать. Например:

require("dbg")(nonNegative < 0)

У нас есть переменная nonNegative, которая семантически всегда неотрицательна. Если ж внезапно попалось что-то меньше нуля, есть смысл попросить программиста проверить, кто (и как) изобрёл свою алгебру.

 

Команды:

  • :bt — показать стэктрейс.
  • :up — прыгнуть на уровень вверх.
  • :down — спуститься на уровень вниз.
  • :frame N — перейти на N-ый уровень.

 

Выйти из интерпретатора можно, нажав Ctrl-D или Ctrl-C.

 

Код: https://gist.github.com/Fingercomp/58388304f45bf6b2b8108e3b7a555315 (задумывался одноразовым, качество соответствующее).

 

В обычной Lua надо просто кинуть содержимое куда-нибудь, откуда require тащит файлы.

 

Чтобы это работало в OpenComputers, придётся пропатчить содержимое мода:

  1. Открываем jar-файл мода в архиваторе.
  2. Идём в /assets/opencomputers/lua.
  3. Открываем файл machine.lua и в районе 971 строки делаем как-то так:
    yGimAbb.png
     
  4. Сохраняемся и выходим.

 

Если всё сделано правильно, в OpenComputers теперь доступна полная либа debug. Остаётся закинуть код мини-дебаггера, например, в /home/lib, дальше используем как обычно.

 

Очевидно, что на серверах такое делать не надо. Ну, совсем не надо. Полной либой debug легко выудить нативную load. А это уже уязвимость.

Но в сингле вещь незаменимая. Цитирую отзыв пользователя, пожелавшего остаться анонимным:

Цитата

Когда за пару часов я собрал мими-дебаггер, я больше не ставил ни одного дебаг-принта. И даже логи мне больше не понадобились. Прога крашнулась? Просто ставим dbg(), задаём условие и дебажим.

 

Автору — респект, проге — ★★★★★. :smile9:

 

Успехов вам в дезинсекции кода.

  • Нравится 8
  • В шоке 1
  • Грусть 2


0 комментариев


Рекомендуемые комментарии

Нет комментариев для отображения

Гость
Добавить комментарий...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...