Trying to remove the usage of unhandled_exception function to make debugger handle with an exception when running on android.
We should ignore the try catch that is in an WRAPPER_SUBTYPE_ICALL_WRAPPER, then we can walk through all the callstack and find any try catch in managed code if it exists.
Co-authored-by: thaystg <thaystg@users.noreply.github.com>
}
static void
-stub_debugger_agent_unhandled_exception (MonoException *exc)
-{
- g_assert_not_reached ();
-}
-
-static void
stub_debugger_agent_single_step_from_context (MonoContext *ctx)
{
g_assert_not_reached ();
cbs.single_step_from_context = stub_debugger_agent_single_step_from_context;
cbs.breakpoint_from_context = stub_debugger_agent_breakpoint_from_context;
cbs.free_domain_info = stub_debugger_agent_free_domain_info;
- cbs.unhandled_exception = stub_debugger_agent_unhandled_exception;
cbs.handle_exception = stub_debugger_agent_handle_exception;
cbs.begin_exception_filter = stub_debugger_agent_begin_exception_filter;
cbs.end_exception_filter = stub_debugger_agent_end_exception_filter;
}
static void
-debugger_agent_unhandled_exception (MonoException *exc)
-{
- int suspend_policy;
- GSList *events;
- EventInfo ei;
-
- if (!inited)
- return;
-
- memset (&ei, 0, sizeof (ei));
- ei.exc = (MonoObject*)exc;
-
- mono_loader_lock ();
- events = create_event_list (EVENT_KIND_EXCEPTION, NULL, NULL, &ei, &suspend_policy);
- mono_loader_unlock ();
-
- process_event (EVENT_KIND_EXCEPTION, &ei, 0, NULL, events, suspend_policy);
-}
-
-static void
debugger_agent_handle_exception (MonoException *exc, MonoContext *throw_ctx,
MonoContext *catch_ctx, StackFrameInfo *catch_frame)
{
cbs.single_step_from_context = debugger_agent_single_step_from_context;
cbs.breakpoint_from_context = debugger_agent_breakpoint_from_context;
cbs.free_domain_info = debugger_agent_free_domain_info;
- cbs.unhandled_exception = debugger_agent_unhandled_exception;
cbs.handle_exception = debugger_agent_handle_exception;
cbs.begin_exception_filter = debugger_agent_begin_exception_filter;
cbs.end_exception_filter = debugger_agent_end_exception_filter;
void (*single_step_from_context) (MonoContext *ctx);
void (*breakpoint_from_context) (MonoContext *ctx);
void (*free_domain_info) (MonoDomain *domain);
- void (*unhandled_exception) (MonoException *exc);
void (*handle_exception) (MonoException *exc, MonoContext *throw_ctx,
MonoContext *catch_ctx, StackFrameInfo *catch_frame);
void (*begin_exception_filter) (MonoException *exc, MonoContext *ctx, MonoContext *orig_ctx);
if (method->wrapper_type == MONO_WRAPPER_NATIVE_TO_MANAGED && ftnptr_eh_callback) {
result = MONO_FIRST_PASS_CALLBACK_TO_NATIVE;
}
-
-
+
+#if defined(HOST_ANDROID) || defined(TARGET_ANDROID)
+ //ignore the try catch in the .. icall_wrapper call
+ if (method->wrapper_type == WRAPPER_SUBTYPE_ICALL_WRAPPER) {
+ *ctx = new_ctx;
+ continue;
+ }
+#endif
+
for (i = clause_index_start; i < ji->num_clauses; i++) {
MonoJitExceptionInfo *ei = &ji->clauses [i];
gboolean filtered = FALSE;
mono_add_internal_call_internal ("Mono.Runtime::mono_runtime_cleanup_handlers",
mono_runtime_cleanup_handlers);
-#if defined(HOST_ANDROID) || defined(TARGET_ANDROID)
- mono_add_internal_call_internal ("System.Diagnostics.Debugger::Mono_UnhandledException_internal",
- mini_get_dbg_callbacks ()->unhandled_exception);
-#endif
-
/*
* It's important that we pass `TRUE` as the last argument here, as
* it causes the JIT to omit a wrapper for these icalls. If the JIT