Avalonia在X11的fvwm3下的一个奇怪问题

一个奇怪的问题困扰了我许久,就是在fvwm3下,运用dotnet构建的范例Avalonia应用,总是会报错:

Unhandled exception. System.OverflowException: Arithmetic operation resulted in an overflow.
at System.IntPtr.ToInt32()
at Avalonia.X11.Screens.X11Screens.X11Screen.UpdateWorkArea()
at Avalonia.X11.Screens.X11Screens.X11Screen.Refresh(MonitorInfo newInfo)
at Avalonia.X11.Screens.X11Screens.ScreenChanged(X11Screen screen)
at Avalonia.Platform.ScreensBase2.ScreenAdded(TScreen screen) at Avalonia.Platform.ScreensBase2.EnsureScreens()
at Avalonia.Platform.ScreensBase2.get_AllScreens() at Avalonia.X11.X11Window..ctor(AvaloniaX11Platform platform, IWindowImpl popupParent, X11WindowMode mode, Boolean overrideRedirect) at Avalonia.X11.X11Window..ctor(AvaloniaX11Platform platform, IWindowImpl popupParent, Boolean overrideRedirect) at Avalonia.X11.AvaloniaX11Platform.CreateWindow() at Avalonia.Controls.Platform.PlatformManager.CreateWindow() at Avalonia.Controls.Window..ctor() at MyApp.MainWindow..ctor() in /home/yibo/MyApp/MainWindow.axaml.cs:line 7 at MyApp.App.OnFrameworkInitializationCompleted() in /home/yibo/MyApp/App.axaml.cs:line 18 at Avalonia.AppBuilder.SetupUnsafe() at Avalonia.AppBuilder.Setup() at Avalonia.AppBuilder.SetupWithLifetime(IApplicationLifetime lifetime) at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime(AppBuilder builder, String[] args, Action1 lifetimeBuilder)
at MyApp.Program.Main(String[] args) in /home/yibo/MyApp/Program.cs:line 12
[1] 13044 IOT instruction ./MyApp

另一个成熟的AvaloniaVisualBasic6也是会报错的,和上面的一样,下面的是AvaloniaILSpy的报错.

Sorry, we crashed
System.OverflowException: Arithmetic operation resulted in an overflow.
   at Avalonia.X11.X11Screens.UpdateWorkArea(X11Info info, X11Screen[] screens) in /_/src/Avalonia.X11/X11Screens.cs:line 23
   at Avalonia.X11.X11Screens.Randr15ScreensImpl.get_Screens() in /_/src/Avalonia.X11/X11Screens.cs:line 158
   at Avalonia.X11.X11Screens.get_AllScreens() in /_/src/Avalonia.X11/X11Screens.cs:line 206
   at Avalonia.X11.X11Window..ctor(AvaloniaX11Platform platform, IWindowImpl popupParent) in /_/src/Avalonia.X11/X11Window.cs:line 108
   at Avalonia.X11.AvaloniaX11Platform.CreateWindow() in /_/src/Avalonia.X11/X11Platform.cs:line 130
   at Avalonia.Controls.Platform.PlatformManager.CreateWindow() in /_/src/Avalonia.Controls/Platform/PlatformManager.cs:line 45
   at Avalonia.Controls.Window..ctor() in /_/src/Avalonia.Controls/Window.cs:line 231
   at ICSharpCode.ILSpy.Controls.PlatformDependentWindow..ctor() in /home/runner/work/AvaloniaILSpy/AvaloniaILSpy/ILSpy.Core/Controls/PlatformDependentWindow.cs:line 14
   at ICSharpCode.ILSpy.MainWindow..ctor() in /home/runner/work/AvaloniaILSpy/AvaloniaILSpy/ILSpy.Core/MainWindow.xaml.cs:line 117
   at ICSharpCode.ILSpy.App.OnFrameworkInitializationCompleted() in /home/runner/work/AvaloniaILSpy/AvaloniaILSpy/ILSpy.Core/App.xaml.cs:line 133
   at Avalonia.Controls.AppBuilderBase`1.Setup() in /_/src/Avalonia.Controls/AppBuilderBase.cs:line 312
   at Avalonia.Controls.AppBuilderBase`1.SetupWithLifetime(IApplicationLifetime lifetime) in /_/src/Avalonia.Controls/AppBuilderBase.cs:line 179
   at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime[T](T builder, String[] args, ShutdownMode shutdownMode) in /_/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs:line 208
   at ICSharpCode.ILSpy.Program.Main(String[] args) in /home/runner/work/AvaloniaILSpy/AvaloniaILSpy/ILSpy/Program.cs:line 22

奇怪的是:在fvwm3下切换一下桌面(GotoDesk)在新的桌面下,就能正常运行了,切换回最开始的桌面,程序也能正常运行.
想知道这里的原因,感觉是avalonia的实现和fvwm3的代码不太对付,可是为什么切换一下桌面就能正常运行啦?

看起来是程序在应当用64位整数的地方用了32位,所以有些情况会溢出。具体的话,需要抓X11的包来检查了(这个我不会)。

谢谢大大回复,UpdateWindows里确实有toINT32的操作,但是因为不是从Avalonia源码编译的,只有DLL,暂时还没有在linux上改DLL的工具

奇怪的是,一切换桌面,程序就正常了~

发送的事件变了呗。它确实是在处理工作区的事件时崩的。