From f82a87d36bc1b7e8498d4fa1f3b06738b259c51f Mon Sep 17 00:00:00 2001 From: Delisa Mason Date: Mon, 1 Jul 2019 12:32:42 +0100 Subject: [PATCH] fix(android): Parse java exception name when message missing Not all Java exceptions have messages, so the default should be to set the class and java exception parsing style if the error class is detected. --- CHANGELOG.md | 2 ++ bugsnag-android | 2 +- src/BugsnagUnity/Payload/Exception.cs | 7 ++++++- tests/BugsnagUnity.Tests/ExceptionTests.cs | 22 ++++++++++++++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a91928924..f9cc48a53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ ### Bug fixes +* (Android) Fix error class and message parsing for uncaught Java exceptions + without message contents * Show report metadata added using `Bugsnag.Metadata.Add()` in native crash reports [#157](https://github.com/bugsnag/bugsnag-unity/pull/157) diff --git a/bugsnag-android b/bugsnag-android index f89058aa1..265efaafe 160000 --- a/bugsnag-android +++ b/bugsnag-android @@ -1 +1 @@ -Subproject commit f89058aa15ed211c14c071587f664b9565603608 +Subproject commit 265efaafe4cc45113bee1d611b573c495e3913cb diff --git a/src/BugsnagUnity/Payload/Exception.cs b/src/BugsnagUnity/Payload/Exception.cs index c3f54b657..1208aa3cd 100644 --- a/src/BugsnagUnity/Payload/Exception.cs +++ b/src/BugsnagUnity/Payload/Exception.cs @@ -141,8 +141,13 @@ public static Exception FromUnityLogMessage(UnityLogMessage logMessage, System.D { errorClass = match.Groups["errorClass"].Value; message = match.Groups["message"].Value.Trim(); - lines = new StackTrace(logMessage.StackTrace, StackTraceFormat.AndroidJava).ToArray(); } + else + { + errorClass = message; + message = ""; + } + lines = new StackTrace(logMessage.StackTrace, StackTraceFormat.AndroidJava).ToArray(); handledState = HandledState.ForUnhandledException(); } return new Exception(errorClass, message, lines, handledState); diff --git a/tests/BugsnagUnity.Tests/ExceptionTests.cs b/tests/BugsnagUnity.Tests/ExceptionTests.cs index d3d99e028..1eb29b425 100644 --- a/tests/BugsnagUnity.Tests/ExceptionTests.cs +++ b/tests/BugsnagUnity.Tests/ExceptionTests.cs @@ -52,6 +52,28 @@ public void ParseExceptionFromLogMessage() [Test] public void ParseAndroidExceptionFromLogMessage() + { + string condition = "AndroidJavaException: java.lang.IllegalArgumentException"; + string stacktrace = @"java.lang.IllegalArgumentException +com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash(CrashHelper.java:11) +com.unity3d.player.UnityPlayer.nativeRender(Native Method)"; + var logType = UnityEngine.LogType.Error; + var log = new UnityLogMessage(condition, stacktrace, logType); + var exception = Exception.FromUnityLogMessage(log, new System.Diagnostics.StackFrame[] {}, Severity.Warning); + var stack = exception.StackTrace.ToList(); + Assert.AreEqual("java.lang.IllegalArgumentException", exception.ErrorClass); + Assert.True(System.String.IsNullOrEmpty(exception.ErrorMessage)); + Assert.AreEqual(2, stack.Count); + Assert.AreEqual("com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash()", stack[0].Method); + Assert.AreEqual("CrashHelper.java", stack[0].File); + Assert.AreEqual(11, stack[0].LineNumber); + Assert.AreEqual("com.unity3d.player.UnityPlayer.nativeRender()", stack[1].Method); + Assert.AreEqual("Native Method", stack[1].File); + Assert.AreEqual(null, stack[1].LineNumber); + } + + [Test] + public void ParseAndroidExceptionAndMessageFromLogMessage() { string condition = "AndroidJavaException: java.lang.ArrayIndexOutOfBoundsException: length=2; index=2"; string stacktrace = @"java.lang.ArrayIndexOutOfBoundsException: length=2; index=2