Падение при вызове PCTL_GETPLUGININFORMATION

Здесь можно сообщить о найденных багах в Far.
Post Reply
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Падение при вызове PCTL_GETPLUGININFORMATION

Post by Shmuel »

Поместить данный код в файл crash.lua, вызывать lm:post @crash.lua
  1. local GuidCC = "ADAC3050-56E8-45FE-9CB1-A737623CC4A6" -- plugin case conversion
  2.  
  3. local hCC = assert(far.FindPlugin("PFM_GUID",win.Uuid(GuidCC)),"cannot find plugin")
  4.  
  5. assert(far.UnloadPlugin(hCC), "cannot unload plugin")
  6.  
  7.  
  8.  
  9. local plugins = assert(far.GetPlugins(),"GetPlugins() failed")
  10.  
  11. far.Message(#plugins)
  12.  
  13.  
  14.  
  15. for i,h in ipairs(plugins) do
  16.  
  17.   if h ~= hCC then assert(far.GetPluginInformation(h)) end
  18.  
  19. end
Падает типа LuaMacro, но есть большие сомнения, что дело в этом плагине.

Code: Select all

╔════════════════════════ Exception occurred ════════════════════════╗
║ Exception:   Access violation (read from 0x5800320A)               ║
║ Address:     0x58003200                                            ║
║ Function:    OpenW                                                 ║
║ Module:      am Files\Far3\Plugins\Standard\LuaMacro\LuaMacro.dll  ║
╟────────────────────────────────────────────────────────────────────╢
║                    { Unload plugin } [ Debug ]                     ║
╚════════════════════════════════════════════════════════════════════╝
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Падение при вызове PCTL_GETPLUGININFORMATION

Post by Shmuel »

Падение происходит по-видимому в связи с тем, что состояние Фара "не консистентно" между вызовом far.UnloadPlugin и возвращением управления от LuaMacro Фару. Это подтверждают два эксперимента.

Эксперимент 1.
Если разбить скрипт на два (первые 3 строки и всё, что после них) и запускать по очереди, то падения не происходит, так как между скриптами управление переходит к Фару.

Эксперимент 2.
Если вставить после первых 3 строк вызов far.Message("Hello"), то падения также не происходит, и по той же причине, что в эксперименте 1.

В оригинальном скрипте вызов far.Message(#plugins) показывает 36 (количество плагинов у меня), а в экспериментах 1 и 2 показывает 35, т.е. учитывается уже выгруженный плагин.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Падение при вызове PCTL_GETPLUGININFORMATION

Post by zg »

такой патч проблему решает, не очень понятно, почему оригинально код такой, какой он есть:
1. т.е. зачем откладывать выгрузку неактивного плагина.
2. почему плагин, который выгрузить не удалось всё равно молча выгружается. патч это не исправляет, потому что везде результат выгрузки игнорируется (в RefreshPluginsList например).
  1. Index: unicode_far/plugins.cpp
  2.  
  3. ===================================================================
  4.  
  5. --- unicode_far/plugins.cpp (revision 10917)
  6.  
  7. +++ unicode_far/plugins.cpp (working copy)
  8.  
  9. @@ -282,15 +282,16 @@
  10.  
  11.     if(pPlugin->Active())
  12.  
  13.     {
  14.  
  15.         nResult = TRUE;
  16.  
  17. +       if(!IsPluginUnloaded(pPlugin))
  18.  
  19. +       {
  20.  
  21. +           UnloadedPlugins.emplace_back(pPlugin);
  22.  
  23. +       }
  24.  
  25.     }
  26.  
  27.     else
  28.  
  29.     {
  30.  
  31.         nResult = pPlugin->Unload(true);
  32.  
  33. +       RemovePlugin(pPlugin);
  34.  
  35.     }
  36.  
  37. -   if(!IsPluginUnloaded(pPlugin))
  38.  
  39. -   {
  40.  
  41. -       UnloadedPlugins.emplace_back(pPlugin);
  42.  
  43. -   }
  44.  
  45.     return nResult;
  46.  
  47.  }
ps: почему у нас подсветка diff не работает?
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Падение при вызове PCTL_GETPLUGININFORMATION

Post by zg »

ну и RefreshPluginsList надо подправить, чтобы активные плагины не удалял.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Падение при вызове PCTL_GETPLUGININFORMATION

Post by zg »

ну вот как-то так не падает, если вышеуказанным выгружать сам luamacro:
  1. Index: unicode_far/plugins.cpp
  2.  
  3. ===================================================================
  4.  
  5. --- unicode_far/plugins.cpp (revision 10917)
  6.  
  7. +++ unicode_far/plugins.cpp (working copy)
  8.  
  9. @@ -282,15 +282,16 @@
  10.  
  11.     if(pPlugin->Active())
  12.  
  13.     {
  14.  
  15.         nResult = TRUE;
  16.  
  17. +       if(!IsPluginUnloaded(pPlugin))
  18.  
  19. +       {
  20.  
  21. +           UnloadedPlugins.emplace_back(pPlugin);
  22.  
  23. +       }
  24.  
  25.     }
  26.  
  27.     else
  28.  
  29.     {
  30.  
  31.         nResult = pPlugin->Unload(true);
  32.  
  33. +       RemovePlugin(pPlugin);
  34.  
  35.     }
  36.  
  37. -   if(!IsPluginUnloaded(pPlugin))
  38.  
  39. -   {
  40.  
  41. -       UnloadedPlugins.emplace_back(pPlugin);
  42.  
  43. -   }
  44.  
  45.     return nResult;
  46.  
  47.  }
  48.  
  49.  
  50.  
  51. @@ -2537,12 +2538,16 @@
  52.  
  53.  {
  54.  
  55.     if(!UnloadedPlugins.empty())
  56.  
  57.     {
  58.  
  59. -       std::for_each(CONST_RANGE(UnloadedPlugins, i)
  60.  
  61. +       UnloadedPlugins.remove_if(CONST_LAMBDA_PREDICATE(UnloadedPlugins, i)
  62.  
  63.         {
  64.  
  65. -           i->Unload(true);
  66.  
  67. -           RemovePlugin(i);
  68.  
  69. +           if (!i->Active())
  70.  
  71. +           {
  72.  
  73. +               i->Unload(true);
  74.  
  75. +               RemovePlugin(i);
  76.  
  77. +               return true;
  78.  
  79. +           }
  80.  
  81. +           return false;
  82.  
  83.         });
  84.  
  85. -       UnloadedPlugins.clear();
  86.  
  87.     }
  88.  
  89.  }
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Падение при вызове PCTL_GETPLUGININFORMATION

Post by zg »

короче 3628.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Падение при вызове PCTL_GETPLUGININFORMATION

Post by Shmuel »

3628 - похоже, что всё исправилось.
Была ещё одна неисправность, связанная с разным поведением при выгрузке плагина в зависимости от того, есть ли плагиновая панель (другого плагина) или обе панели обычные файловые - эта неисправность тоже исчезла.
Post Reply

Return to “Глюки и баги”