[debugger-agent] Ignore thread_end event if thread is detached
authorAleksey Kliger <alklig@microsoft.com>
Mon, 8 Apr 2019 19:50:38 +0000 (15:50 -0400)
committerMarek Safar <marek.safar@gmail.com>
Sat, 15 Jun 2019 07:31:05 +0000 (09:31 +0200)
commit001982bbbf133bf4625169eaea385eec09eb6015
treed3efb07782ef459da405a340108e92a36c9481a6
parentb28d334f0ad181876af4ef4dc090630d76eca135
[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=<unavailable>, arg=<unavailable>, il_offset=<unavailable>, ctx=<unavailable>, events=<unavailable>, suspend_policy=<unavailable>) 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=<unavailable>, tid=<unavailable>) at debugger-agent.c:3991
    frame mono/mono#6: libmonosgen-2.0.so`mono_profiler_raise_thread_stopped(tid=<unavailable>) at profiler-events.h:105
    frame mono/mono#7: libmonosgen-2.0.so`mono_thread_detach_internal(thread=<unavailable>) 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=<unavailable>) 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