AvaloniaUI / Avalonia

Develop Desktop, Embedded, Mobile and WebAssembly apps with C# and XAML. The most popular .NET UI client technology
https://avaloniaui.net
MIT License
25.49k stars 2.21k forks source link

Access violation using paths #13706

Closed tisis2 closed 10 months ago

tisis2 commented 10 months ago

Describe the bug

we implemented a chart control and there we are drawing curves by using the render method in the Control. we are drawing through the drawing context using a PolylineGeometry. somehow if we running our application with the chart that is growing over an hour after about 40 mins we get a access violation in hit testing and having a hard time to debug that further.

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Fatal error. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Repeat 2 times:
--------------------------------
at SkiaSharp.SkiaApi.sk_path_contains(IntPtr, Single, Single)
--------------------------------
at SkiaSharp.SKPath.Contains(Single, Single)
at Avalonia.Skia.GeometryImpl.PathContainsCore(SkiaSharp.SKPath, Avalonia.Point)
at Avalonia.Skia.GeometryImpl.StrokeContains(Avalonia.Media.IPen, Avalonia.Point)
at Avalonia.Rendering.Composition.Drawing.Nodes.RenderDataGeometryNode.HitTest(Avalonia.Point)
at Avalonia.Rendering.Composition.Drawing.CompositionRenderData.HitTest(Avalonia.Point)
at Avalonia.Rendering.Composition.CompositionDrawListVisual.HitTest(Avalonia.Point)
at Avalonia.Rendering.Composition.CompositionTarget.HitTestCore(Avalonia.Rendering.Composition.CompositionVisual, Avalonia.Point, Avalonia.Collections.Pooled.PooledList`1<Avalonia.Rendering.Composition.CompositionVisual>, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositionTarget.HitTestCore(Avalonia.Rendering.Composition.CompositionVisual, Avalonia.Point, Avalonia.Collections.Pooled.PooledList`1<Avalonia.Rendering.Composition.CompositionVisual>, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositionTarget.HitTestCore(Avalonia.Rendering.Composition.CompositionVisual, Avalonia.Point, Avalonia.Collections.Pooled.PooledList`1<Avalonia.Rendering.Composition.CompositionVisual>, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositionTarget.HitTestCore(Avalonia.Rendering.Composition.CompositionVisual, Avalonia.Point, Avalonia.Collections.Pooled.PooledList`1<Avalonia.Rendering.Composition.CompositionVisual>, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositionTarget.HitTestCore(Avalonia.Rendering.Composition.CompositionVisual, Avalonia.Point, Avalonia.Collections.Pooled.PooledList`1<Avalonia.Rendering.Composition.CompositionVisual>, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositionTarget.HitTestCore(Avalonia.Rendering.Composition.CompositionVisual, Avalonia.Point, Avalonia.Collections.Pooled.PooledList`1<Avalonia.Rendering.Composition.CompositionVisual>, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositionTarget.HitTestCore(Avalonia.Rendering.Composition.CompositionVisual, Avalonia.Point, Avalonia.Collections.Pooled.PooledList`1<Avalonia.Rendering.Composition.CompositionVisual>, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositionTarget.HitTestCore(Avalonia.Rendering.Composition.CompositionVisual, Avalonia.Point, Avalonia.Collections.Pooled.PooledList`1<Avalonia.Rendering.Composition.CompositionVisual>, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositionTarget.HitTestCore(Avalonia.Rendering.Composition.CompositionVisual, Avalonia.Point, Avalonia.Collections.Pooled.PooledList`1<Avalonia.Rendering.Composition.CompositionVisual>, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositionTarget.HitTestCore(Avalonia.Rendering.Composition.CompositionVisual, Avalonia.Point, Avalonia.Collections.Pooled.PooledList`1<Avalonia.Rendering.Composition.CompositionVisual>, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositionTarget.HitTestCore(Avalonia.Rendering.Composition.CompositionVisual, Avalonia.Point, Avalonia.Collections.Pooled.PooledList`1<Avalonia.Rendering.Composition.CompositionVisual>, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositionTarget.HitTestCore(Avalonia.Rendering.Composition.CompositionVisual, Avalonia.Point, Avalonia.Collections.Pooled.PooledList`1<Avalonia.Rendering.Composition.CompositionVisual>, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositionTarget.HitTestCore(Avalonia.Rendering.Composition.CompositionVisual, Avalonia.Point, Avalonia.Collections.Pooled.PooledList`1<Avalonia.Rendering.Composition.CompositionVisual>, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositionTarget.TryHitTest(Avalonia.Point, Avalonia.Rendering.Composition.CompositionVisual, System.Func`2<Avalonia.Rendering.Composition.CompositionVisual,Boolean>)
at Avalonia.Rendering.Composition.CompositingRenderer+<HitTest>d__24.MoveNext()
at System.Linq.Enumerable.TryGetFirst[[System.__Canon, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](System.Collections.Generic.IEnumerable`1<System.__Canon>, Boolean ByRef)
at System.Linq.Enumerable.FirstOrDefault[[System.__Canon, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](System.Collections.Generic.IEnumerable`1<System.__Canon>)
at Avalonia.Rendering.Composition.CompositingRenderer.HitTestFirst(Avalonia.Point, Avalonia.Visual, System.Func`2<Avalonia.Visual,Boolean>)
at Avalonia.VisualTree.VisualExtensions.GetVisualAt(Avalonia.Visual, Avalonia.Point, System.Func`2<Avalonia.Visual,Boolean>)
at Avalonia.Input.InputExtensions.InputHitTest(Avalonia.Input.IInputElement, Avalonia.Point)
at Avalonia.Input.PointerOverPreProcessor.SceneInvalidated(Avalonia.Rect)
at Avalonia.Controls.TopLevel.SceneInvalidated(System.Object, Avalonia.Rendering.SceneInvalidatedEventArgs)
at Avalonia.Rendering.Composition.CompositingRenderer+<TriggerSceneInvalidatedOnBatchCompletion>d__28.MoveNext()
at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.Threading.Tasks.VoidTaskResult, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Avalonia.Rendering.Composition.CompositingRenderer+<TriggerSceneInvalidatedOnBatchCompletion>d__28, Avalonia.Base, Version=11.0.4.0, Culture=neutral, PublicKeyToken=c8d484a7012f9a8b]].ExecutionContextCallback(System.Object)
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.Threading.Tasks.VoidTaskResult, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Avalonia.Rendering.Composition.CompositingRenderer+<TriggerSceneInvalidatedOnBatchCompletion>d__28, Avalonia.Base, Version=11.0.4.0, Culture=neutral, PublicKeyToken=c8d484a7012f9a8b]].MoveNext(System.Threading.Thread)
at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.Threading.Tasks.VoidTaskResult, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Avalonia.Rendering.Composition.CompositingRenderer+<TriggerSceneInvalidatedOnBatchCompletion>d__28, Avalonia.Base, Version=11.0.4.0, Culture=neutral, PublicKeyToken=c8d484a7012f9a8b]].MoveNext()
at System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation+<>c.<.cctor>b__8_0(System.Object)
at Avalonia.Threading.SendOrPostCallbackDispatcherOperation.InvokeCore()
at Avalonia.Threading.DispatcherOperation.Execute()
at Avalonia.Threading.Dispatcher.ExecuteJob(Avalonia.Threading.DispatcherOperation)
at Avalonia.Threading.Dispatcher.ExecuteJobsCore(Boolean)
at Avalonia.Threading.Dispatcher.Signaled()
at Avalonia.Win32.Win32DispatcherImpl.DispatchWorkItem()
at Avalonia.Win32.Win32Platform.WndProc(IntPtr, UInt32, IntPtr, IntPtr)
at Avalonia.Win32.Interop.UnmanagedMethods.DispatchMessage(MSG ByRef)
at Avalonia.Win32.Interop.UnmanagedMethods.DispatchMessage(MSG ByRef)
at Avalonia.Win32.Win32DispatcherImpl.RunLoop(System.Threading.CancellationToken)
at Avalonia.Threading.DispatcherFrame.Run(Avalonia.Threading.IControlledDispatcherImpl)
at Avalonia.Threading.Dispatcher.PushFrame(Avalonia.Threading.DispatcherFrame)
at Avalonia.Threading.Dispatcher.MainLoop(System.Threading.CancellationToken)
at Avalonia.Controls.ApplicationLifetimes.ClassicDesktopStyleApplicationLifetime.Start(System.String[])
at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime(Avalonia.AppBuilder, System.String[], Avalonia.Controls.ShutdownMode)
at Baur.Fami.Application.Program.Main(System.String[])

after seeing this output in the debug console of the IDE we tried to deactivate hit testing for the curve and gave it another try and were able to run for an hour successfully. it was just a single try so it could have been just lucky but it seems there might be an issue with hit testing here.

does anyone have an idea how to debug that further?

tisis2 commented 10 months ago

gif_72

timunie commented 10 months ago

I think this is a duplicate of #13521, so I'm closing it as duplicate. If you think it's another issue, let me know.

tisis2 commented 10 months ago

https://github.com/tisis2/Examples/tree/main/Issues/Avalonia/AccessViolationWithPaths

tisis2 commented 10 months ago

it seems that the update to 11.0.5 fixed the issue