Какая-то странная ошибка, вызванная совокупностью факторов.
С одной стороны, какая-то ошибка скорее всего в моих скриптах (а точнее в модуле), потому что без них не проявляется.
С другой стороны, если luamacro единственный плагин, то не воспроизводится.
╔═══════════════════════ Exception error... ═══════════════════════╗
║ Plugin: ║
║ C:\APPs\Far3\Plugins\LuaMacro\LuaMacro.dll ║
║ executes an error and will be unloaded. ║
║ The trap log file has been saved to file: ║
║ C:\APPs\Far3\ProfileLocal\CrashLogs\FarTrap_20160824111459.log ║
╟──────────────────────────────────────────────────────────────────╢
║ Do you want to terminate FAR itself ? (recommended) ║
╟──────────────────────────────────────────────────────────────────╢
║ { Yes } [ No ] ║
╚══════════════════════════════════════════════════════════════════╝
Exception in [C:\APPs\Far3\Plugins\LuaMacro\LuaMacro.dll] plugin.
==============================================================
System information:
Windows NT, version 5.1.2600 Service Pack 3
==============================================================
FAR.EXE information:
Version info: 3.0.4765
File size: 4431360 bytes
Time stamp: 24.08.2016 04:03:46
Hdr checksum: 0x0044333E (computed: 0x0044333E)
==============================================================
Exception C0000005 "ACCESS_VIOLATION" at 03132E64 has 0001003F flags.
Attempt to WRITE at address 061E2510
EBP: 030F1260 EIP: 03132E64 ESP: 0012F778 CS: 0000001B SS: 00000023 Flags: 00010A17
EDI: 0313E228 ESI: FFFFFFFB EBX: 01EE0D00 EDX: 030F1250 ECX: 03132E60 EAX: 030F1288
GS: 00000000 FS: 0000003B ES: 00000023 DS: 00000023
Cw: FFFF027F Sw: FFFF0120 Tw: FFFFFFFF EOf: 00685C30 Es: 0457001B DOf: 0012E780 Ds: FFFF0023 Cr0: 00000000
dr0: 00000000 dr1: 00000000 dr2: 00000000 dr3: 00000000 dr6: 00000000 dr7: 00000000
==============================================================
Иногда "attempt to call a nil value" не выдаётся, а сразу Exception.
Иногда лог более подробный, см. вложение
LuaMacro — Lua как язык макросов
Posted: Wed 24 Aug, 2016 09:34
by Shmuel
John Doe wrote: Какая-то странная ошибка, вызванная совокупностью факторов.
Это похоже непростой случай, требующий для диагностики специалиста высокого класса с доступом к системе, на которой проявляется. Мне кажется, что в данном случае оба условия соблюдены.
LuaMacro — Lua как язык макросов
Posted: Wed 24 Aug, 2016 09:42
by John Doe
Пока пробую максимально изолировать условия..
Добавил в одном месте вызов far.Show - ошибка пропала
Ещё раз (код не менял) после "attempt to call a nil value " выдало
╔══════════════ LuaMacro ═══════════════╗
║ attempt to compare number with string ║
╟───────────────────────────────────────╢
║ { OK } ║
╚═══════════════════════════════════════╝
Можно ли как-то добиться, чтобы в сообщении была информация о месте ошибки, и стек вызовов?
Ок.
Один из факторов влияющих на проявление ошибки, это наличие в _macroinit определения функции, записываемой в какую-либо из стандартных таблиц luafar, например far.qwerty=function()end
Если записывать нефункцию, то проблем нет
Если записывать в одну из таблиц luamacro - проблемы нет.
Но всё это в дополнение к другим факторам, поэтому может и не важно..
Среди других факторов: наличие перебора far.GetPluginInformation, и вызовы require "rebind" и "regscript"
LuaMacro — Lua как язык макросов
Posted: Wed 24 Aug, 2016 09:49
by Shmuel
John Doe wrote: Можно ли как-то добиться, чтобы в сообщении была информация о месте ошибки, и стек вызовов?
Если ещё нет на мантисе, добавьте. (Прямо сейчас времени нет).
LuaMacro — Lua как язык макросов
Posted: Wed 24 Aug, 2016 14:23
by Shmuel
John Doe
На всякий случай обновил LuaJIT 2.0.4 до текущего состояния. Там за 15 месяцев после релиза был ряд фиксов.
Shmuel wrote: с доступом к системе, на которой проявляется
У меня воспроизводится на двух системах: XP и 8.1, x86.
Выложу минимальный набор, если кто-то возьмётся диагностировать.
Обновление luajit не повлияло.
LuaMacro — Lua как язык макросов
Posted: Wed 24 Aug, 2016 20:01
by Shmuel
John Doe wrote: если кто-то возьмётся диагностировать
Но ведь вы вполне способны сами диагностировать. Ключ здесь - убрать всё лишнее. И у вас есть неоспоримое преимущество знания исходного кода ваших макросов, кому-то другому ведь придётся разбираться..
LuaMacro — Lua как язык макросов
Posted: Wed 24 Aug, 2016 20:24
by John Doe
Постараться убрать лишнее да, я могу, и уже выявил минимальный набор скриптов (3).
Но поскольку ошибка не в скрипте, то найти её у меня никак не получится.
Например изменяю порядок выполнения 2х никак не связанных участков кода - и уже не падает.
Могу ещё попытаться максимально упростить скрипты, пока сохраняется воспроизводимость ошибки.
Но например набор плагинов для воспроизведения у меня сократить не получилось: если делю их пополам, то уже не падает.
LuaMacro — Lua как язык макросов
Posted: Wed 24 Aug, 2016 20:31
by Shmuel
1. Попробуйте поставить файл %farprofile%\luafar_init.lua, а в нём одна строчка jit.off() и перезапустить Фар.
2. Можете выложить комплект, какое-то не слишком большое время могу поиграться.
LuaMacro — Lua как язык макросов
Posted: Wed 24 Aug, 2016 20:33
by HaRT
John Doe, а Вы Фар у себя собираете? Воспроизводится ли, если Фар собран в отладочной конфигурации (Debug)?
Впрочем, даже и в релизе, если подложить Far.pdb рядом с Far.exe (очень важно, чтобы они были для одной и той же сборки), запустить Фар из-под отладчика (например, Microsoft Visual Studio) и воспроизвести падение, то должно ввалиться в отладчик, и там может быть информативный Call Stack (из Visual Studio его можно скопировать в виде текста).
LuaMacro — Lua как язык макросов
Posted: Wed 24 Aug, 2016 20:55
by John Doe
Shmuel
jit.off не влияет
Набор завтра подготовлю
HaRT
Использую сборки с офсайта.
Могу собрать gcc, проверить воспроизводится ли так.
Отладчиком не владею.
Update
Не знаю что я поменял, но теперь ни на одной системе уже не воспроизводится..
LuaMacro — Lua как язык макросов
Posted: Wed 24 Aug, 2016 21:03
by DrKnS
Если положить far.pdb с сайта рядом с far.exe, взятым тоже с сайта, удалить или отключить fexcept и воспроизвести падение - будет более адекватный диалог с кнопкой 'Stack', даже без отладчика.
LuaMacro — Lua как язык макросов
Posted: Wed 24 Aug, 2016 21:06
by HaRT
John Doe wrote: Могу собрать gcc
Ну тогда и отладчик нужен будет на основе gdb, а не Visual Studio.
Принципиальной разницы нет, но вот как в этом случае получить Call Stack (он же Backtrace) в виде текста, я уже не подскажу. Да это и зависит от того, какой будет использован front-end: gdb (консольный); Qt Creator, Eclipse (графические), и т.д.
LuaMacro: подземный стук..
Posted: Sat 24 Sep, 2016 12:36
by John Doe
Подземный стук вернулся..
DrKnS wrote: Если положить far.pdb с сайта рядом с far.exe, взятым тоже с сайта, удалить или отключить fexcept и воспроизвести падение - будет более адекватный диалог с кнопкой 'Stack', даже без отладчика.
Не исключено, что причиной является какой-либо скрипт с использованием FFI, в котором производится доступ к освобождённому сборщиком мусора объекту. Подобный случай описан был здесь.
Почему такое предположение - во-первых нерегулярность проявления, во-вторых, у меня при испытаниях ("подобного случая") на Windows 7 x86 адрес исключения также начинался с 0x66D8.