bcssov / IronyModManager

Mod Manager for Paradox Games. Official Discord: https://discord.gg/t9JmY8KFrV
https://bcssov.github.io/IronyModManager/
MIT License
351 stars 41 forks source link

Irony crashed when merge-compress'ing mods #414

Closed tinkerware closed 1 year ago

tinkerware commented 1 year ago

Describe the bug My Irony instance crashed during the merge operation after I chose "Merge (Compress)" in my Stellaris mod collection. I have 64 mods including an Irony patch mod enabled (patch mod was made by resolving default w/o l18n, nothing that I resolved by hand) in the collection. I ended up with a half-baked directory of zipped mod files in the mod folder afterwards.

To Reproduce Steps to reproduce the behavior:

  1. Import the attached collection and resolve conflicts using "default w/o localization".
  2. Choose "Merge (compress)" in the collection
  3. Wait until crash

Full_Blown_3.5.json.zip

Expected behavior I expected compressed mods to be saved in my Stellaris mods directory. After the crash, I expected to see that nothing from the partially compressed mods to be in my mod folder.

Logs

I have the following log output in a Fatal Error dialog that came up after the crash.

Unhandled error ocurred. Please use this information to file a bug report:

2022-11-25 15:55:29.0304 Version: 1.24.93+b448c18ba0
OS Description: Darwin 21.6.0 Darwin Kernel Version 21.6.0: Thu Sep 29 20:12:57 PDT 2022; root:xnu-8020.240.7~1/RELEASE_X86_64
Runtime Identifier: osx.12-x64
 ReactiveUI.UnhandledErrorException: An object implementing IHandleObservableErrors (often a ReactiveCommand or ObservableAsPropertyHelper) has errored, thereby breaking its observable pipeline. To prevent this, ensure the pipeline does not error, or Subscribe to the ThrownExceptions property of the object in question to handle the erroneous case.
 ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Ionic.Zlib.ParallelDeflateOutputStream._Flush(Boolean lastInput)
   at Ionic.Zlib.ParallelDeflateOutputStream.InnerClose()
   at Ionic.Zlib.ParallelDeflateOutputStream.Close()
   at Ionic.Zip.ZipEntry.FinishOutputStream(Stream s, CountingStream entryCounter, Stream encryptor, Stream compressor, CrcCalculatorStream output)
   at Ionic.Zip.ZipEntry._WriteEntryData(Stream s)
   at Ionic.Zip.ZipEntry.Write(Stream s)
   at Ionic.Zip.ZipFile.Save()
   at Ionic.Zip.ZipFile.Save(String fileName)
   at IronyModManager.IO.Mods.ModMergeCompressExporter.Finalize(Int64 id, String exportPath) in D:\Working\IronyModManager\src\IronyModManager.IO\Mods\ModMergeCompressExporter.cs:line 125
   at IronyModManager.Services.ModMergeService.<>c__DisplayClass10_0.<<MergeCompressCollectionAsync>b__6>d.MoveNext() in D:\Working\IronyModManager\src\IronyModManager.Services\ModMergeService.cs:line 489
--- End of stack trace from previous location ---
   at IronyModManager.Services.ModMergeService.MergeCompressCollectionAsync(String collectionName, String copiedNamePrefix) in D:\Working\IronyModManager\src\IronyModManager.Services\ModMergeService.cs:line 508
   at IronyModManager.ViewModels.Controls.ModifyCollectionControlViewModel.<>c__DisplayClass102_3.<<OnActivated>b__16>d.MoveNext() in D:\Working\IronyModManager\src\IronyModManager\ViewModels\Controls\ModifyCollectionControlViewModel.cs:line 580
--- End of stack trace from previous location ---
   at IronyModManager.ViewModels.Controls.ModifyCollectionControlViewModel.<>c__DisplayClass102_0.<<OnActivated>b__6>d.MoveNext() in D:\Working\IronyModManager\src\IronyModManager\ViewModels\Controls\ModifyCollectionControlViewModel.cs:line 578
   --- End of inner exception stack trace ---
   at ReactiveUI.RxApp.<>c__DisplayClass9_0.<.cctor>b__2()
   at System.Reactive.Concurrency.Scheduler.Invoke(Action action) in /_/Rx.NET/Source/src/System.Reactive/Concurrency/Scheduler.Simple.cs:line 253
   at System.Reactive.Concurrency.Scheduler.<>c.<Schedule>b__74_0(IScheduler _, Action a) in /_/Rx.NET/Source/src/System.Reactive/Concurrency/Scheduler.Simple.cs:line 37
   at Avalonia.Threading.AvaloniaScheduler.Schedule[TState](TState state, TimeSpan dueTime, Func`3 action) in /_/src/Avalonia.Base/Threading/AvaloniaScheduler.cs:line 89
   at System.Reactive.Concurrency.Scheduler.Schedule(IScheduler scheduler, Action action) in /_/Rx.NET/Source/src/System.Reactive/Concurrency/Scheduler.Simple.cs:line 37
   at ReactiveUI.RxApp.<>c.<.cctor>b__9_1(Exception ex)
   at System.Reactive.AnonymousSafeObserver`1.OnNext(T value) in /_/Rx.NET/Source/src/System.Reactive/AnonymousSafeObserver.cs:line 54
   at System.Reactive.ObserveOnObserverNew`1.DrainStep(ConcurrentQueue`1 q) in /_/Rx.NET/Source/src/System.Reactive/Internal/ScheduledObserver.cs:line 559
   at System.Reactive.ObserveOnObserverNew`1.DrainShortRunning(IScheduler recursiveScheduler) in /_/Rx.NET/Source/src/System.Reactive/Internal/ScheduledObserver.cs:line 516
   at Avalonia.Threading.AvaloniaScheduler.<>c__DisplayClass4_1`1.<Schedule>b__1() in /_/src/Avalonia.Base/Threading/AvaloniaScheduler.cs:line 47
   at Avalonia.Threading.JobRunner.RunJobs(Nullable`1 priority) in /_/src/Avalonia.Base/Threading/JobRunner.cs:line 37
   at Avalonia.Native.PlatformThreadingInterface.SignaledCallback.Signaled(Int32 priority, Int32 priorityContainsMeaningfulValue) in /_/src/Avalonia.Native/PlatformThreadingInterface.cs:line 39
   at Avalonia.Native.Interop.Impl.__MicroComIAvnSignaledCallbackVTable.Signaled(Void* this, Int32 priority, Int32 priorityContainsMeaningfulValue) in /_/src/Avalonia.Native/Interop.Generated.cs:line 4336
--- End of stack trace from previous location ---
   at Avalonia.Native.PlatformThreadingInterface.RunLoop(CancellationToken cancellationToken) in /_/src/Avalonia.Native/PlatformThreadingInterface.cs:line 90
   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 IronyModManager.Program.Main(String[] args) in D:\Working\IronyModManager\src\IronyModManager\Program.cs:line 97

Separately, I have the following output in the console window that hosts the Irony process:

Last login: Fri Nov 25 01:51:57 on ttys001
/Users/ck/Desktop/irony-1.24/IronyModManager ; exit;

~ on 🅰 (or) underwent 1s
🕙[ 20:41:27Z ] ❯ /Users/ck/Desktop/irony-1.24/IronyModManager ; exit;
2022-11-25 15:55:29.0304|FATAL|IronyModManager.Log.Logger|Version: 1.24.93+b448c18ba0
OS Description: Darwin 21.6.0 Darwin Kernel Version 21.6.0: Thu Sep 29 20:12:57 PDT 2022; root:xnu-8020.240.7~1/RELEASE_X86_64
Runtime Identifier: osx.12-x64
|ReactiveUI.UnhandledErrorException: An object implementing IHandleObservableErrors (often a ReactiveCommand or ObservableAsPropertyHelper) has errored, thereby breaking its observable pipeline. To prevent this, ensure the pipeline does not error, or Subscribe to the ThrownExceptions property of the object in question to handle the erroneous case.
 ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Ionic.Zlib.ParallelDeflateOutputStream._Flush(Boolean lastInput)
   at Ionic.Zlib.ParallelDeflateOutputStream.InnerClose()
   at Ionic.Zlib.ParallelDeflateOutputStream.Close()
   at Ionic.Zip.ZipEntry.FinishOutputStream(Stream s, CountingStream entryCounter, Stream encryptor, Stream compressor, CrcCalculatorStream output)
   at Ionic.Zip.ZipEntry._WriteEntryData(Stream s)
   at Ionic.Zip.ZipEntry.Write(Stream s)
   at Ionic.Zip.ZipFile.Save()
   at Ionic.Zip.ZipFile.Save(String fileName)
   at IronyModManager.IO.Mods.ModMergeCompressExporter.Finalize(Int64 id, String exportPath) in D:\Working\IronyModManager\src\IronyModManager.IO\Mods\ModMergeCompressExporter.cs:line 125
   at IronyModManager.Services.ModMergeService.<>c__DisplayClass10_0.<<MergeCompressCollectionAsync>b__6>d.MoveNext() in D:\Working\IronyModManager\src\IronyModManager.Services\ModMergeService.cs:line 489
--- End of stack trace from previous location ---
   at IronyModManager.Services.ModMergeService.MergeCompressCollectionAsync(String collectionName, String copiedNamePrefix) in D:\Working\IronyModManager\src\IronyModManager.Services\ModMergeService.cs:line 508
   at IronyModManager.ViewModels.Controls.ModifyCollectionControlViewModel.<>c__DisplayClass102_3.<<OnActivated>b__16>d.MoveNext() in D:\Working\IronyModManager\src\IronyModManager\ViewModels\Controls\ModifyCollectionControlViewModel.cs:line 580
--- End of stack trace from previous location ---
   at IronyModManager.ViewModels.Controls.ModifyCollectionControlViewModel.<>c__DisplayClass102_0.<<OnActivated>b__6>d.MoveNext() in D:\Working\IronyModManager\src\IronyModManager\ViewModels\Controls\ModifyCollectionControlViewModel.cs:line 578
   --- End of inner exception stack trace ---
   at ReactiveUI.RxApp.<>c__DisplayClass9_0.<.cctor>b__2()
   at System.Reactive.Concurrency.Scheduler.Invoke(Action action) in /_/Rx.NET/Source/src/System.Reactive/Concurrency/Scheduler.Simple.cs:line 253
   at System.Reactive.Concurrency.Scheduler.<>c.<Schedule>b__74_0(IScheduler _, Action a) in /_/Rx.NET/Source/src/System.Reactive/Concurrency/Scheduler.Simple.cs:line 37
   at Avalonia.Threading.AvaloniaScheduler.Schedule[TState](TState state, TimeSpan dueTime, Func`3 action) in /_/src/Avalonia.Base/Threading/AvaloniaScheduler.cs:line 89
   at System.Reactive.Concurrency.Scheduler.Schedule(IScheduler scheduler, Action action) in /_/Rx.NET/Source/src/System.Reactive/Concurrency/Scheduler.Simple.cs:line 37
   at ReactiveUI.RxApp.<>c.<.cctor>b__9_1(Exception ex)
   at System.Reactive.AnonymousSafeObserver`1.OnNext(T value) in /_/Rx.NET/Source/src/System.Reactive/AnonymousSafeObserver.cs:line 54
   at System.Reactive.ObserveOnObserverNew`1.DrainStep(ConcurrentQueue`1 q) in /_/Rx.NET/Source/src/System.Reactive/Internal/ScheduledObserver.cs:line 559
   at System.Reactive.ObserveOnObserverNew`1.DrainShortRunning(IScheduler recursiveScheduler) in /_/Rx.NET/Source/src/System.Reactive/Internal/ScheduledObserver.cs:line 516
   at Avalonia.Threading.AvaloniaScheduler.<>c__DisplayClass4_1`1.<Schedule>b__1() in /_/src/Avalonia.Base/Threading/AvaloniaScheduler.cs:line 47
   at Avalonia.Threading.JobRunner.RunJobs(Nullable`1 priority) in /_/src/Avalonia.Base/Threading/JobRunner.cs:line 37
   at Avalonia.Native.PlatformThreadingInterface.SignaledCallback.Signaled(Int32 priority, Int32 priorityContainsMeaningfulValue) in /_/src/Avalonia.Native/PlatformThreadingInterface.cs:line 39
   at Avalonia.Native.Interop.Impl.__MicroComIAvnSignaledCallbackVTable.Signaled(Void* this, Int32 priority, Int32 priorityContainsMeaningfulValue) in /_/src/Avalonia.Native/Interop.Generated.cs:line 4336
--- End of stack trace from previous location ---
   at Avalonia.Native.PlatformThreadingInterface.RunLoop(CancellationToken cancellationToken) in /_/src/Avalonia.Native/PlatformThreadingInterface.cs:line 90
   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 IronyModManager.Program.Main(String[] args) in D:\Working\IronyModManager\src\IronyModManager\Program.cs:line 97
logout

Saving session...completed.

[Process completed]

Version:

bcssov commented 1 year ago

This seems like something OSX specific, I'll need more info. I do not have access to a mac machine and Irony was least tested there. Therefore can you:

  1. Hop onto Irony discord https://github.com/bcssov/IronyModManager/discussions/230
  2. Just mention this ticket once you get there and I'll provide a special binary for you which will dump more information once the crash occurs which will hopefully contain more information (name of the mod causing the issue ie)

Or alternatively can you do a full collection export and post the whole mod collection somewhere. This will be probably a few gigs large.

tinkerware commented 1 year ago

Here's the same failure, happening unconditionally with a single mod (Planetary Diversity main mod). I made a new collection with one mod in it:

Unhandled error ocurred. Please use this information to file a bug report:

2022-11-27 14:40:15.7756 Version: 1.24.93+b448c18ba0
OS Description: Darwin 21.6.0 Darwin Kernel Version 21.6.0: Thu Sep 29 20:12:57 PDT 2022; root:xnu-8020.240.7~1/RELEASE_X86_64
Runtime Identifier: osx.12-x64
 ReactiveUI.UnhandledErrorException: An object implementing IHandleObservableErrors (often a ReactiveCommand or ObservableAsPropertyHelper) has errored, thereby breaking its observable pipeline. To prevent this, ensure the pipeline does not error, or Subscribe to the ThrownExceptions property of the object in question to handle the erroneous case.
 ---> System.Exception: File with name: /Users/ck/Documents/Paradox Interactive/Stellaris/mod/(Merged)_Irony-Merge-Compress-Test-01/(Merged_Irony-Merge-Compress-Test-01)_Planetary_Diversity.zip failed to save
 ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Ionic.Zlib.ParallelDeflateOutputStream._Flush(Boolean lastInput)
   at Ionic.Zlib.ParallelDeflateOutputStream.InnerClose()
   at Ionic.Zlib.ParallelDeflateOutputStream.Close()
   at Ionic.Zip.ZipEntry.FinishOutputStream(Stream s, CountingStream entryCounter, Stream encryptor, Stream compressor, CrcCalculatorStream output)
   at Ionic.Zip.ZipEntry._WriteEntryData(Stream s)
   at Ionic.Zip.ZipEntry.Write(Stream s)
   at Ionic.Zip.ZipFile.Save()
   at Ionic.Zip.ZipFile.Save(String fileName)
   at IronyModManager.IO.Mods.ModMergeCompressExporter.Finalize(Int64 id, String exportPath) in D:\Working\IronyModManager\src\IronyModManager.IO\Mods\ModMergeCompressExporter.cs:line 127
   --- End of inner exception stack trace ---
   at IronyModManager.IO.Mods.ModMergeCompressExporter.Finalize(Int64 id, String exportPath) in D:\Working\IronyModManager\src\IronyModManager.IO\Mods\ModMergeCompressExporter.cs:line 133
   at IronyModManager.Services.ModMergeService.<>c__DisplayClass10_0.<<MergeCompressCollectionAsync>b__6>d.MoveNext() in D:\Working\IronyModManager\src\IronyModManager.Services\ModMergeService.cs:line 489
--- End of stack trace from previous location ---
   at IronyModManager.Services.ModMergeService.MergeCompressCollectionAsync(String collectionName, String copiedNamePrefix) in D:\Working\IronyModManager\src\IronyModManager.Services\ModMergeService.cs:line 508
   at IronyModManager.ViewModels.Controls.ModifyCollectionControlViewModel.<>c__DisplayClass102_3.<<OnActivated>b__16>d.MoveNext() in D:\Working\IronyModManager\src\IronyModManager\ViewModels\Controls\ModifyCollectionControlViewModel.cs:line 580
--- End of stack trace from previous location ---
   at IronyModManager.ViewModels.Controls.ModifyCollectionControlViewModel.<>c__DisplayClass102_0.<<OnActivated>b__6>d.MoveNext() in D:\Working\IronyModManager\src\IronyModManager\ViewModels\Controls\ModifyCollectionControlViewModel.cs:line 578
   --- End of inner exception stack trace ---
   at ReactiveUI.RxApp.<>c__DisplayClass9_0.<.cctor>b__2()
   at System.Reactive.Concurrency.Scheduler.Invoke(Action action) in /_/Rx.NET/Source/src/System.Reactive/Concurrency/Scheduler.Simple.cs:line 253
   at System.Reactive.Concurrency.Scheduler.<>c.<Schedule>b__74_0(IScheduler _, Action a) in /_/Rx.NET/Source/src/System.Reactive/Concurrency/Scheduler.Simple.cs:line 37
   at Avalonia.Threading.AvaloniaScheduler.Schedule[TState](TState state, TimeSpan dueTime, Func`3 action) in /_/src/Avalonia.Base/Threading/AvaloniaScheduler.cs:line 73
   at System.Reactive.Concurrency.Scheduler.Schedule(IScheduler scheduler, Action action) in /_/Rx.NET/Source/src/System.Reactive/Concurrency/Scheduler.Simple.cs:line 37
   at ReactiveUI.RxApp.<>c.<.cctor>b__9_1(Exception ex)
   at System.Reactive.AnonymousSafeObserver`1.OnNext(T value) in /_/Rx.NET/Source/src/System.Reactive/AnonymousSafeObserver.cs:line 54
   at System.Reactive.ObserveOnObserverNew`1.DrainStep(ConcurrentQueue`1 q) in /_/Rx.NET/Source/src/System.Reactive/Internal/ScheduledObserver.cs:line 559
   at System.Reactive.ObserveOnObserverNew`1.DrainShortRunning(IScheduler recursiveScheduler) in /_/Rx.NET/Source/src/System.Reactive/Internal/ScheduledObserver.cs:line 516
   at Avalonia.Threading.AvaloniaScheduler.<>c__DisplayClass4_1`1.<Schedule>b__1() in /_/src/Avalonia.Base/Threading/AvaloniaScheduler.cs:line 47
   at Avalonia.Threading.JobRunner.RunJobs(Nullable`1 priority) in /_/src/Avalonia.Base/Threading/JobRunner.cs:line 37
   at Avalonia.Native.PlatformThreadingInterface.SignaledCallback.Signaled(Int32 priority, Int32 priorityContainsMeaningfulValue) in /_/src/Avalonia.Native/PlatformThreadingInterface.cs:line 39
   at Avalonia.Native.Interop.Impl.__MicroComIAvnSignaledCallbackVTable.Signaled(Void* this, Int32 priority, Int32 priorityContainsMeaningfulValue) in /_/src/Avalonia.Native/Interop.Generated.cs:line 4336
--- End of stack trace from previous location ---
   at Avalonia.Native.PlatformThreadingInterface.RunLoop(CancellationToken cancellationToken) in /_/src/Avalonia.Native/PlatformThreadingInterface.cs:line 90
   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 IronyModManager.Program.Main(String[] args) in D:\Working\IronyModManager\src\IronyModManager\Program.cs:line 97

I tried a different mod (Amazing Space Battles) with the same results. I don't think this specific to a particular mod or an edge case with my mod collection.

bcssov commented 1 year ago

So to reiterate from discord. Had 2 different people to test compressing smallish mods (the ones I sent them) and guide them through the procedure. Both of them compressed without issues.

Try procedures I recommended on the discord.

github-actions[bot] commented 1 year ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.