Сейчас я покажу, как сделать это:
На скрине выше — улучшенный 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, придётся пропатчить содержимое мода:
- Открываем jar-файл мода в архиваторе.
- Идём в /assets/opencomputers/lua.
-
Открываем файл machine.lua и в районе 971 строки делаем как-то так:
- Сохраняемся и выходим.
Если всё сделано правильно, в OpenComputers теперь доступна полная либа debug. Остаётся закинуть код мини-дебаггера, например, в /home/lib, дальше используем как обычно.
Очевидно, что на серверах такое делать не надо. Ну, совсем не надо. Полной либой debug легко выудить нативную load. А это уже уязвимость.
Но в сингле вещь незаменимая. Цитирую отзыв пользователя, пожелавшего остаться анонимным:
ЦитатаКогда за пару часов я собрал мими-дебаггер, я больше не ставил ни одного дебаг-принта. И даже логи мне больше не понадобились. Прога крашнулась? Просто ставим dbg(), задаём условие и дебажим.
Автору — респект, проге — ★★★★★.
Успехов вам в дезинсекции кода.
- 9
- 1
- 2
0 комментариев
Рекомендуемые комментарии
Нет комментариев для отображения