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 - крошится с теми же ошибками. |
|
|
|
Вариантов несколько. Или 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. |
|
|
|
Можешь попробовать принудительно включить использование только самых простых примитивов синхронизации и проверить. Если дело в них, то можно сделать настройку, которая будет вызывать переход на них пусть и с потерей производительности. |
|
|
(0016965)
|
zed
|
26-12-2015 19:55
|
|
Как это включить? Т.е. там же по-моему это не получится сделать изменив одну строчку? |
|
|
|
Ну, в одну строку нет, но и не сильно много. Заменить этот код в конструкторе
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 и ниже, использовать критическую секцию? |
|
|
|
Не обязательно именно критическую секцию. Желательно проверить другие примитивы. Главное не путать допускающие рекурсивный вызов с не допускающими.
А еще вместо определения ОС можно в процессе создания фабрик создавать тестовый экземпляр и пробовать его лочить, и если вылетел ексепшен, то не пользоваться этой фабрикой.
Если у тебя есть время и возможность, было бы хорошо, если бы ты этим занялся. |
|
|
(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. |
|