Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
ee565e4
Improve JavaProxyThrowable by translating managed stack trace
grendello Jul 12, 2023
7c0a507
Update apkdiffs
grendello Jul 12, 2023
6ee31a3
Create JavaProxyThrowable with `Create` and reflection
grendello Jul 12, 2023
7cfc3dc
Oops
grendello Jul 12, 2023
78839fb
Seal the class and add test
grendello Jul 13, 2023
b2b38b1
Merge branch 'main' into throwable-stacktrace
grendello Jul 14, 2023
ada140c
Optionally append java stack trace
grendello Jul 14, 2023
45b3e72
oops
grendello Jul 14, 2023
241ed9b
Merge branch 'main' into throwable-stacktrace
grendello Jul 17, 2023
c1cabbc
oops #2
grendello Jul 17, 2023
4c38c11
Let's see if this works
grendello Jul 17, 2023
7a8964b
Java and managed traces differ, let's see what's the difference
grendello Jul 17, 2023
1bac358
Merge branch 'main' into throwable-stacktrace
grendello Jul 18, 2023
998c012
That should do it
grendello Jul 18, 2023
a25636d
Merge branch 'main' into throwable-stacktrace
grendello Jul 18, 2023
92e5db3
Merge branch 'main' into throwable-stacktrace
grendello Jul 24, 2023
4b5b56e
Update JavaProxyThrowable.cs
grendello Jul 26, 2023
b68dcc2
Merge branch 'main' into throwable-stacktrace
grendello Jul 27, 2023
32130ab
Get the Java stack trace from `self` directly
grendello Jul 27, 2023
603f1e4
Merge branch 'throwable-stacktrace' of github.com:grendello/xamarin-a…
grendello Jul 27, 2023
cdf4714
Merge branch 'main' into throwable-stacktrace
grendello Jul 31, 2023
784014c
Address comments
grendello Jul 31, 2023
a78d466
Merge remote-tracking branch 'origin/main' into throwable-stacktrace
jonpryor Aug 18, 2023
691e075
Update ExceptionTest.cs
jonpryor Aug 22, 2023
af90f92
Fix unit test.
jonpryor Aug 22, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Optionally append java stack trace
  • Loading branch information
grendello committed Jul 14, 2023
commit ada140cdb3fe12f9b0d4f37ec4668e5053632631
2 changes: 1 addition & 1 deletion src/Mono.Android/Android.Runtime/AndroidRuntime.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public override void RaisePendingException (Exception pendingException)
{
var je = pendingException as JavaProxyThrowable;
if (je == null) {
je = JavaProxyThrowable.Create (pendingException);
je = JavaProxyThrowable.Create (pendingException, appendJavaStackTrace: true);
}
var r = new JniObjectReference (je.Handle);
JniEnvironment.Exceptions.Throw (r);
Expand Down
24 changes: 20 additions & 4 deletions src/Mono.Android/Android.Runtime/JavaProxyThrowable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ sealed class JavaProxyThrowable : Java.Lang.Error {
InnerException = innerException;
}

public static JavaProxyThrowable Create (Exception? innerException)
public static JavaProxyThrowable Create (Exception? innerException, bool appendJavaStackTrace = false)
{
if (innerException == null) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why have Exception? innerException if you're gonna throw ArgumentNullException here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was a typo

throw new ArgumentNullException (nameof (innerException));
Expand All @@ -25,7 +25,7 @@ public static JavaProxyThrowable Create (Exception? innerException)
var proxy = new JavaProxyThrowable (innerException.Message, innerException);

try {
proxy.TranslateStackTrace ();
proxy.TranslateStackTrace (appendJavaStackTrace);
} catch {
// We shouldn't throw here, just try to do the best we can do
proxy = new JavaProxyThrowable (innerException.ToString (), innerException);
Expand All @@ -34,15 +34,25 @@ public static JavaProxyThrowable Create (Exception? innerException)
return proxy;
}

void TranslateStackTrace ()
void TranslateStackTrace (bool appendJavaStackTrace)
{
var trace = new StackTrace (InnerException, fNeedFileInfo: true);
if (trace.FrameCount <= 0) {
return;
}

StackTraceElement[]? javaTrace = null;
if (appendJavaStackTrace) {
try {
javaTrace = Java.Lang.Thread.CurrentThread ()?.GetStackTrace ();
} catch {
// Ignore
}
}

StackFrame[] frames = trace.GetFrames ();
StackTraceElement[] elements = new StackTraceElement[frames.Length];
int nElements = frames.Length + (javaTrace?.Length ?? 0);
StackTraceElement[] elements = new StackTraceElement[nElements];

for (int i = 0; i < frames.Length; i++) {
StackFrame managedFrame = frames[i];
Expand All @@ -58,6 +68,12 @@ void TranslateStackTrace ()
elements[i] = throwableFrame;
}

if (javaTrace != null) {
for (int i = frames.Length; i < nElements; i++) {
elements[i] = javaTrace[i - frames.Length];
}
}

SetStackTrace (elements);
}
}
Expand Down
2 changes: 1 addition & 1 deletion tests/Mono.Android-Tests/System/ExceptionTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ void CompareStackTraces (Exception ex, Java.Lang.Throwable throwable)
StackFrame[] managedFrames = managedTrace.GetFrames ();
Java.Lang.StackTraceElement[] javaFrames = throwable.GetStackTrace ();

Assert.AreEqual (managedFrames.Length, javaFrames.Length, "Java and managed stack traces have a different number of frames");
Assert.IsTrue (managedFrames.Length <= javaFrames.Length, "Java and managed stack traces have a different number of frames");
for (int i = 0; i < managedFrames.Length; i++) {
var mf = managedFrames[i];
var jf = javaFrames[i];
Expand Down