From 32e191c754eee34292a6707c86d14bc74e523307 Mon Sep 17 00:00:00 2001 From: kdysput Date: Mon, 7 Nov 2022 11:38:25 +0100 Subject: [PATCH] Always try to determine the library name based on the namespace available in the function name --- Runtime/Model/BacktraceUnhandledException.cs | 17 ++++++++++ Tests/Runtime/BacktraceStackTraceTests.cs | 33 ++++++++++++++++++-- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/Runtime/Model/BacktraceUnhandledException.cs b/Runtime/Model/BacktraceUnhandledException.cs index b7d7fe4b..882f19d4 100644 --- a/Runtime/Model/BacktraceUnhandledException.cs +++ b/Runtime/Model/BacktraceUnhandledException.cs @@ -242,6 +242,19 @@ private BacktraceStackFrame SetJITStackTraceInformation(string frameString) { stackFrame.FunctionName = frameString; } + + if (!string.IsNullOrEmpty(stackFrame.FunctionName)) + { + var libraryNameSeparator = stackFrame.FunctionName.IndexOf(':'); + if (libraryNameSeparator != -1) + { + stackFrame.Library = stackFrame.FunctionName.Substring(0, libraryNameSeparator).Trim(); + stackFrame.FunctionName = stackFrame.FunctionName.Substring(++libraryNameSeparator).Trim(); + } else + { + stackFrame.Library = "native"; + } + } return stackFrame; } @@ -412,6 +425,10 @@ private BacktraceStackFrame SetDefaultStackTraceInformation(string frameString, result.Library = null; } } + if (string.IsNullOrEmpty(result.Library)) + { + result.Library = result.FunctionName.Substring(0, result.FunctionName.LastIndexOf(".", result.FunctionName.IndexOf("("))); + } } return result; } diff --git a/Tests/Runtime/BacktraceStackTraceTests.cs b/Tests/Runtime/BacktraceStackTraceTests.cs index 98a773c0..4558e4b0 100644 --- a/Tests/Runtime/BacktraceStackTraceTests.cs +++ b/Tests/Runtime/BacktraceStackTraceTests.cs @@ -517,8 +517,12 @@ public void JITStackTrace_ShouldParseCorrectlyJITStackTrace_StackTraceObjectIsGe { var simpleFunctionName = "GetStacktrace"; - var functionNameWithWrappedManagedPrefix = "UnityEngine.DebugLogHandler:Internal_Log"; - var functioNamewithMonoJitCodePrefix = "ServerGameManager:SendInitialiseNetObjectToClient"; + var libraryNameWithWrappedManagedPrefix = "UnityEngine.DebugLogHandler"; + var functionNameWithWrappedManagedPrefix = "Internal_Log"; + var stackFrameWithManagedPrefix = string.Format("{0}:{1}", libraryNameWithWrappedManagedPrefix, functionNameWithWrappedManagedPrefix); + var libraryNamewithMonoJitCodePrefix = "ServerGameManager"; + var functioNamewithMonoJitCodePrefix = "SendInitialiseNetObjectToClient"; + var stackFrameWithMonoJitCodePrefix = string.Format("{0}:{1}", libraryNamewithMonoJitCodePrefix, functioNamewithMonoJitCodePrefix); var jitStackTrace = string.Format(@"#0 {0} (int) #1 DebugStringToFile(DebugStringToFileData const&) #2 DebugLogHandler_CUSTOM_Internal_Log(LogType, LogOption, ScriptingBackendNativeStringPtrOpaque*, ScriptingBackendNativeObjectPtrOpaque*) @@ -530,7 +534,7 @@ public void JITStackTrace_ShouldParseCorrectlyJITStackTrace_StackTraceObjectIsGe #8 (Mono JIT Code) FG.Common.UnityNetworkMessageHandler:HandleAndFreeInboundGameMessage (FG.Common.MessageEnvelope) #9 (Mono JIT Code) FG.Common.UnityNetworkMessageHandler:PeekAndHandleMessage (UnityEngine.Networking.NetworkMessage,FG.Common.GameConnection) #10 (Mono JIT Code) FG.Common.FG_UnityInternetNetworkManager:ServerHandleMessageReceived (UnityEngine.Networking.NetworkMessage)", - simpleFunctionName, functionNameWithWrappedManagedPrefix, functioNamewithMonoJitCodePrefix); + simpleFunctionName, stackFrameWithManagedPrefix, stackFrameWithMonoJitCodePrefix); var backtraceUnhandledException = new BacktraceUnhandledException("foo", jitStackTrace); @@ -538,7 +542,9 @@ public void JITStackTrace_ShouldParseCorrectlyJITStackTrace_StackTraceObjectIsGe Assert.AreEqual(11, backtraceUnhandledException.StackFrames.Count); Assert.AreEqual(backtraceUnhandledException.StackFrames[0].FunctionName, simpleFunctionName); Assert.AreEqual(backtraceUnhandledException.StackFrames[3].FunctionName, functionNameWithWrappedManagedPrefix); + Assert.AreEqual(backtraceUnhandledException.StackFrames[3].Library, libraryNameWithWrappedManagedPrefix); Assert.AreEqual(backtraceUnhandledException.StackFrames[4].FunctionName, functioNamewithMonoJitCodePrefix); + Assert.AreEqual(backtraceUnhandledException.StackFrames[4].Library, libraryNamewithMonoJitCodePrefix); } [Test] @@ -566,6 +572,27 @@ public void XboxStackTrace_ShouldIgnoreAndroidFrames_ShouldSetCsharpExtensionCor Assert.IsTrue(frame.FunctionName.StartsWith("Unity.Entities.")); } } + [Test] + public void LibraryName_ShouldCorrectlyFindLibraryNameOnProductionBuild_LibraryNameAvailable() + { + var defaultLibraryNamespace = "UnitTestLibrary"; + var additionalLibraryName = "AdditionalLibraryName"; + var genericLibraryName = "Generic+WithPlus"; + var stackTrace = string.Format(@"{0}.{1}.get_PlayerResults () (at <00000000000000000000000000000000>:0) + {0}.{2}.DoSomething (Session.Parameter session, System.Boolean test) (at <00000000000000000000000000000000>:0) + {0}.Generator`2[TOwner,TSignal].ProcessSignal () (at <00000000000000000000000000000000>:0) + {0}.OtherGenerator`2[TOwner,TSignal].Update () (at <00000000000000000000000000000000>:0) + {0}.State.OnUpdate () (at <00000000000000000000000000000000>:0) + {0}.DifferentState.StateUpdate () (at <00000000000000000000000000000000>:0) + {0}.State+InnerState_Active.Update (Advanced.Parameter.State state) (at <00000000000000000000000000000000>:0)", + defaultLibraryNamespace, additionalLibraryName, genericLibraryName); + + var backtraceUnhandledException = new BacktraceUnhandledException("foo", stackTrace); + + Assert.AreEqual(backtraceUnhandledException.StackFrames[0].Library, string.Format("{0}.{1}", defaultLibraryNamespace, additionalLibraryName)); + Assert.AreEqual(backtraceUnhandledException.StackFrames[1].Library, string.Format("{0}.{1}", defaultLibraryNamespace, genericLibraryName)); + + } internal string ConvertStackTraceToString(List data) {