diff --git a/src/Mono.Android/Java.Lang/Throwable.cs b/src/Mono.Android/Java.Lang/Throwable.cs index f3005edbaad..d562565096d 100644 --- a/src/Mono.Android/Java.Lang/Throwable.cs +++ b/src/Mono.Android/Java.Lang/Throwable.cs @@ -13,7 +13,6 @@ public partial class Throwable : global::System.Exception, IJavaObject, IDisposa #endif // JAVA_INTEROP { - static IntPtr java_lang_Object_toString; protected bool is_generated; IntPtr handle; @@ -130,20 +129,45 @@ IntPtr IJavaObjectEx.ToLocalJniHandle () public override string StackTrace { get { - if (string.IsNullOrEmpty (nativeStack) && handle != IntPtr.Zero) { - using (var nativeStackWriter = new Java.IO.StringWriter ()) - using (var nativeStackPw = new Java.IO.PrintWriter (nativeStackWriter)) { - PrintStackTrace (nativeStackPw); - nativeStack = nativeStackWriter.ToString (); - } - nativeStack = base.StackTrace + Environment.NewLine + - " --- End of managed exception stack trace ---" + Environment.NewLine + - nativeStack; + return base.StackTrace + ManagedStackTraceAddendum; + } + } + + string ManagedStackTraceAddendum { + get { + var javaStack = JavaStackTrace; + if (string.IsNullOrEmpty (javaStack)) + return ""; + return Environment.NewLine + + " --- End of managed " + + GetType ().FullName + + " stack trace ---" + Environment.NewLine + + javaStack; + } + } + + string JavaStackTrace { + get { + if (!string.IsNullOrEmpty (nativeStack)) + return nativeStack; + + if (handle == IntPtr.Zero) + return null; + + using (var nativeStackWriter = new Java.IO.StringWriter ()) + using (var nativeStackPw = new Java.IO.PrintWriter (nativeStackWriter)) { + PrintStackTrace (nativeStackPw); + nativeStack = nativeStackWriter.ToString (); } return nativeStack; } } + public override string ToString () + { + return base.ToString () + ManagedStackTraceAddendum; + } + #if JAVA_INTEROP public int JniIdentityHashCode { get {return (int) key_handle;}