From 2d40f011d1438daffce06966793b92945c94e953 Mon Sep 17 00:00:00 2001 From: kdysput Date: Thu, 23 Jun 2022 00:18:29 +0200 Subject: [PATCH 1/5] WiP --- Runtime/BacktraceDatabase.cs | 14 +++++++++- .../Model/Breadcrumbs/BacktraceBreadcrumbs.cs | 6 +++++ .../IArchiveableBreadcrumbManager.cs | 11 ++++++++ .../IArchiveableBreadcrumbManager.cs.meta | 11 ++++++++ .../Storage/BacktraceStorageLogManager.cs | 26 +++++++++++++++++-- 5 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs create mode 100644 Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs.meta diff --git a/Runtime/BacktraceDatabase.cs b/Runtime/BacktraceDatabase.cs index d336fe57..f87bc546 100644 --- a/Runtime/BacktraceDatabase.cs +++ b/Runtime/BacktraceDatabase.cs @@ -622,7 +622,19 @@ protected virtual void LoadReports() { return; } - var files = BacktraceDatabaseFileContext.GetRecords(); + var files = BacktraceDatabaseFileContext.GetRecords().ToArray(); + if(files.Length == 0) + { + return; + } + string breadcrumbPath = string.Empty; + string breadcrumbArchive = string.Empty; + + if(Breadcrumbs != null) + { + breadcrumbPath = Breadcrumbs.GetBreadcrumbLogPath(); + breadcrumbArchive = Breadcrumbs.Archi + } foreach (var file in files) { var record = BacktraceDatabaseRecord.ReadFromFile(file); diff --git a/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs b/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs index 3312d03d..0b74f874 100644 --- a/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs +++ b/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs @@ -29,6 +29,7 @@ internal sealed class BacktraceBreadcrumbs : IBacktraceBreadcrumbs /// Determine if breadcrumbs are enabled /// private bool _enabled = false; + public BacktraceBreadcrumbs(IBacktraceLogManager logManager, BacktraceBreadcrumbType level, UnityEngineLogLevel unityLogLevel) { BreadcrumbsLevel = level; @@ -191,5 +192,10 @@ public static bool CanStoreBreadcrumbs(UnityEngineLogLevel logLevel, BacktraceBr { return backtraceBreadcrumbsLevel != BacktraceBreadcrumbType.None && logLevel != UnityEngineLogLevel.None; } + public string Archive() + { + return LogManager.Archive() + + } } } diff --git a/Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs b/Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs new file mode 100644 index 00000000..3944f8ab --- /dev/null +++ b/Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs @@ -0,0 +1,11 @@ +namespace Backtrace.Unity.Model.Breadcrumbs +{ + internal interface IArchiveableBreadcrumbManager + { + /// + /// Archive current breadcrumb file + /// + /// Path to the archived breadcurmb file if archiving process went successfully. Otherwise empty string. + string Archive(); + } +} diff --git a/Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs.meta b/Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs.meta new file mode 100644 index 00000000..dfe52480 --- /dev/null +++ b/Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 11e0df6317b5a1e499757f8c0a743a58 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs b/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs index 6b69b236..45e79053 100644 --- a/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs +++ b/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs @@ -7,7 +7,7 @@ namespace Backtrace.Unity.Model.Breadcrumbs.Storage { - internal sealed class BacktraceStorageLogManager : IBacktraceLogManager + internal sealed class BacktraceStorageLogManager : IBacktraceLogManager, IArchiveableBreadcrumbManager { /// /// Path to the breadcrumbs file @@ -86,6 +86,11 @@ public long BreadcrumbsSize /// private readonly Queue _logSize = new Queue(); + /// + /// Breadcrumb storage directory + /// + private readonly string _storagePath; + internal IBreadcrumbFile BreadcrumbFile { get; set; } public BacktraceStorageLogManager(string storagePath) @@ -94,7 +99,8 @@ public BacktraceStorageLogManager(string storagePath) { throw new ArgumentException("Breadcrumbs storage path is null or empty"); } - BreadcrumbsFilePath = Path.Combine(storagePath, BreadcrumbLogFileName); + _storagePath = storagePath; + BreadcrumbsFilePath = Path.Combine(_storagePath, BreadcrumbLogFileName); BreadcrumbFile = new BreadcrumbFile(BreadcrumbsFilePath); } @@ -317,5 +323,21 @@ public double BreadcrumbId() { return _breadcrumbId; } + + public string Archive() + { + if (!File.Exists(BreadcrumbsFilePath)) + { + return string.Empty; + } + + var copyPath = Path.Combine(_storagePath, string.Format("{0}-1", BreadcrumbLogFilePrefix)); + if (File.Exists(copyPath)) + { + File.Delete(copyPath); + } + File.Copy(BreadcrumbsFilePath, copyPath); + return copyPath; + } } } From 709dc6ec7a21a8c1bd2466ff72626749b48927a0 Mon Sep 17 00:00:00 2001 From: kdysput Date: Mon, 4 Jul 2022 19:09:44 +0200 Subject: [PATCH 2/5] Finished breadcrumbs multi session support --- Runtime/BacktraceClient.cs | 1 - Runtime/BacktraceDatabase.cs | 20 ++++++++++++++++--- .../Model/Breadcrumbs/BacktraceBreadcrumbs.cs | 15 +++++++++++++- .../Breadcrumbs/IBacktraceBreadcrumbs.cs | 1 + .../Storage/BacktraceStorageLogManager.cs | 3 ++- 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/Runtime/BacktraceClient.cs b/Runtime/BacktraceClient.cs index 487d5169..4afb4d26 100644 --- a/Runtime/BacktraceClient.cs +++ b/Runtime/BacktraceClient.cs @@ -570,7 +570,6 @@ public void Refresh() } _nativeClient = NativeClientFactory.CreateNativeClient(Configuration, name, _breadcrumbs, scopedAttributes, nativeAttachments); AttributeProvider.AddDynamicAttributeProvider(_nativeClient); - Database.EnableBreadcrumbsSupport(); } } diff --git a/Runtime/BacktraceDatabase.cs b/Runtime/BacktraceDatabase.cs index f87bc546..33646f69 100644 --- a/Runtime/BacktraceDatabase.cs +++ b/Runtime/BacktraceDatabase.cs @@ -265,6 +265,8 @@ private void Start() LoadReports(); // remove orphaned files RemoveOrphaned(); + // enable breadcrumb support after finishing loading reports + EnableBreadcrumbsSupport(); if (DatabaseSettings.AutoSendMode) { _lastConnection = Time.unscaledTime; @@ -623,18 +625,19 @@ protected virtual void LoadReports() return; } var files = BacktraceDatabaseFileContext.GetRecords().ToArray(); - if(files.Length == 0) + if (files.Length == 0) { return; } string breadcrumbPath = string.Empty; string breadcrumbArchive = string.Empty; - if(Breadcrumbs != null) + if (Breadcrumbs != null) { breadcrumbPath = Breadcrumbs.GetBreadcrumbLogPath(); - breadcrumbArchive = Breadcrumbs.Archi + breadcrumbArchive = Breadcrumbs.Archive(); } + var shouldUseArchiveBreadcrumbArchive = !string.IsNullOrEmpty(breadcrumbArchive); foreach (var file in files) { var record = BacktraceDatabaseRecord.ReadFromFile(file); @@ -647,6 +650,17 @@ protected virtual void LoadReports() BacktraceDatabaseFileContext.Delete(record); continue; } + + // Use always the breadcrumb archive instead of the old breadcrumb file. + if (shouldUseArchiveBreadcrumbArchive) + { + bool replacementResult = record.Attachments.Remove(breadcrumbPath); + if (replacementResult) + { + record.Attachments.Add(breadcrumbArchive); + } + } + BacktraceDatabaseContext.Add(record); ValidateDatabaseSize(); record.Unlock(); diff --git a/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs b/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs index 0b74f874..26cdabaa 100644 --- a/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs +++ b/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs @@ -192,9 +192,22 @@ public static bool CanStoreBreadcrumbs(UnityEngineLogLevel logLevel, BacktraceBr { return backtraceBreadcrumbsLevel != BacktraceBreadcrumbType.None && logLevel != UnityEngineLogLevel.None; } + /// + /// Archives a breadcrumb file from the previous session. + /// + /// + /// Path to the archived breadcrumb library. + /// If the operation failed then the method returns + /// an empty string. + /// public string Archive() { - return LogManager.Archive() + var breadcrumbArchiveManager = LogManager as IArchiveableBreadcrumbManager; + if (breadcrumbArchiveManager == null) + { + return string.Empty; + } + return breadcrumbArchiveManager.Archive(); } } diff --git a/Runtime/Model/Breadcrumbs/IBacktraceBreadcrumbs.cs b/Runtime/Model/Breadcrumbs/IBacktraceBreadcrumbs.cs index 6f5e34b2..3c559f0f 100644 --- a/Runtime/Model/Breadcrumbs/IBacktraceBreadcrumbs.cs +++ b/Runtime/Model/Breadcrumbs/IBacktraceBreadcrumbs.cs @@ -29,5 +29,6 @@ public interface IBacktraceBreadcrumbs double BreadcrumbId(); void UnregisterEvents(); void Update(); + string Archive(); } } diff --git a/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs b/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs index 45e79053..149d23be 100644 --- a/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs +++ b/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs @@ -331,7 +331,8 @@ public string Archive() return string.Empty; } - var copyPath = Path.Combine(_storagePath, string.Format("{0}-1", BreadcrumbLogFilePrefix)); + const string archivePattern = "{0}-1"; + var copyPath = Path.Combine(_storagePath, string.Format(archivePattern, BreadcrumbLogFilePrefix)); if (File.Exists(copyPath)) { File.Delete(copyPath); From ca55b6e5047d10044e594e4c13254063099de49e Mon Sep 17 00:00:00 2001 From: kdysput Date: Thu, 7 Jul 2022 00:07:49 +0200 Subject: [PATCH 3/5] override file if the breadcrumb file exists --- .../Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs b/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs index 149d23be..be6462fd 100644 --- a/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs +++ b/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs @@ -333,11 +333,7 @@ public string Archive() const string archivePattern = "{0}-1"; var copyPath = Path.Combine(_storagePath, string.Format(archivePattern, BreadcrumbLogFilePrefix)); - if (File.Exists(copyPath)) - { - File.Delete(copyPath); - } - File.Copy(BreadcrumbsFilePath, copyPath); + File.Copy(BreadcrumbsFilePath, copyPath, true); return copyPath; } } From dba571b622ee8fe505df965daf273beb377baac9 Mon Sep 17 00:00:00 2001 From: kdysput Date: Fri, 8 Jul 2022 13:01:32 +0200 Subject: [PATCH 4/5] breadcrumbs archive support for Windows - simplify the breadcrumb archive flow --- Runtime/BacktraceClient.cs | 40 +++++++------- Runtime/BacktraceDatabase.cs | 54 +++++++++++++++---- Runtime/Native/IStartupMinidumpSender.cs | 11 ++++ Runtime/Native/IStartupMinidumpSender.cs.meta | 11 ++++ Runtime/Native/Windows/NativeClient.cs | 53 +----------------- Tests/Runtime/Mocks/BacktraceDatabaseMock.cs | 2 +- 6 files changed, 90 insertions(+), 81 deletions(-) create mode 100644 Runtime/Native/IStartupMinidumpSender.cs create mode 100644 Runtime/Native/IStartupMinidumpSender.cs.meta diff --git a/Runtime/BacktraceClient.cs b/Runtime/BacktraceClient.cs index 4afb4d26..fd17190b 100644 --- a/Runtime/BacktraceClient.cs +++ b/Runtime/BacktraceClient.cs @@ -320,6 +320,14 @@ public Action OnClientReportLimitReached private INativeClient _nativeClient; + internal INativeClient NativeClient + { + get + { + return _nativeClient; + } + } + public bool EnablePerformanceStatistics { get @@ -525,11 +533,6 @@ public void Refresh() #if !UNITY_WEBGL EnableMetrics(false); #endif - var nativeAttachments = _clientReportAttachments.ToList() - .Where(n => !string.IsNullOrEmpty(n)) - .OrderBy(System.IO.Path.GetFileName, StringComparer.InvariantCultureIgnoreCase) - .ToList(); - string breadcrumbsPath = string.Empty; if (Configuration.Enabled) { @@ -543,24 +546,17 @@ public void Refresh() if (_breadcrumbs != null) { breadcrumbsPath = _breadcrumbs.GetBreadcrumbLogPath(); - } } } - - // send minidump files generated by unity engine or unity game, not captured by Windows native integration - // this integration should start before native integration and before breadcrumbs integration - // to allow algorithm to send breadcrumbs file - if the breadcrumb file is available - var scopedAttributes = AttributeProvider.GenerateAttributes(false); -#if UNITY_STANDALONE_WIN - if (Configuration.SendUnhandledGameCrashesOnGameStartup && isActiveAndEnabled && Enabled) - { - StartCoroutine(Runtime.Native.Windows.NativeClient.SendUnhandledGameCrashesOnGameStartup(nativeAttachments, breadcrumbsPath, Configuration.GetFullDatabasePath(), BacktraceApi)); - } -#endif - if (Database != null) { + // send minidump files generated by unity engine or unity game, not captured by Windows native integration + // this integration should start before native integration and before breadcrumbs integration + // to allow algorithm to send breadcrumbs file - if the breadcrumb file is available + var scopedAttributes = AttributeProvider.GenerateAttributes(false); + + var nativeAttachments = GetNativeAttachments(); // avoid adding breadcurmbs file earlier - to avoid managing breadcrumb file in two places // in windows managed integration with unity crash handler // breadcrumb path is required by native integration and will be added just before native integration initialization @@ -1318,5 +1314,13 @@ private bool ShouldSkipReport(ReportFilterType type, Exception exception, string || (SkipReport != null && SkipReport.Invoke(type, exception, message)); } + + internal IList GetNativeAttachments() + { + return _clientReportAttachments.ToList() + .Where(n => !string.IsNullOrEmpty(n)) + .OrderBy(System.IO.Path.GetFileName, StringComparer.InvariantCultureIgnoreCase) + .ToList(); + } } } diff --git a/Runtime/BacktraceDatabase.cs b/Runtime/BacktraceDatabase.cs index 33646f69..d9027e68 100644 --- a/Runtime/BacktraceDatabase.cs +++ b/Runtime/BacktraceDatabase.cs @@ -4,6 +4,7 @@ using Backtrace.Unity.Model.Breadcrumbs; using Backtrace.Unity.Model.Breadcrumbs.Storage; using Backtrace.Unity.Model.Database; +using Backtrace.Unity.Runtime.Native; using Backtrace.Unity.Services; using Backtrace.Unity.Types; using System; @@ -27,6 +28,7 @@ public class BacktraceDatabase : MonoBehaviour, IBacktraceDatabase private BacktraceBreadcrumbs _breadcrumbs; + private BacktraceClient _client; /// /// Backtrace Breadcrumbs /// @@ -167,7 +169,8 @@ public void Reload() // validate configuration if (Configuration == null) { - Configuration = GetComponent().Configuration; + _client = GetComponent(); + Configuration = _client.Configuration; } if (Instance != null) { @@ -261,10 +264,39 @@ private void Start() { return; } + string breadcrumbPath = string.Empty; + string breadcrumbArchive = string.Empty; + + if (Breadcrumbs != null) + { + breadcrumbPath = Breadcrumbs.GetBreadcrumbLogPath(); + breadcrumbArchive = Breadcrumbs.Archive(); + } // load reports from hard drive - LoadReports(); + LoadReports(breadcrumbPath, breadcrumbArchive); // remove orphaned files RemoveOrphaned(); + + // send minidump files generated by unity engine or unity game, not captured by Windows native integration + // this integration should start before native integration and before breadcrumbs integration + // to allow algorithm to send breadcrumbs file - if the breadcrumb file is available +#if UNITY_STANDALONE_WIN + + var isEnabled = Enable && Configuration.SendUnhandledGameCrashesOnGameStartup && isActiveAndEnabled; + var hasNativeConfiguration = _client && _client.NativeClient != null && _client.NativeClient is IStartupMinidumpSender; + if (isEnabled && hasNativeConfiguration) + { + var client = _client.NativeClient as IStartupMinidumpSender; + var attachments = _client.GetNativeAttachments(); + if(string.IsNullOrEmpty(breadcrumbArchive)) + { + attachments.Add(breadcrumbArchive); + } + StartCoroutine(client.SendMinidumpOnStartup( + clientAttachments: attachments, + backtraceApi: BacktraceApi)); + } +#endif // enable breadcrumb support after finishing loading reports EnableBreadcrumbsSupport(); if (DatabaseSettings.AutoSendMode) @@ -618,7 +650,7 @@ protected virtual bool InitializeDatabasePaths() /// /// Load all records stored in database path /// - protected virtual void LoadReports() + protected virtual void LoadReports(string breadcrumbPath, string breadcrumbArchive) { if (!Enable) { @@ -629,14 +661,6 @@ protected virtual void LoadReports() { return; } - string breadcrumbPath = string.Empty; - string breadcrumbArchive = string.Empty; - - if (Breadcrumbs != null) - { - breadcrumbPath = Breadcrumbs.GetBreadcrumbLogPath(); - breadcrumbArchive = Breadcrumbs.Archive(); - } var shouldUseArchiveBreadcrumbArchive = !string.IsNullOrEmpty(breadcrumbArchive); foreach (var file in files) { @@ -751,6 +775,14 @@ private void IncrementBatchRetry() } } } + internal string GetBreadcrumbsPath() + { + if (_breadcrumbs == null) + { + return string.Empty; + } + return _breadcrumbs.GetBreadcrumbLogPath(); + } public bool EnableBreadcrumbsSupport() { diff --git a/Runtime/Native/IStartupMinidumpSender.cs b/Runtime/Native/IStartupMinidumpSender.cs new file mode 100644 index 00000000..bcfa64d5 --- /dev/null +++ b/Runtime/Native/IStartupMinidumpSender.cs @@ -0,0 +1,11 @@ +using Backtrace.Unity.Interfaces; +using System.Collections; +using System.Collections.Generic; + +namespace Backtrace.Unity.Runtime.Native +{ + internal interface IStartupMinidumpSender + { + IEnumerator SendMinidumpOnStartup(ICollection clientAttachments, IBacktraceApi backtraceApi); + } +} diff --git a/Runtime/Native/IStartupMinidumpSender.cs.meta b/Runtime/Native/IStartupMinidumpSender.cs.meta new file mode 100644 index 00000000..fb4a81c0 --- /dev/null +++ b/Runtime/Native/IStartupMinidumpSender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6490c25dc6b3efb4499b856e9813b022 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Native/Windows/NativeClient.cs b/Runtime/Native/Windows/NativeClient.cs index 08f87d1e..5e5a837d 100644 --- a/Runtime/Native/Windows/NativeClient.cs +++ b/Runtime/Native/Windows/NativeClient.cs @@ -19,7 +19,7 @@ [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Backtrace.Unity.Tests.Runtime")] namespace Backtrace.Unity.Runtime.Native.Windows { - internal sealed class NativeClient : NativeClientBase, INativeClient + internal sealed class NativeClient : NativeClientBase, INativeClient, IStartupMinidumpSender { [Serializable] private class ScopedAttributesContainer @@ -242,7 +242,7 @@ public void SetAttribute(string key, string value) /// /// Read directory structure in the native crash directory and send new crashes to Backtrace /// - public static IEnumerator SendUnhandledGameCrashesOnGameStartup(ICollection clientAttachments, string breadcrumbPath, string databasePath, IBacktraceApi backtraceApi) + public IEnumerator SendMinidumpOnStartup(ICollection clientAttachments, IBacktraceApi backtraceApi) { // Path to the native crash directory string nativeCrashesDir = Path.Combine( @@ -258,25 +258,6 @@ public static IEnumerator SendUnhandledGameCrashesOnGameStartup(ICollection() : new List(clientAttachments); - // make sure - when user close game in the middle of sending data, the library won't have a chance to clean up temporary breadcurmb - // file. Becuase of that we prefer to always check if we need to clean something that left in the previous application session - - string breadcrumbsCopyName = string.Format("{0}-1", BacktraceStorageLogManager.BreadcrumbLogFilePrefix); - string breadcrumbCopyPath = Path.Combine(databasePath, breadcrumbsCopyName); - if (File.Exists(breadcrumbCopyPath)) - { - File.Delete(breadcrumbCopyPath); - } - - - // determine if handler should create a copy of a breadcrumb file - // on the application startup. This check also prevents a situation when - // algorithm will try to copy a breacrumb file when a breadcrumbs file doesn't exist - // Client prefers to make a copy of a breadcrumb file in the database directory. Otherwise, if database - // for any reason in new session is not available, algorithm shouldn't make a copy. - bool requireBreadcrumbsCopy = string.IsNullOrEmpty(breadcrumbPath) || string.IsNullOrEmpty(databasePath) ? false : true; - bool copiedFile = false; - var crashDirs = Directory.GetDirectories(nativeCrashesDir); IDictionary attributes = GetScopedAttributes(); @@ -299,23 +280,6 @@ public static IEnumerator SendUnhandledGameCrashesOnGameStartup(ICollection n != minidumpPath).ToList(); yield return backtraceApi.SendMinidump(minidumpPath, dumpAttachment, attributes, (BacktraceResult result) => { @@ -325,19 +289,6 @@ public static IEnumerator SendUnhandledGameCrashesOnGameStartup(ICollection Date: Mon, 11 Jul 2022 14:17:43 +0200 Subject: [PATCH 5/5] Code review adjustements --- Runtime/BacktraceClient.cs | 2 +- Runtime/BacktraceDatabase.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/BacktraceClient.cs b/Runtime/BacktraceClient.cs index fd17190b..9029d0d5 100644 --- a/Runtime/BacktraceClient.cs +++ b/Runtime/BacktraceClient.cs @@ -1317,7 +1317,7 @@ private bool ShouldSkipReport(ReportFilterType type, Exception exception, string internal IList GetNativeAttachments() { - return _clientReportAttachments.ToList() + return _clientReportAttachments .Where(n => !string.IsNullOrEmpty(n)) .OrderBy(System.IO.Path.GetFileName, StringComparer.InvariantCultureIgnoreCase) .ToList(); diff --git a/Runtime/BacktraceDatabase.cs b/Runtime/BacktraceDatabase.cs index 1375fdec..ff4eb13d 100644 --- a/Runtime/BacktraceDatabase.cs +++ b/Runtime/BacktraceDatabase.cs @@ -288,7 +288,7 @@ private void Start() { var client = _client.NativeClient as IStartupMinidumpSender; var attachments = _client.GetNativeAttachments(); - if(string.IsNullOrEmpty(breadcrumbArchive)) + if(!string.IsNullOrEmpty(breadcrumbArchive)) { attachments.Add(breadcrumbArchive); }