beto-rodriguez / LiveCharts2

Simple, flexible, interactive & powerful charts, maps and gauges for .Net, LiveCharts2 can now practically run everywhere Maui, Uno Platform, Blazor-wasm, WPF, WinForms, Xamarin, Avalonia, WinUI, UWP.
https://livecharts.dev
MIT License
4.32k stars 567 forks source link

My app may crash due to LiveChart #513

Closed FanIT closed 1 year ago

FanIT commented 2 years ago

Hello. My project using Avalonia and LiveChart. I have a suspiction that crashes in my app because I updated LiveChart beta.80 to beta.300. If i'm running my app in debug mode from Visual Studio to work fine, but if i'm running publish version, getting crash of the app. If i roll back to beto.80 then work fine again. In Windows event log have a event 1026 .NET Runtime.

Application: SysMonAvalonia.exe
CoreCLR Version: 6.0.522.21309
.NET Version: 6.0.5
Description: The process was terminated due to an unhandled exception.
Exception Info: System.ArgumentException: An item with the same key has already been added. Key: [9, System.Collections.Generic.List`1[Avalonia.VisualTree.IVisual]]
   at System.Collections.Generic.TreeSet`1.AddIfNotPresent(T )
   at System.Collections.Generic.SortedDictionary`2.Add(TKey , TValue )
   at Avalonia.Rendering.DirtyVisuals.Add(IVisual visual) in /_/src/Avalonia.Visuals/Rendering/DirtyVisuals.cs:line 61
   at Avalonia.Rendering.DeferredRenderer.AddDirty(IVisual visual) in /_/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 126
   at Avalonia.Visual.InvalidateVisual() in /_/src/Avalonia.Visuals/Visual.cs:line 300
   at LiveChartsCore.SkiaSharpView.Avalonia.MotionCanvas.OnCanvasCoreInvalidated(MotionCanvas`1 sender)
   at LiveChartsCore.Motion.MotionCanvas`1.Invalidate()
   at LiveChartsCore.CartesianChart`1.Measure()
   at LiveChartsCore.Chart`1.<UpdateThrottlerUnlocked>b__144_1()
   at Avalonia.Threading.JobRunner.Job.Avalonia.Threading.JobRunner.IJob.Run() in /_/src/Avalonia.Base/Threading/JobRunner.cs:line 193
   at Avalonia.Threading.JobRunner.RunJobs(Nullable`1 priority) in /_/src/Avalonia.Base/Threading/JobRunner.cs:line 37
   at Avalonia.Win32.Win32Platform.WndProc(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam) in /_/src/Windows/Avalonia.Win32/Win32Platform.cs:line 283
   at Avalonia.Win32.Interop.UnmanagedMethods.DispatchMessage(MSG& lpmsg)
   at Avalonia.Win32.Win32Platform.RunLoop(CancellationToken cancellationToken) in /_/src/Windows/Avalonia.Win32/Win32Platform.cs:line 210
   at Avalonia.Threading.Dispatcher.MainLoop(CancellationToken cancellationToken) in /_/src/Avalonia.Base/Threading/Dispatcher.cs:line 65
   at Avalonia.Controls.ApplicationLifetimes.ClassicDesktopStyleApplicationLifetime.Start(String[] args) in /_/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs:line 120
   at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime[T](T builder, String[] args, ShutdownMode shutdownMode) in /_/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs:line 209
   at SysMonAvalonia.Program.Main(String[] args)

My ChartModel

beto-rodriguez commented 2 years ago

I have seen improvements in the Avalonia renderer in the last versions, can you try to update Avalonia and see if that fixes the issue?

FanIT commented 2 years ago

@beto-rodriguez, i have updated the Avalonia to latest version 0.10.15 today, but the issue still occurs.

beto-rodriguez commented 2 years ago

This is strange, it seems an Avalonia issue I will take a look at your repo an see if I can find something there.

FanIT commented 2 years ago

Thanks. I have update my repo with an last edits. The crash doesn't occur immediately, but after some time.

FanIT commented 2 years ago

I'm have catched an exception unhandled in VS. VSscreen

FanIT commented 2 years ago

I checked several versions of LiveChart. Latest working version beta.101 for me.

beto-rodriguez commented 2 years ago

That helps a lot thanks, I actually changed the Avalonia renderer some versions ago, I will check that up.

agillet76 commented 2 years ago

Hi, Is there any update/ resolution on this issue? We are experiencing a similar problem with our application. We thought it was resolved by not displaying a tooltip on the chart but it just reduced the occurrence frequency.

FanIT commented 2 years ago

@agillet76, hi. No yet. I'm using beta.101 now. The version is working a fine for my app.

agillet76 commented 2 years ago

We observe the same issue with LiveChart and Avalonia. I tried our test application running under Visual Studio in debug mode with livechart 2.0.0-beta.101, 2.0.0-beta.300 and Avalonia 0.10.15 , 0.10.16 . The crash is sporadic it can be seconds or hours. We are updating our chart at 20 Hz , we use our charts to display temperature/pressure sensor data from our devices in real time. I have posted our test application here: https://github.com/agillet76/livechart-avalonia-crash

Exception thrown: 'System.ArgumentException' in System.Collections.dll [Visual] Exception in render loop: 'System.ArgumentException: An item with the same key has already been added. Key: [41, System.Collections.Generic.List1[Avalonia.VisualTree.IVisual]] at System.Collections.Generic.TreeSet1.AddIfNotPresent(T item) at System.Collections.Generic.SortedDictionary`2.Add(TKey key, TValue value) at Avalonia.Rendering.DirtyVisuals.Add(IVisual visual) in //src/Avalonia.Visuals/Rendering/DirtyVisuals.cs:line 56 at LiveChartsCore.SkiaSharpView.Avalonia.MotionCanvas.CustomDrawOp.Render(IDrawingContextImpl context) at Avalonia.Rendering.SceneGraph.CustomDrawOperation.Render(IDrawingContextImpl context) in //src/Avalonia.Visuals/Rendering/SceneGraph/CustomDrawOperation.cs:line 30 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 437 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 446 at Avalonia.Rendering.DeferredRenderer.RenderToLayers(Scene scene) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 492 at Avalonia.Rendering.DeferredRenderer.UpdateRenderLayersAndConsumeSceneIfNeeded(IDrawingContextImpl& context, Boolean recursiveCall) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 378 at Avalonia.Rendering.DeferredRenderer.Render(Boolean forceComposite) in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 323 at Avalonia.Rendering.DeferredRenderer.Avalonia.Rendering.IRenderLoopTask.Render() in //src/Avalonia.Visuals/Rendering/DeferredRenderer.cs:line 275 at Avalonia.Rendering.RenderLoop.TimerTick(TimeSpan time) in /_/src/Avalonia.Visuals/Rendering/RenderLoop.cs:line 147' (RenderLoop #33163964)

beto-rodriguez commented 2 years ago

I tested the latest Avalonia preview, and it seems that this issue is gone there.

This branch is ready to work with the latest Avalonia preview package.

https://github.com/beto-rodriguez/LiveCharts2/tree/avalonia-preview

FanIT commented 1 year ago

Hi, Beto. Sorry that I didn't reply for a while. I'm testing beta.502 with latest Avalonia 11 preview and i don't watching crashes my a app anymore. Thanks you. Good job. Should i close the issual?

beto-rodriguez commented 1 year ago

Thanks for the feedback!

Thanks, you. Good job.

Not only my job 😄, but the Avalonia team also improved that, and made it easier for me, maybe we should keep this open until the Avalonia Ga version is released.

hahagu commented 1 year ago

A similar issue seems to exist still on the preview version. It happens while moving the chart points via mouse in zoom.

Callstack ``` System.Private.CoreLib.dll!System.ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion() Unknown System.Private.CoreLib.dll!System.Collections.Generic.List.Enumerator.MoveNext() Unknown LiveChartsCore.dll!LiveChartsCore.Kernel.Providers.DataFactory.EnumerateChartEntities(LiveChartsCore.ISeries series, LiveChartsCore.Kernel.Sketches.IChart chart) Unknown LiveChartsCore.dll!LiveChartsCore.Kernel.Providers.DataFactory.Fetch(LiveChartsCore.ISeries series, LiveChartsCore.Kernel.Sketches.IChart chart) Unknown System.Linq.dll!System.Linq.Enumerable.WhereSelectEnumerableIteratorf__AnonymousType0>.ToArray() Unknown System.Linq.dll!System.Linq.Buffer<<>f__AnonymousType0>.Buffer(System.Collections.Generic.IEnumerable<<>f__AnonymousType0> source) Unknown System.Linq.dll!System.Linq.OrderedEnumerable<<>f__AnonymousType0>.GetEnumerator() Unknown LiveChartsCore.dll!LiveChartsCore.Kernel.Extensions.SelectFirst<<>f__AnonymousType0, LiveChartsCore.Kernel.ChartPoint>(System.Collections.Generic.IEnumerable<<>f__AnonymousType0> source, System.Func<<>f__AnonymousType0, LiveChartsCore.Kernel.ChartPoint> predicate) Unknown System.Linq.dll!System.Collections.Generic.LargeArrayBuilder.AddRange(System.Collections.Generic.IEnumerable items) Unknown System.Linq.dll!System.Collections.Generic.SparseArrayBuilder.ReserveOrAdd(System.Collections.Generic.IEnumerable items) Unknown System.Linq.dll!System.Linq.Enumerable.SelectManySingleSelectorIterator, LiveChartsCore.Kernel.ChartPoint>.ToArray() Unknown System.Linq.dll!System.Linq.Enumerable.ToArray(System.Collections.Generic.IEnumerable source) Unknown LiveChartsCore.dll!LiveChartsCore.Chart.TooltipThrottlerUnlocked.AnonymousMethod__152_1() Unknown > Avalonia.Base.dll!Avalonia.Threading.JobRunner.RunJobs(Avalonia.Threading.DispatcherPriority? priority) Line 38 C# Avalonia.Win32.dll!Avalonia.Win32.Win32Platform.WndProc(System.IntPtr hWnd, uint msg, System.IntPtr wParam, System.IntPtr lParam) Line 270 C# [Native to Managed Transition] [Managed to Native Transition] Avalonia.Win32.dll!Avalonia.Win32.Win32Platform.RunLoop(System.Threading.CancellationToken cancellationToken) Line 210 C# Avalonia.Base.dll!Avalonia.Threading.Dispatcher.MainLoop(System.Threading.CancellationToken cancellationToken) Line 62 C# Avalonia.Controls.dll!Avalonia.Controls.ApplicationLifetimes.ClassicDesktopStyleApplicationLifetime.Start(string[] args) Line 121 C# SampleProgram.dll!SampleProgram.Program.Main(string[] args) Line 14 C# ```

Untitled

hahagu commented 1 year ago

A similar issue seems to exist still on the preview version. It happens while moving the chart points via mouse in zoom.

To be exact, I think this happens while a point is updated out of the collection, and I try to go left of the curve.

beto-rodriguez commented 1 year ago

@hahagu probably a threading issue and maybe different to this report. I am seriously thinking on change the way tooltips work in the library, maybe you should try https://github.com/beto-rodriguez/LiveCharts2/issues/225#issuecomment-1012488255.

I will close this for now, since it seems that it is fixed win the latest version of Avalonia.