SASGIS - SAS.Планета
View Issue Details
0002925SAS.Планета[All Projects] Багpublic12-12-2015 12:1208-01-2021 17:51
Djam 
zed 
normalmajoralways
resolvedfixed 
wine 1.7.55ROSA Linux Fresh R62014.1
151111 
160606160606 
0002925: SAS.Planet 151111 не запускается под wine 1.7 и выше
С версий 15xxx SAS.Planet перестал запускаться. При установке различных конфигураций OSWindows XP-Seven, в то время как версии <15xxx исправно продолжают работать.

1. в ROSA Linux Fresh R6 с wine 1.7.55 скопировать в домашнюю директорию wine
$HOME/.wine/wine_c/ загрузить и распаковать дистрибутивы SAS.Planet 14xx и 15хх
2. запустить из папки SAS.Planet 14xx файл SASPlanet.exe убедиться что программа работает
3. запустить из папки с SAS.Planet 15xx SASPlanet.exe или SASPlanet.Unicode.exe убедиться в том что программа падает при запуске.

лог прилагаю
No tags attached.
? SASPlanet.Unicode.elf (71,034) 12-12-2015 12:12
http://www.sasgis.org/mantis/file_download.php?file_id=1991&type=bug
Issue History
12-12-2015 12:12DjamNew Issue
12-12-2015 12:12DjamFile Added: SASPlanet.Unicode.elf
13-12-2015 18:03zedNote Added: 0016930
13-12-2015 19:12DjamNote Added: 0016931
13-12-2015 19:13zedNote Added: 0016932
13-12-2015 19:23DjamNote Added: 0016933
13-12-2015 19:43zedNote Added: 0016934
13-12-2015 20:08DjamNote Added: 0016935
13-12-2015 20:17DjamNote Added: 0016936
14-12-2015 09:06vdemidovNote Added: 0016939
14-12-2015 10:02zedNote Added: 0016940
14-12-2015 12:49DjamNote Added: 0016943
16-12-2015 10:16vdemidovStatusnew => confirmed
16-12-2015 10:16vdemidovTarget Version => 30xxxx.Vip
26-12-2015 19:39zedNote Added: 0016963
26-12-2015 19:53vdemidovNote Added: 0016964
26-12-2015 19:55zedNote Added: 0016965
26-12-2015 21:54vdemidovNote Added: 0016966
27-12-2015 09:00zedNote Added: 0016967
27-12-2015 09:01zedSummarySAS.Planet 151111 не запускается под wine => SAS.Planet 151111 не запускается под wine 1.7 и выше
27-12-2015 09:12vdemidovNote Added: 0016968
27-12-2015 11:01zedNote Added: 0016969
27-12-2015 14:32zedStatusconfirmed => feedback
27-12-2015 14:32zedTarget Version30xxxx.Vip => 160606
03-01-2016 21:37zedStatusfeedback => resolved
03-01-2016 21:37zedFixed in Version => 160606
03-01-2016 21:37zedResolutionopen => fixed
03-01-2016 21:37zedAssigned To => zed
08-01-2021 17:51zedNote Added: 0020041

Notes
(0016930)
zed   
13-12-2015 18:03   
На wine 1.6 точно работало.
(0016931)
Djam   
13-12-2015 19:12   
но 14е версии как работали так и работают.
(0016932)
zed   
13-12-2015 19:13   
И какие будут предложения?
(0016933)
Djam   
13-12-2015 19:23   
по логам возможно понять что не так с песочницей?
Отладить под 1.7.x вином. Со своей стороны так как работаю в лине, могу потестировать, если что-то подправить надо, думаю смогу.

Жаль что нет нативной версии. Как и под lazarus(freepascal) но тут наверное бесполезно об этом думать
(0016934)
zed   
13-12-2015 19:43   
По логу видно, что это внешняя ошибка в ntdll.dll:

  2.2 Address : 7BC48889
  2.3 Module Name : ntdll.dll - (Wine ntdll)
  2.4 Module Version: 5.1.2600.2180
  2.5 Type : EExternalException
  2.6 Message : External exception C0000264.

Ошибка произошла в объекте синхронизации:


procedure TSynchronizerSRW.EndWrite;
begin
  FDll.ReleaseExclusive(@FLock);
end;


этот объект как раз и поставляется либой ntdll.dll:

  VDllHandle := GetModuleHandle('ntdll.dll');
  // Resource
  if (0 <> VDllHandle) then begin
    VInitializePtr := GetProcAddress(VDllHandle, 'RtlInitializeSRWLock');
    if VInitializePtr <> nil then begin
      // Vista and newer
      VAcquireExclusivePtr := GetProcAddress(VDllHandle, 'RtlAcquireSRWLockExclusive');
      VReleaseExclusivePtr := GetProcAddress(VDllHandle, 'RtlReleaseSRWLockExclusive');
      VAcquireSharedPtr := GetProcAddress(VDllHandle, 'RtlAcquireSRWLockShared');
      VReleaseSharedPtr := GetProcAddress(VDllHandle, 'RtlReleaseSRWLockShared');
...
(0016935)
Djam   
13-12-2015 20:08   
Хм, странно, но от чего же ж в 14х версиях такого на замечено?
Хм, если я правильно понимаю, то это для Vista and newer?
Может какое-то исключение необходимо для обхода этой проблемы?
(0016936)
Djam   
13-12-2015 20:17   
для чистоты эксперимента удалил старую песочницу и пересоздал новую, по дефолту поставил Windows7.

Ситуация ни как не изменилась.
14ххх - работает без проблем
151111 - крошится с теми же ошибками.
(0016939)
vdemidov   
14-12-2015 09:06   
Вариантов несколько. Или Wine врет насчет поддержки этого примитива синхронизации, или есть какие-то особенности его реализации, какие не знаю. Рекурсивного вызова нет, освобождения без захвата тоже. У меня идей нет. Можно, конечно при создании фабрики синхронизаторов пытаться создавать синхронизатор и тестировать его использование, но мне такое делать лень. Если кому сильно надо работа под Wine, то жду пул реквеста или предложения с оплатой.
(0016940)
zed   
14-12-2015 10:02   
Можете попробовать PlayOnLinux - если не ошибаюсь, эта штука позволяет выбрать подходящую версию wine для запуска приложения.

Можете ещё попробовать в wine выставить конфигурацию Win2000 если там такая есть.
(0016943)
Djam   
14-12-2015 12:49   
Хм, ничего не изменилось:
Operating System:
--------------------------------------
  6.1 Type : Microsoft Windows 2000
  6.2 Build # : 2195
  6.3 Update : Service Pack 4
  6.4 Language: Russian
  6.5 Charset : 204

Application:
-------------------------------------------------------
  1.1 Start Date : Mon, 14 Dec 2015 15:47:11 +0300
  1.2 Name/Description: SASPlanet.Unicode.exe
  1.3 Version Number : 15.11.11.9233
  1.4 Parameters :
  1.5 Compilation Date: Wed, 11 Nov 2015 15:55:30 +0300
  1.6 Up Time : 5 seconds

Exception:
-----------------------------------------------------
  2.1 Date : Mon, 14 Dec 2015 15:47:16 +0300
  2.2 Address : 7BC48889
  2.3 Module Name : ntdll.dll - (Wine ntdll)
  2.4 Module Version: 5.1.2600.2180
  2.5 Type : EExternalException
  2.6 Message : External exception C0000264.
  2.7 ID : 0D21
  2.8 Count : 1
  2.9 Status : New
  2.10 Note :

User:
-------------------------------------------------------
  3.5 Privileges: SeChangeNotifyPrivilege - ON
                  SeSecurityPrivilege - OFF
                  SeBackupPrivilege - OFF
                  SeRestorePrivilege - OFF
                  SeSystemtimePrivilege - OFF
                  SeShutdownPrivilege - OFF
                  SeRemoteShutdownPrivilege - OFF
                  SeTakeOwnershipPrivilege - OFF
                  SeDebugPrivilege - OFF
                  SeSystemEnvironmentPrivilege - OFF
                  SeSystemProfilePrivilege - OFF
                  SeProfileSingleProcessPrivilege - OFF
                  SeIncreaseBasePriorityPrivilege - OFF
                  SeLoadDriverPrivilege - ON
                  SeCreatePagefilePrivilege - OFF
                  SeIncreaseQuotaPrivilege - OFF
                  SeUndockPrivilege - OFF
                  SeManageVolumePrivilege - OFF
                  SeImpersonatePrivilege - ON
                  SeCreateGlobalPrivilege - ON

Computer:
-----------------------------------------------------
  5.3 Free Memory : 5256 Mb
  5.5 Free Disk : 10,17 Gb
  5.7 Processor : Intel(R) Pentium(R) 4 CPU 2.40GHz
  5.8 Display Mode: 1366 x 768, 32 bit
  5.9 Display DPI : 96
  5.10 Video Card : Wine Display Adapter (driver )


все также 14хх без проблем, 15ххх - проблема
(0016963)
zed   
26-12-2015 19:39   
Немного потестил SAS под wine в Ubuntu 14.04 через PlayOnLinux.

Версия 1.8.rc4 падает с такой же ошибкой, что и 1.7.55. При этом в логе wine пишется пара строчек:

> err:win:DefWindowProcA called for other process window 0x10020
> fixme:win:EnumDisplayDevicesW ((null),0,0x15ddac8,0x00000000), stub!

Версии 1.6.2 и 1.4.1 работают без ошибок. При этом 1.6 безбожно тормозит и реально пользоваться можно только на версии 1.4.
(0016964)
vdemidov   
26-12-2015 19:53   
Можешь попробовать принудительно включить использование только самых простых примитивов синхронизации и проверить. Если дело в них, то можно сделать настройку, которая будет вызывать переход на них пусть и с потерей производительности.
(0016965)
zed   
26-12-2015 19:55   
Как это включить? Т.е. там же по-моему это не получится сделать изменив одну строчку?
(0016966)
vdemidov   
26-12-2015 21:54   
Ну, в одну строку нет, но и не сильно много. Заменить этот код в конструкторе

  inherited Create(
    MakeSyncVariable(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncVariableRecursive(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncSymmetrical(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncSymmetricalRecursive(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncStd(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncStdRecursive(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncBig(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncBigRecursive(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters)
  );

на

  inherited Create(
    MakeSyncVariableRecursive(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncVariableRecursive(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncVariableRecursive(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncVariableRecursive(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncVariableRecursive(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncVariableRecursive(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncVariableRecursive(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters),
    MakeSyncVariableRecursive(APerfList, AUseDebug, AUseDestroyCounters, AUseBeginEndCounters)
  );

Тоесть для всех типов синхронизаторов будет использоваться критическая секция со спинлоком TSynchronizerCSSCFactory
(0016967)
zed   
27-12-2015 09:00   
Да, это решает проблему. И, кстати, под 1.8 тормозов как на 1.6 не наблюдается.

Значит, нужно детектить версию ОС, и если там XP и ниже, использовать критическую секцию?
(0016968)
vdemidov   
27-12-2015 09:12   
Не обязательно именно критическую секцию. Желательно проверить другие примитивы. Главное не путать допускающие рекурсивный вызов с не допускающими.
А еще вместо определения ОС можно в процессе создания фабрик создавать тестовый экземпляр и пробовать его лочить, и если вылетел ексепшен, то не пользоваться этой фабрикой.
Если у тебя есть время и возможность, было бы хорошо, если бы ты этим занялся.
(0016969)
zed   
27-12-2015 11:01   
Похоже, достаточно сделать проверку на версию ОС в одном месте, чтобы оно даже не пыталось создать примитив, заведомо не существующий в данной ОС.

Теперь, под wine 1.8, если выбрать профиль WinXP, то всё работает, а если Vista и выше - нет.

Djam, после тестов можете попробовать сообщить разработчикам wine о проблеме с SRW локом.
(0020041)
zed   
08-01-2021 17:51   
Wine 5.0 по дефолту представляется как Windows 7 и с AV уже не падает, но в консоль всё-равно пишет ошибки, связанные с этим локом:

0009:err:sync:fast_release_srw_exclusive Lock 0x331ccc0 is not owned exclusive! (0x1)
0009:err:sync:fast_release_srw_exclusive Lock 0x331cd60 is not owned exclusive! (0x1)
0009:err:sync:fast_release_srw_exclusive Lock 0x331ce00 is not owned exclusive! (0x1)
0009:err:sync:fast_release_srw_exclusive Lock 0x331cea0 is not owned exclusive! (0x1)
0009:err:sync:fast_release_srw_exclusive Lock 0xeeea670 is not owned exclusive! (0x1)

Поэтому, отключил этот лок, если программа запущена под wine.