From 001982bbbf133bf4625169eaea385eec09eb6015 Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Mon, 8 Apr 2019 15:50:38 -0400 Subject: [PATCH] [debugger-agent] Ignore thread_end event if thread is detached The thread_stopped profiler event can be raised by the thread_info_key_dtor tls key destructor when the thread is already doesn't have a domain set. In that case, don't call process_profiler_event since it cannot handle a thread with null TLS values. Addresses https://github.com/xamarin/xamarin-android/issues/2920 with the following stack trace ``` * thread mono/mono#20, name = 'Filter', stop reason = signal SIGSEGV: invalid address (fault address: 0xbc) * frame mono/mono#0: libmonosgen-2.0.so`mono_class_vtable_checked(domain=0x0000000000000000, klass=0x0000007200230648, error=0x00000071e92f9178) at object.c:1890 frame mono/mono#1: libmonosgen-2.0.so`get_current_thread_ptr_for_domain(domain=0x0000000000000000, thread=0x00000071ebfec508) at threads.c:595 frame mono/mono#2: libmonosgen-2.0.so`mono_thread_current at threads.c:1939 frame mono/mono#3: libmonosgen-2.0.so`process_event(event=, arg=, il_offset=, ctx=, events=, suspend_policy=) at debugger-agent.c:3715 frame mono/mono#4: libmonosgen-2.0.so`thread_end [inlined] process_profiler_event(event=EVENT_KIND_THREAD_DEATH, arg=0x00000071ebfec508) at debugger-agent.c:3875 frame mono/mono#5: libmonosgen-2.0.so`thread_end(prof=, tid=) at debugger-agent.c:3991 frame mono/mono#6: libmonosgen-2.0.so`mono_profiler_raise_thread_stopped(tid=) at profiler-events.h:105 frame mono/mono#7: libmonosgen-2.0.so`mono_thread_detach_internal(thread=) at threads.c:979 frame mono/mono#8: libmonosgen-2.0.so`thread_detach(info=0x00000071e949a000) at threads.c:3215 frame mono/mono#9: libmonosgen-2.0.so`unregister_thread(arg=) at mono-threads.c:544 frame mono/mono#10: libmonosgen-2.0.so`thread_info_key_dtor(arg=0x00000071e949a000) at mono-threads.c:774 frame mono/mono#11: 0x00000072899c58e8 libc.so`pthread_key_clean_all() + 124 frame mono/mono#12: 0x00000072899c5374 libc.so`pthread_exit + 76 frame mono/mono#13: 0x00000072899c5264 libc.so`__pthread_start(void*) + 44 frame mono/mono#14: 0x000000728996617c libc.so`__start_thread + 72 ``` Commit migrated from https://github.com/mono/mono/commit/8a0495ea3b973ae9cc2ab8662e0f815f3d08195b --- src/mono/mono/mini/debugger-agent.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/mono/mono/mini/debugger-agent.c b/src/mono/mono/mini/debugger-agent.c index 56f54b9..7138e35 100644 --- a/src/mono/mono/mini/debugger-agent.c +++ b/src/mono/mono/mini/debugger-agent.c @@ -4003,13 +4003,17 @@ thread_end (MonoProfiler *prof, uintptr_t tid) /* We might be called for threads started before we registered the start callback */ if (thread) { - DEBUG_PRINTF (1, "[%p] Thread terminated, obj=%p, tls=%p.\n", (gpointer)tid, thread, tls); + DEBUG_PRINTF (1, "[%p] Thread terminated, obj=%p, tls=%p (domain=%p).\n", (gpointer)tid, thread, tls, (gpointer)mono_domain_get ()); - if (mono_thread_internal_is_current (thread) && !mono_native_tls_get_value (debugger_tls_id) + if (mono_thread_internal_is_current (thread) && + (!mono_native_tls_get_value (debugger_tls_id) || + !mono_domain_get ()) ) { /* - * This can happen on darwin since we deregister threads using pthread dtors. - * process_profiler_event () and the code it calls cannot handle a null TLS value. + * This can happen on darwin and android since we + * deregister threads using pthread dtors. + * process_profiler_event () and the code it calls + * cannot handle a null TLS value. */ return; } -- 2.7.4