Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Application freezes when opening a new window from a menu item click (might be in AOT builds only?) #16840

Open
SourMesen opened this issue Aug 28, 2024 · 4 comments
Labels

Comments

@SourMesen
Copy link
Contributor

SourMesen commented Aug 28, 2024

Describe the bug

I've been getting some freezes with Avalonia 11.1.3 on Windows 11.
Doesn't seem to be new to 11.1.3 though, older versions of 11.0.x seemed to have the same problem, too. (and 11.2.0-beta1 seems to be the same, too)

Managed to reduce this down to a pretty simple scenario. The window contains a "Test" menu item, which contains a "Open window" item in its submenu (which opens a new blank window when clicked). Sometimes, clicking on the menu item opens the new window and then freezes the application.

This freeze only seems to occur with AOT builds, I'm not sure why - it could just be timing-related/luck.
The same code built without AOT never seems to reproduce the freeze on my end.

To Reproduce

A repro is available here: https://github.com/SourMesen/AvaloniaFreeze/

Someone else also tested this repro, and it freezes on their end, too (on Windows 10). So at the very least it doesn't seem to only happen on my PC.

There are 2 executables in the "binaries" folder in the repository, one is the AOT build, the other is the regular JIT build (there's also a small "build.cmd" script to build both the aot & jit builds)

The app is setup to fake a click on the "Open window" menu item whenever a key is pressed.
This is done by opening the "Test" menu's submenu (via code) and faking a click on the menu item. This makes it easy to reproduce the freeze by just holding a key down.

It's also possible to get it to freeze by manually clicking on the "Open window" menu item, closing the new window manually, and repeating the steps, but it can take a little while to trigger the freeze this way.

When I open the AOT build and hold any key down (e.g the "A" key), the application starts opening and closing a new blank window repeatedly, and freezes within a few seconds (on my end)

On the JIT build, doing the exact same steps never seems to freeze, even if I hold the key down for a minute or more.

Expected behavior

No response

Avalonia version

11.1.3

OS

Windows

Additional context

This is the call stack it freezes on:

 	win32u.dll!NtUserMsgWaitForMultipleObjectsEx()	Unknown
 	combase.dll!CCliModalLoop::BlockFn(void * * ahEvent=0x000000fb8ecfc320, unsigned long cEvents=1, unsigned long * lpdwSignaled=0x000000fb8ecfc200) Line 2108	C++
 	combase.dll!ClassicSTAThreadWaitForHandles(unsigned long dwFlags=0, unsigned long dwTimeout, unsigned long cHandles=1, void * * pHandles=0x000000fb8ecfc320, unsigned long * pdwIndex=0x000000fb8ecfc200) Line 54	C++
 	combase.dll!CoWaitForMultipleHandles(unsigned long dwFlags=0, unsigned long dwTimeout=4294967295, unsigned long cHandles=1, void * * pHandles=0x000000fb8ecfc320, unsigned long * lpdwindex=0x000000fb8ecfc200) Line 126	C++
 	AvaloniaFreezeAot.exe!PalCompatibleWaitAny(unsigned int alertable, unsigned int timeout=4294967295, unsigned int handleCount=1, void * * pHandles=0x000000fb8ecfc320, unsigned int allowReentrantWait) Line 296	C++
 	AvaloniaFreezeAot.exe!RhCompatibleReentrantWaitAny(unsigned int alertable, unsigned int timeout, unsigned int count, void * * pHandles) Line 1119	C++
>	AvaloniaFreezeAot.exe!S_P_CoreLib_System_Threading_WaitHandle__WaitForMultipleObjectsIgnoringSyncContext() Line 56	Unknown
 	AvaloniaFreezeAot.exe!S_P_CoreLib_System_Threading_WaitHandle__WaitOneNoCheck() Line 131	Unknown
 	AvaloniaFreezeAot.exe!S_P_CoreLib_System_Threading_WaitHandle__WaitOne() Line 102	Unknown
 	AvaloniaFreezeAot.exe!S_P_CoreLib_System_Threading_Condition__Wait_1() Line 114	Unknown
 	AvaloniaFreezeAot.exe!S_P_CoreLib_System_Threading_Monitor__Wait() Line 142	Unknown
 	AvaloniaFreezeAot.exe!S_P_CoreLib_System_Threading_ManualResetEventSlim__Wait_4() Line 561	Unknown
 	AvaloniaFreezeAot.exe!S_P_CoreLib_System_Threading_Tasks_Task__SpinThenBlockingWait() Line 3072	Unknown
 	AvaloniaFreezeAot.exe!S_P_CoreLib_System_Threading_Tasks_Task__InternalWaitCore() Line 3028	Unknown
 	AvaloniaFreezeAot.exe!S_P_CoreLib_System_Threading_Tasks_Task__Wait_4() Line 2768	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Media_MediaContext__SyncCommit()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Controls_Avalonia_Controls_TopLevel__HandleClosed()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Controls_Avalonia_Controls_WindowBase__HandleClosed()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_WindowImpl__AppWndProc()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_WindowImpl__WndProc()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_WindowImpl__WndProcMessageHandler()	Unknown
 	AvaloniaFreezeAot.exe!Internal_CompilerGenerated__Module___<ReverseDelegateStub>Avalonia_Win32_Avalonia_Win32_Interop_UnmanagedMethods_WndProc()	Unknown
 	user32.dll!UserCallWinProcCheckWow()	Unknown
 	user32.dll!DispatchClientMessage()	Unknown
 	user32.dll!__fnDWORD()	Unknown
 	ntdll.dll!KiUserCallbackDispatcherContinue()	Unknown
 	win32u.dll!NtUserDestroyWindow()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_Interop_UnmanagedMethods__DestroyWindow()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_WindowImpl__Dispose()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Reactive_Disposable_AnonymousDisposable_1<S_P_CoreLib_System_ValueTuple_2<System___Canon__System___Canon>>__Dispose()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Controls_Avalonia_Controls_Primitives_Popup__CloseCore()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Controls_Avalonia_Controls_Primitives_Popup__IsOpenChanged()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Reactive_LightweightObservableBase_1<System___Canon>__PublishNext()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_AvaloniaObject__RaisePropertyChanged_0<Bool>()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_PropertyStore_EffectiveValue_1<Bool>__SetAndRaiseCore()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_PropertyStore_EffectiveValue_1<Bool>__SetAndRaise()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_PropertyStore_ValueStore__ReevaluateEffectiveValue()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_PropertyStore_ValueStore__Avalonia_Data_Core_IBindingExpressionSink_OnChanged()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Data_Core_UntypedBindingExpressionBase__PublishValue()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Data_TemplateBinding__PublishValue()	Unknown
 	AvaloniaFreezeAot.exe!S_P_CoreLib_System_EventHandler_1<System___Canon>__InvokeMulticastThunk()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_AvaloniaObject__RaisePropertyChanged_0<Bool>()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_PropertyStore_EffectiveValue_1<Bool>__SetAndRaiseCore()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_PropertyStore_ValueStore__SetCurrentValue<Bool>()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Controls_Avalonia_Controls_Menu__Close()	Unknown
 	AvaloniaFreezeAot.exe!S_P_CoreLib_System_EventHandler__InvokeMulticastThunk()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_WindowImpl__AppWndProc()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_WindowImpl__WndProc()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_WindowImpl__WndProcMessageHandler()	Unknown
 	AvaloniaFreezeAot.exe!Internal_CompilerGenerated__Module___<ReverseDelegateStub>Avalonia_Win32_Avalonia_Win32_Interop_UnmanagedMethods_WndProc()	Unknown
 	user32.dll!UserCallWinProcCheckWow()	Unknown
 	user32.dll!DispatchClientMessage()	Unknown
 	user32.dll!__fnDWORD()	Unknown
 	ntdll.dll!KiUserCallbackDispatcherContinue()	Unknown
 	win32u.dll!NtUserShowWindow()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_Interop_UnmanagedMethods__ShowWindow()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_WindowImpl__ShowWindow()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Controls_Avalonia_Controls_Window__ShowCore()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Interactivity_EventRoute__RaiseEventImpl()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Interactivity_EventRoute__RaiseEvent()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Interactivity_Interactive__RaiseEvent()	Unknown
 	AvaloniaFreezeAot.exe!AvaloniaFreeze_Test_Views_MainWindow__OnKeyDown() Line 39	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Reactive_LightweightObservableBase_1<S_P_CoreLib_System_ValueTuple_2<System___Canon__System___Canon>>__PublishNext()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Interactivity_EventRoute__RaiseEventImpl()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Interactivity_EventRoute__RaiseEvent()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Interactivity_Interactive__RaiseEvent()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Input_KeyboardDevice__ProcessRawEvent()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Input_InputManager__ProcessInput()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Controls_Avalonia_Controls_TopLevel___c___HandleInput_b__142_0()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Threading_Dispatcher__Send()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Controls_Avalonia_Controls_TopLevel__HandleInput()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_WindowImpl__AppWndProc()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_WindowImpl__WndProc()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_WindowImpl__WndProcMessageHandler()	Unknown
 	AvaloniaFreezeAot.exe!Internal_CompilerGenerated__Module___<ReverseDelegateStub>Avalonia_Win32_Avalonia_Win32_Interop_UnmanagedMethods_WndProc()	Unknown
 	user32.dll!UserCallWinProcCheckWow()	Unknown
 	user32.dll!DispatchMessageWorker()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_Interop_UnmanagedMethods__DispatchMessage()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_Win32DispatcherImpl__RunLoop()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Threading_DispatcherFrame__Run()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Threading_Dispatcher__PushFrame()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Base_Avalonia_Threading_Dispatcher__MainLoop()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Controls_Avalonia_Controls_ApplicationLifetimes_ClassicDesktopStyleApplicationLifetime__Start()	Unknown
 	AvaloniaFreezeAot.exe!AvaloniaFreeze__Module___StartupCodeMain()	Unknown
 	AvaloniaFreezeAot.exe!wmain(int argc=1, wchar_t * * argv=0x000002092c32b7a0) Line 224	C++
 	[Inline Frame] AvaloniaFreezeAot.exe!invoke_main() Line 90	C++
 	AvaloniaFreezeAot.exe!__scrt_common_main_seh() Line 288	C++
 	kernel32.dll!BaseThreadInitThunk()	Unknown
 	ntdll.dll!RtlUserThreadStart()	Unknown

There's also this other thread that seems to be Avalonia:

 	win32u.dll!NtUserGetMessage()	Unknown
 	user32.dll!GetMessageW()	Unknown
>	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_Interop_UnmanagedMethods__GetMessage()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_WinRT_Composition_WinUiCompositorConnection__RunLoop()	Unknown
 	AvaloniaFreezeAot.exe!Avalonia_Win32_Avalonia_Win32_WinRT_Composition_WinUiCompositorConnection___c__DisplayClass7_0___TryCreateAndRegisterCore_b__0()	Unknown
 	AvaloniaFreezeAot.exe!S_P_CoreLib_System_Threading_Thread__StartThread() Line 447	Unknown
 	AvaloniaFreezeAot.exe!S_P_CoreLib_System_Threading_Thread__ThreadEntryPoint() Line 225	Unknown
 	kernel32.dll!BaseThreadInitThunk()	Unknown
 	ntdll.dll!RtlUserThreadStart()	Unknown
@SourMesen SourMesen added the bug label Aug 28, 2024
@genment
Copy link

genment commented Aug 29, 2024

I'm encountering the same issue on my PC as well as on several of my users' PCs.

The problem is intermittent and not easily reproducible—it occurs roughly 12 times out of 100 attempts. I just tested this manually using Avalonia 11.0.10, and the issue exists in version 11.2.0-beta1 as well.

In my case, the problem arises when switching from a LoginWindow to a MainWindow after a user successfully logs in. The app then freezes on the MainWindow. Below is the code snippet I'm using to perform this window transition:

var window = new MainWindow();
window.Show();
window.Focus();

var appLifetime = Application.Current?.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime;

var old = appLifetime!.MainWindow;
appLifetime.MainWindow = window;
old?.Close();

@SourMesen
Copy link
Contributor Author

I've managed to simplify the repro scenario - all that seems to be needed to cause the freeze is to open and close windows repeatedly (which is similar to what genment posted above). There's no need to have a MenuItem at all.

I have a thread that keeps opening a new blank window every 20ms, and then every window closes 100ms after being opened.
In AOT builds, this usually freezes within a few seconds. In non-AOT builds, this doesn't seem to ever freeze.

Haven't been able to find any way to prevent the freeze from happening, unfortunately.

I've updated the repo above - this code is enough to reproduce the freeze in AOT builds:

   public void StartTest()
   {
       //Infinite loop that keeps opening new windows
       Task.Run(async () =>
       {
           while (true)
           {
               await Task.Delay(20);
               Dispatcher.UIThread.Post(() =>
               {
                   ExecuteTest();
               });
           }
       });
   }

   private static void ExecuteTest()
   {
       Window wnd = new Window();
       wnd.Width = 100;
       wnd.Height = 100;
       wnd.Show();

       Task.Run(async () =>
       {
           //Each window closes 100ms after being shown
           await Task.Delay(100);
           Dispatcher.UIThread.Post(() =>
           {
               wnd.Close();
           });
       });
   }

@genment
Copy link

genment commented Sep 13, 2024

Please note that the window doesn't have to open and close so quickly; the low time delay is used only to reproduce the freezing issue more quickly. If you open and close windows like a typical user of the software, it will eventually freeze at some point.

@andrewmd5
Copy link

andrewmd5 commented Sep 21, 2024

I can confirm I’m seeing the same issue when restoring a window that was minimized to the tray. AOT build on the latest beta.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants