Bug 19343

Summary: SIGSEGV crash in garbage collector
Product: [Mono] Runtime Reporter: Marian Salaj <salajm>
Component: GCAssignee: Zoltan Varga <vargaz>
Status: RESOLVED FIXED    
Severity: normal CC: brendan.zagaeski, bsansregret, bugzilla.xamarin, joe.friedrichsen, kumpera, mark, miguel, mono-bugs+mono, mono-bugs+runtime, sebastien
Priority: Normal    
Version: 3.2.x   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Tags: Is this bug a regression?: ---
Last known good build:

Description Marian Salaj 2014-04-28 11:22:03 UTC
My code calls unmanaged function with pinvoke, this function creates thread with pthread_create and
then it calls a callback function which is managed in this new thread, then it joins this new thread with pthread_join
and then the thread ends. The problem is I'm getting SIGSEGV in function mono_threads_join_threads (thread.c) here:

if (thread != pthread_self ())
   /* This shouldn't block */
   pthread_join (thread, NULL);  <<-- here

because this code calls join the second time and the pthread_t struct is already freed from memory.

I have written a C# code which can trigger this bug:
----------------------------------------------------------------------------------------------
using System;
using System.Threading;
using System.Runtime.InteropServices;

namespace Test
{
   class Program
   {
	
	[DllImport("libpthread.so.0", SetLastError = false, EntryPoint ="pthread_create", CallingConvention = CallingConvention.Cdecl)]
	private static extern int pthread_create(out ulong thread, IntPtr attr, [MarshalAs(UnmanagedType.FunctionPtr)] Delegate d, IntPtr arg);

	[DllImport("libpthread.so.0", SetLastError = false, EntryPoint = "pthread_join", CallingConvention = CallingConvention.Cdecl)]
	private static extern int pthread_join(ulong thread, IntPtr retval);


	static void TestThread()
	{
	  Console.WriteLine("Hello!");
	  GC.Collect();
	}

	static void TestThread2()
	{
	    Console.WriteLine("Hello 2!");
	    ulong thread_t = 0;
	    int ret = pthread_create(out thread_t, IntPtr.Zero, new ThreadStart(TestThread), IntPtr.Zero);
	    int ret2 = pthread_join(thread_t, IntPtr.Zero);
	}

	static void Main(string[] args)
	{
	   ulong thread_t = 0;
	
	   while(true)
	   {
	      int ret = pthread_create(out thread_t, IntPtr.Zero, new ThreadStart(TestThread2), IntPtr.Zero);
	      GC.Collect();
	   }
	}
   }
}


----------------------------------------------------------------------------------------------

mono -V
Mono JIT compiler version 3.4.0 (tarball Thu Apr  3 13:31:26 CEST 2014)


----------------------------------------------------------------------------------------------

Stacktrace:


Native stacktrace:

        /home/user/mono/bin/mono() [0x4b206c]
        /home/user/mono/bin/mono() [0x50a23f]
        /home/user/mono/bin/mono() [0x422f97]
        /lib/x86_64-linux-gnu/libpthread.so.0(+0xf030) [0x7fdd3d338030]
        /lib/x86_64-linux-gnu/libpthread.so.0(pthread_join+0x2c) [0x7fdd3d330d8c]
        /home/user/mono/bin/mono() [0x58b075]
        /home/user/mono/bin/mono() [0x5a6126]
        /home/user/mono/bin/mono() [0x589c62]
        /home/user/mono/bin/mono() [0x62fae6]
        /lib/x86_64-linux-gnu/libpthread.so.0(+0x6b50) [0x7fdd3d32fb50]
        /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7fdd3d07a0ed]

Debug info from gdb:

Mono support loaded.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7fdd2dffe700 (LWP 24747)]
[New Thread 0x7fdd289ff700 (LWP 24694)]
[New Thread 0x7fdd2b7f9700 (LWP 24692)]
[New Thread 0x7fdd32ffd700 (LWP 24462)]
[New Thread 0x7fdd2f7ee700 (LWP 24313)]
[New Thread 0x7fdd2ffef700 (LWP 24310)]
[New Thread 0x7fdd2d7fd700 (LWP 24309)]
[New Thread 0x7fdd2e7ff700 (LWP 24308)]
[New Thread 0x7fdd337fe700 (LWP 24259)]
[New Thread 0x7fdd271fc700 (LWP 24258)]
[New Thread 0x7fdd33fff700 (LWP 23760)]
[New Thread 0x7fdd303ff700 (LWP 21568)]
[New Thread 0x7fdd39445700 (LWP 19744)]
[New Thread 0x7fdd39486700 (LWP 19743)]
[New Thread 0x7fdd39caf700 (LWP 19742)]
[New Thread 0x7fdd39cf0700 (LWP 19741)]
[New Thread 0x7fdd3a068700 (LWP 19739)]
[New Thread 0x7fdd3a973700 (LWP 19738)]
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff2719000
0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  Id   Target Id         Frame 
  19   Thread 0x7fdd3a973700 (LWP 19738) "Finalizer" 0x00007fdd3d337c1d in waitpid () from /lib/x86_64-linux-gnu/libpthread.so.0
  18   Thread 0x7fdd3a068700 (LWP 19739) "Timer-Scheduler" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  17   Thread 0x7fdd39cf0700 (LWP 19741) "Threadpool moni" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  16   Thread 0x7fdd39caf700 (LWP 19742) "Threadpool work" 0x00007fdd3d336511 in sem_timedwait () from /lib/x86_64-linux-gnu/libpthread.so.0
  15   Thread 0x7fdd39486700 (LWP 19743) "mono" 0x00007fdd3d07a743 in epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
  14   Thread 0x7fdd39445700 (LWP 19744) "IO Threadpool w" 0x00007fdd3d336511 in sem_timedwait () from /lib/x86_64-linux-gnu/libpthread.so.0
  13   Thread 0x7fdd303ff700 (LWP 21568) "Threadpool work" 0x00007fdd3d336511 in sem_timedwait () from /lib/x86_64-linux-gnu/libpthread.so.0
  12   Thread 0x7fdd33fff700 (LWP 23760) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  11   Thread 0x7fdd271fc700 (LWP 24258) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  10   Thread 0x7fdd337fe700 (LWP 24259) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  9    Thread 0x7fdd2e7ff700 (LWP 24308) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  8    Thread 0x7fdd2d7fd700 (LWP 24309) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  7    Thread 0x7fdd2ffef700 (LWP 24310) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  6    Thread 0x7fdd2f7ee700 (LWP 24313) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  5    Thread 0x7fdd32ffd700 (LWP 24462) "Threadpool work" 0x00007fdd3d336511 in sem_timedwait () from /lib/x86_64-linux-gnu/libpthread.so.0
  4    Thread 0x7fdd2b7f9700 (LWP 24692) "mono" 0x00007fdd3d336420 in sem_wait () from /lib/x86_64-linux-gnu/libpthread.so.0
  3    Thread 0x7fdd289ff700 (LWP 24694) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  2    Thread 0x7fdd2dffe700 (LWP 24747) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
* 1    Thread 0x7fdd3dde2780 (LWP 19737) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6

Debug info from gdb:

Mono support loaded.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7fdd2dffe700 (LWP 24747)]
[New Thread 0x7fdd289ff700 (LWP 24694)]
[New Thread 0x7fdd2b7f9700 (LWP 24692)]
[New Thread 0x7fdd32ffd700 (LWP 24462)]
[New Thread 0x7fdd2f7ee700 (LWP 24313)]
[New Thread 0x7fdd2ffef700 (LWP 24310)]
[New Thread 0x7fdd2d7fd700 (LWP 24309)]
[New Thread 0x7fdd2e7ff700 (LWP 24308)]
[New Thread 0x7fdd337fe700 (LWP 24259)]
[New Thread 0x7fdd271fc700 (LWP 24258)]
[New Thread 0x7fdd33fff700 (LWP 23760)]
[New Thread 0x7fdd303ff700 (LWP 21568)]
[New Thread 0x7fdd39445700 (LWP 19744)]
[New Thread 0x7fdd39486700 (LWP 19743)]
[New Thread 0x7fdd39caf700 (LWP 19742)]
[New Thread 0x7fdd39cf0700 (LWP 19741)]
[New Thread 0x7fdd3a068700 (LWP 19739)]
[New Thread 0x7fdd3a973700 (LWP 19738)]
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff2719000
0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  Id   Target Id         Frame 
  19   Thread 0x7fdd3a973700 (LWP 19738) "Finalizer" 0x00007fdd3d337c1d in waitpid () from /lib/x86_64-linux-gnu/libpthread.so.0
  18   Thread 0x7fdd3a068700 (LWP 19739) "Timer-Scheduler" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  17   Thread 0x7fdd39cf0700 (LWP 19741) "Threadpool moni" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  16   Thread 0x7fdd39caf700 (LWP 19742) "Threadpool work" 0x00007fdd3d336511 in sem_timedwait () from /lib/x86_64-linux-gnu/libpthread.so.0
  15   Thread 0x7fdd39486700 (LWP 19743) "mono" 0x00007fdd3d07a743 in epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
  14   Thread 0x7fdd39445700 (LWP 19744) "IO Threadpool w" 0x00007fdd3d336511 in sem_timedwait () from /lib/x86_64-linux-gnu/libpthread.so.0
  13   Thread 0x7fdd303ff700 (LWP 21568) "Threadpool work" 0x00007fdd3d336511 in sem_timedwait () from /lib/x86_64-linux-gnu/libpthread.so.0
  12   Thread 0x7fdd33fff700 (LWP 23760) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  11   Thread 0x7fdd271fc700 (LWP 24258) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  10   Thread 0x7fdd337fe700 (LWP 24259) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  9    Thread 0x7fdd2e7ff700 (LWP 24308) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  8    Thread 0x7fdd2d7fd700 (LWP 24309) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  7    Thread 0x7fdd2ffef700 (LWP 24310) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  6    Thread 0x7fdd2f7ee700 (LWP 24313) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  5    Thread 0x7fdd32ffd700 (LWP 24462) "Threadpool work" 0x00007fdd3d336511 in sem_timedwait () from /lib/x86_64-linux-gnu/libpthread.so.0
  4    Thread 0x7fdd2b7f9700 (LWP 24692) "mono" 0x00007fdd3d336420 in sem_wait () from /lib/x86_64-linux-gnu/libpthread.so.0
  3    Thread 0x7fdd289ff700 (LWP 24694) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
  2    Thread 0x7fdd2dffe700 (LWP 24747) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
* 1    Thread 0x7fdd3dde2780 (LWP 19737) "mono" 0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6

Thread 19 (Thread 0x7fdd3a973700 (LWP 19738)):
#0  0x00007fdd3d337c1d in waitpid () from /lib/x86_64-linux-gnu/libpthread.so.0
#1  0x00000000004b20f4 in mono_handle_native_sigsegv (signal=signal@entry=11, ctx=ctx@entry=0x7fdd3dc3fc40) at mini-exceptions.c:2305
#2  0x000000000050a23f in mono_arch_handle_altstack_exception (sigctx=sigctx@entry=0x7fdd3dc3fc40, fault_addr=<optimized out>, stack_ovf=stack_ovf@entry=0) at exceptions-amd64.c:905
#3  0x0000000000422f97 in mono_sigsegv_signal_handler (_dummy=11, info=0x7fdd3dc3fd70, context=0x7fdd3dc3fc40) at mini.c:6855
#4  <signal handler called>
#5  0x00007fdd3d330d8c in pthread_join () from /lib/x86_64-linux-gnu/libpthread.so.0
#6  0x000000000058b075 in mono_threads_join_threads () at threads.c:4771
#7  0x00000000005a6126 in finalizer_thread (unused=unused@entry=0x0) at gc.c:1104
#8  0x0000000000589c62 in start_wrapper_internal (data=0x1843530) at threads.c:647
#9  start_wrapper (data=0x1843530) at threads.c:694
#10 0x000000000062fae6 in inner_start_thread (arg=0x7ffff261cce0) at mono-threads-posix.c:94
#11 0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#12 0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#13 0x0000000000000000 in ?? ()

Thread 18 (Thread 0x7fdd3a068700 (LWP 19739)):
#0  0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000005cd134 in suspend_thread (context=0x7fdd3a067340, info=0x1b8dbf0) at sgen-os-posix.c:113
#2  suspend_handler (sig=<optimized out>, siginfo=<optimized out>, context=0x7fdd3a067340) at sgen-os-posix.c:140
#3  <signal handler called>
#4  0x00007fdd3d33464b in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0
#5  0x000000000060a4e2 in _wapi_handle_timedwait_signal_handle (handle=handle@entry=0x409, timeout=timeout@entry=0x7fdd3a067870, alertable=alertable@entry=1, poll=poll@entry=0) at handles.c:1546
#6  0x000000000061dc5c in WaitForSingleObjectEx (handle=0x409, timeout=timeout@entry=48, alertable=alertable@entry=1) at wait.c:196
#7  0x0000000000587a9e in mono_wait_uninterrupted (thread=thread@entry=0x7fdd3a9ec2d0, multiple=multiple@entry=0, numhandles=numhandles@entry=1, handles=handles@entry=0x7fdd3a067918, waitall=waitall@entry=0, ms=ms@entry=48, alertable=1) at threads.c:1312
#8  0x00000000005895b9 in ves_icall_System_Threading_WaitHandle_WaitOne_internal (this=<optimized out>, handle=0x409, ms=48, exitContext=<optimized out>) at threads.c:1444
#9  0x000000004081fd68 in ?? ()
#10 0x0000000001b92ee0 in ?? ()
#11 0x00007fdd386158e8 in ?? ()
#12 0x0000000000000038 in ?? ()
#13 0x00007fdd3a0679d0 in ?? ()
#14 0x00007fdd3a067940 in ?? ()
#15 0x0000000001b83800 in ?? ()
#16 0x0000000000000030 in ?? ()
#17 0x00007fdd3c112288 in ?? ()
#18 0x0000000000000030 in ?? ()
#19 0x00007fdd3ac9dd33 in System.Threading.WaitHandle:WaitOne (this=..., millisecondsTimeout=0, exitContext=false) at /home/user/mono-install/mono-git/mcs/class/corlib/System.Threading/WaitHandle.cs:744
#20 0x00007fdd3ac9ddd5 in System.Threading.WaitHandle:WaitOne (this=..., millisecondsTimeout=48) at /home/user/mono-install/mono-git/mcs/class/corlib/System.Threading/WaitHandle.cs:783
#21 0x00007fdd3ac9d08d in System.Threading.Timer/Scheduler:SchedulerThread (this=...) at /home/user/mono-install/mono-git/mcs/class/corlib/System.Threading/Timer.cs:706
#22 0x00007fdd3ac99a21 in System.Threading.Thread:StartInternal (this=...) at /home/user/mono-install/mono-git/mcs/class/corlib/System.Threading/Thread.cs:1378
#23 0x00000000407df1e3 in ?? ()
#24 0x0000000001b8a360 in ?? ()
#25 0x000000000063437e in monoeg_malloc (x=28877664) at gmem.c:73
#26 0x00000000006314ca in monoeg_g_hash_table_insert_replace (hash=0x7fdd3a067dd0, key=0x0, value=0x0, replace=1007753408) at ghashtable.c:258
#27 0x000000000042800b in mono_jit_runtime_invoke (method=<error reading variable: Address 0xf823e800000001be out of bounds>, obj=0x7fdd3c1118c0, params=0x7fdd3a067dd0, exc=0x1b84b70) at mini.c:6736
#28 0x00000000005ae0fb in mono_runtime_invoke (method="%s:%s ()", obj=obj@entry=0x7fdd3c1118c0, params=params@entry=0x7fdd3a067dd0, exc=exc@entry=0x0) at object.c:2828
#29 0x00000000005aed01 in mono_runtime_delegate_invoke (delegate=delegate@entry=0x7fdd3c1118c0, params=params@entry=0x7fdd3a067dd0, exc=exc@entry=0x0) at object.c:3539
#30 0x0000000000589d29 in start_wrapper_internal (data=0x1b72bc0) at threads.c:653
#31 start_wrapper (data=0x1b72bc0) at threads.c:694
#32 0x000000000062fae6 in inner_start_thread (arg=0x7ffff261ae80) at mono-threads-posix.c:94
#33 0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#34 0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#35 0x0000000000000000 in ?? ()

Thread 17 (Thread 0x7fdd39cf0700 (LWP 19741)):
#0  0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000005cd134 in suspend_thread (context=0x7fdd39cef880, info=0x1c129a0) at sgen-os-posix.c:113
#2  suspend_handler (sig=<optimized out>, siginfo=<optimized out>, context=0x7fdd39cef880) at sgen-os-posix.c:140
#3  <signal handler called>
#4  0x00007fdd3d74cfd4 in clock_nanosleep () from /lib/x86_64-linux-gnu/librt.so.1
#5  0x000000000061f0b0 in SleepEx (ms=ms@entry=500, alertable=alertable@entry=1) at wthreads.c:277
#6  0x000000000058bc73 in monitor_thread (unused=unused@entry=0x0) at threadpool.c:779
#7  0x0000000000589c62 in start_wrapper_internal (data=0x7fdd34000cb0) at threads.c:647
#8  start_wrapper (data=0x7fdd34000cb0) at threads.c:694
#9  0x000000000062fae6 in inner_start_thread (arg=0x7fdd3a067830) at mono-threads-posix.c:94
#10 0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#11 0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#12 0x0000000000000000 in ?? ()

Thread 16 (Thread 0x7fdd39caf700 (LWP 19742)):
#0  0x00007fdd3d336511 in sem_timedwait () from /lib/x86_64-linux-gnu/libpthread.so.0
#1  0x000000000062b00b in mono_sem_timedwait (sem=sem@entry=0x975028, timeout_ms=timeout_ms@entry=2000, alertable=alertable@entry=1) at mono-semaphore.c:82
#2  0x000000000058e822 in async_invoke_thread (data=0x0, data@entry=0x975000) at threadpool.c:1566
#3  0x0000000000589c62 in start_wrapper_internal (data=0x7fdd340195b0) at threads.c:647
#4  start_wrapper (data=0x7fdd340195b0) at threads.c:694
#5  0x000000000062fae6 in inner_start_thread (arg=0x7fdd3a067810) at mono-threads-posix.c:94
#6  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#7  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#8  0x0000000000000000 in ?? ()

Thread 15 (Thread 0x7fdd39486700 (LWP 19743)):
#0  0x00007fdd3d07a743 in epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x000000000058cbd4 in tp_epoll_wait (p=p@entry=0x974ec0) at ../../mono/metadata/tpool-epoll.c:118
#2  0x0000000000589c62 in start_wrapper_internal (data=0x1cc9860) at threads.c:647
#3  start_wrapper (data=0x1cc9860) at threads.c:694
#4  0x000000000062fae6 in inner_start_thread (arg=0x7ffff261c310) at mono-threads-posix.c:94
#5  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#6  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#7  0x0000000000000000 in ?? ()

Thread 14 (Thread 0x7fdd39445700 (LWP 19744)):
#0  0x00007fdd3d336511 in sem_timedwait () from /lib/x86_64-linux-gnu/libpthread.so.0
#1  0x000000000062b00b in mono_sem_timedwait (sem=sem@entry=0x974f68, timeout_ms=timeout_ms@entry=2000, alertable=alertable@entry=1) at mono-semaphore.c:82
#2  0x000000000058e822 in async_invoke_thread (data=0x0, data@entry=0x974f40) at threadpool.c:1566
#3  0x0000000000589c62 in start_wrapper_internal (data=0x1cc9860) at threads.c:647
#4  start_wrapper (data=0x1cc9860) at threads.c:694
#5  0x000000000062fae6 in inner_start_thread (arg=0x7ffff261c2f0) at mono-threads-posix.c:94
#6  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#7  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#8  0x0000000000000000 in ?? ()

Thread 13 (Thread 0x7fdd303ff700 (LWP 21568)):
#0  0x00007fdd3d336511 in sem_timedwait () from /lib/x86_64-linux-gnu/libpthread.so.0
#1  0x000000000062b00b in mono_sem_timedwait (sem=sem@entry=0x975028, timeout_ms=timeout_ms@entry=2000, alertable=alertable@entry=1) at mono-semaphore.c:82
#2  0x000000000058e822 in async_invoke_thread (data=0x0, data@entry=0x975000) at threadpool.c:1566
#3  0x0000000000589c62 in start_wrapper_internal (data=0x1e8b020) at threads.c:647
#4  start_wrapper (data=0x1e8b020) at threads.c:694
#5  0x000000000062fae6 in inner_start_thread (arg=0x7fdd39cefc50) at mono-threads-posix.c:94
#6  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#7  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#8  0x0000000000000000 in ?? ()

Thread 12 (Thread 0x7fdd33fff700 (LWP 23760)):
#0  0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000005cd134 in suspend_thread (context=0x7fdd33ffe880, info=0x1efea20) at sgen-os-posix.c:113
#2  suspend_handler (sig=<optimized out>, siginfo=<optimized out>, context=0x7fdd33ffe880) at sgen-os-posix.c:140
#3  <signal handler called>
#4  0x00007fdd3d33718b in read () from /lib/x86_64-linux-gnu/libpthread.so.0
#5  0x00007fdd38ce324d in fuse_kern_chan_receive (chp=<optimized out>, buf=0x2030860 "@", size=135168) at fuse_kern_chan.c:28
#6  0x00007fdd38ce77a2 in fuse_ll_receive_buf (se=0x1d92410, buf=0x7fdd33ffee10, chp=0x7fdd33ffee38) at fuse_lowlevel.c:2668
#7  0x00007fdd38ce38e6 in fuse_do_work (data=<optimized out>) at fuse_loop_mt.c:81
#8  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#9  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#10 0x0000000000000000 in ?? ()

Thread 11 (Thread 0x7fdd271fc700 (LWP 24258)):
#0  0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000005cd134 in suspend_thread (context=0x7fdd271fb880, info=0x1efcac0) at sgen-os-posix.c:113
#2  suspend_handler (sig=<optimized out>, siginfo=<optimized out>, context=0x7fdd271fb880) at sgen-os-posix.c:140
#3  <signal handler called>
#4  0x00007fdd3d33718b in read () from /lib/x86_64-linux-gnu/libpthread.so.0
#5  0x00007fdd38ce324d in fuse_kern_chan_receive (chp=<optimized out>, buf=0x1f5b7f0 "P", size=135168) at fuse_kern_chan.c:28
#6  0x00007fdd38ce77a2 in fuse_ll_receive_buf (se=0x1d92410, buf=0x7fdd271fbe10, chp=0x7fdd271fbe38) at fuse_lowlevel.c:2668
#7  0x00007fdd38ce38e6 in fuse_do_work (data=<optimized out>) at fuse_loop_mt.c:81
#8  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#9  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#10 0x0000000000000000 in ?? ()

Thread 10 (Thread 0x7fdd337fe700 (LWP 24259)):
#0  0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000005cd134 in suspend_thread (context=0x7fdd337fd880, info=0x1eff110) at sgen-os-posix.c:113
#2  suspend_handler (sig=<optimized out>, siginfo=<optimized out>, context=0x7fdd337fd880) at sgen-os-posix.c:140
#3  <signal handler called>
#4  0x00007fdd3d33718b in read () from /lib/x86_64-linux-gnu/libpthread.so.0
#5  0x00007fdd38ce324d in fuse_kern_chan_receive (chp=<optimized out>, buf=0x1dba420 "P", size=135168) at fuse_kern_chan.c:28
#6  0x00007fdd38ce77a2 in fuse_ll_receive_buf (se=0x1d92410, buf=0x7fdd337fde10, chp=0x7fdd337fde38) at fuse_lowlevel.c:2668
#7  0x00007fdd38ce38e6 in fuse_do_work (data=<optimized out>) at fuse_loop_mt.c:81
#8  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#9  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#10 0x0000000000000000 in ?? ()

Thread 9 (Thread 0x7fdd2e7ff700 (LWP 24308)):
#0  0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000005cd134 in suspend_thread (context=0x7fdd2e7fe880, info=0x1ddecf0) at sgen-os-posix.c:113
#2  suspend_handler (sig=<optimized out>, siginfo=<optimized out>, context=0x7fdd2e7fe880) at sgen-os-posix.c:140
#3  <signal handler called>
#4  0x00007fdd3d33718b in read () from /lib/x86_64-linux-gnu/libpthread.so.0
#5  0x00007fdd38ce324d in fuse_kern_chan_receive (chp=<optimized out>, buf=0x7fdd20040e00 "@", size=135168) at fuse_kern_chan.c:28
#6  0x00007fdd38ce77a2 in fuse_ll_receive_buf (se=0x1d92410, buf=0x7fdd2e7fee10, chp=0x7fdd2e7fee38) at fuse_lowlevel.c:2668
#7  0x00007fdd38ce38e6 in fuse_do_work (data=<optimized out>) at fuse_loop_mt.c:81
#8  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#9  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#10 0x0000000000000000 in ?? ()

Thread 8 (Thread 0x7fdd2d7fd700 (LWP 24309)):
#0  0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000005cd134 in suspend_thread (context=0x7fdd2d7fc880, info=0x1d903e0) at sgen-os-posix.c:113
#2  suspend_handler (sig=<optimized out>, siginfo=<optimized out>, context=0x7fdd2d7fc880) at sgen-os-posix.c:140
#3  <signal handler called>
#4  0x00007fdd3d33718b in read () from /lib/x86_64-linux-gnu/libpthread.so.0
#5  0x00007fdd38ce324d in fuse_kern_chan_receive (chp=<optimized out>, buf=0x1f7c800 "P", size=135168) at fuse_kern_chan.c:28
#6  0x00007fdd38ce77a2 in fuse_ll_receive_buf (se=0x1d92410, buf=0x7fdd2d7fce10, chp=0x7fdd2d7fce38) at fuse_lowlevel.c:2668
#7  0x00007fdd38ce38e6 in fuse_do_work (data=<optimized out>) at fuse_loop_mt.c:81
#8  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#9  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#10 0x0000000000000000 in ?? ()


Thread 7 (Thread 0x7fdd2ffef700 (LWP 24310)):
#0  0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000005cd134 in suspend_thread (context=0x7fdd2ffee880, info=0x1efd140) at sgen-os-posix.c:113
#2  suspend_handler (sig=<optimized out>, siginfo=<optimized out>, context=0x7fdd2ffee880) at sgen-os-posix.c:140
#3  <signal handler called>
#4  0x00007fdd3d33718b in read () from /lib/x86_64-linux-gnu/libpthread.so.0
#5  0x00007fdd38ce324d in fuse_kern_chan_receive (chp=<optimized out>, buf=0x1fe1c40 "@", size=135168) at fuse_kern_chan.c:28
#6  0x00007fdd38ce77a2 in fuse_ll_receive_buf (se=0x1d92410, buf=0x7fdd2ffeee10, chp=0x7fdd2ffeee38) at fuse_lowlevel.c:2668
#7  0x00007fdd38ce38e6 in fuse_do_work (data=<optimized out>) at fuse_loop_mt.c:81
#8  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#9  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#10 0x0000000000000000 in ?? ()

Thread 6 (Thread 0x7fdd2f7ee700 (LWP 24313)):
#0  0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000005cd134 in suspend_thread (context=0x7fdd2f7ed880, info=0x1e564f0) at sgen-os-posix.c:113
#2  suspend_handler (sig=<optimized out>, siginfo=<optimized out>, context=0x7fdd2f7ed880) at sgen-os-posix.c:140
#3  <signal handler called>
#4  0x00007fdd3d33718b in read () from /lib/x86_64-linux-gnu/libpthread.so.0
#5  0x00007fdd38ce324d in fuse_kern_chan_receive (chp=<optimized out>, buf=0x2092890 "@", size=135168) at fuse_kern_chan.c:28
#6  0x00007fdd38ce77a2 in fuse_ll_receive_buf (se=0x1d92410, buf=0x7fdd2f7ede10, chp=0x7fdd2f7ede38) at fuse_lowlevel.c:2668
#7  0x00007fdd38ce38e6 in fuse_do_work (data=<optimized out>) at fuse_loop_mt.c:81
#8  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#9  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#10 0x0000000000000000 in ?? ()

Thread 5 (Thread 0x7fdd32ffd700 (LWP 24462)):
#0  0x00007fdd3d336511 in sem_timedwait () from /lib/x86_64-linux-gnu/libpthread.so.0
#1  0x000000000062b00b in mono_sem_timedwait (sem=sem@entry=0x975028, timeout_ms=timeout_ms@entry=2000, alertable=alertable@entry=1) at mono-semaphore.c:82
#2  0x000000000058e822 in async_invoke_thread (data=0x0, data@entry=0x975000) at threadpool.c:1566
#3  0x0000000000589c62 in start_wrapper_internal (data=0x1d86f10) at threads.c:647
#4  start_wrapper (data=0x1d86f10) at threads.c:694
#5  0x000000000062fae6 in inner_start_thread (arg=0x7fdd39cefc50) at mono-threads-posix.c:94
#6  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#7  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#8  0x0000000000000000 in ?? ()

Thread 4 (Thread 0x7fdd2b7f9700 (LWP 24692)):
#0  0x00007fdd3d336420 in sem_wait () from /lib/x86_64-linux-gnu/libpthread.so.0
#1  0x000000000062af28 in mono_sem_wait (sem=0x9758a0, alertable=alertable@entry=0) at mono-semaphore.c:119
#2  0x00000000005cd2e6 in sgen_wait_for_suspend_ack (count=count@entry=13) at sgen-os-posix.c:175
#3  0x00000000005cd409 in sgen_thread_handshake (suspend=suspend@entry=1) at sgen-os-posix.c:209
#4  0x00000000005fdbb6 in sgen_stop_world (generation=generation@entry=0) at sgen-stw.c:228
#5  0x00000000005d5a92 in sgen_perform_collection (requested_size=4096, generation_to_collect=0, reason=0x706c29 "Nursery full", wait_to_finish=0) at sgen-gc.c:3154
#6  0x00000000005ef5ec in mono_gc_alloc_obj_nolock (vtable=vtable@entry=vtable(%s), size=size@entry=48) at sgen-alloc.c:314
#7  0x00000000005ef7db in mono_gc_alloc_vector (vtable=vtable(%s), size=48, max_length=5) at sgen-alloc.c:520
#8  0x00000000407e0879 in ?? ()
#9  0x0000000001efd0f0 in ?? ()
#10 0x00007fdd385c75b0 in ?? ()
#11 0x00007fdd3c24b268 in ?? ()
#12 0x00007fdd2b7f7f50 in ?? ()
#13 0x00007fdd2b7f7eb0 in ?? ()
#14 0x00007fdd2b7f96d8 in ?? ()
#15 0x0000000000000030 in ?? ()
#16 0x00000000018b0290 in ?? ()
#17 0x0000000000000005 in ?? ()
#18 0x00000000407dc414 in ?? ()
#19 0x00007fdd3c24b298 in ?? ()
#20 0x00007fdd3c24b200 in ?? ()
#21 0x0000000000000013 in ?? ()
#22 0x00007fdd3aab960c in string:CharCopy (dest=25887376, src=48, count=5) at /home/user/mono-install/mono-git/mcs/class/corlib/System/String.cs:6371
#23 0x00007fdd385c75b0 in ?? ()
#24 0x00007fdd3c24b228 in ?? ()
#25 0x00007fdd3c117dd8 in ?? ()
#26 0x00007fdd2b7f8000 in ?? ()
#27 0x00000000408823c8 in ?? ()
#28 0x00007fdd385bc2e0 in ?? ()
#29 0x00000000407f0b63 in ?? ()
#30 0x0000000000000000 in ?? ()

Thread 3 (Thread 0x7fdd289ff700 (LWP 24694)):
#0  0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000005cd134 in suspend_thread (context=0x7fdd289fe880, info=0x1e93a10) at sgen-os-posix.c:113
#2  suspend_handler (sig=<optimized out>, siginfo=<optimized out>, context=0x7fdd289fe880) at sgen-os-posix.c:140
#3  <signal handler called>
#4  0x00007fdd3d33718b in read () from /lib/x86_64-linux-gnu/libpthread.so.0
#5  0x00007fdd38ce324d in fuse_kern_chan_receive (chp=<optimized out>, buf=0x2051870 "@", size=135168) at fuse_kern_chan.c:28
#6  0x00007fdd38ce77a2 in fuse_ll_receive_buf (se=0x1d92410, buf=0x7fdd289fee10, chp=0x7fdd289fee38) at fuse_lowlevel.c:2668
#7  0x00007fdd38ce38e6 in fuse_do_work (data=<optimized out>) at fuse_loop_mt.c:81
#8  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#9  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#10 0x0000000000000000 in ?? ()

Thread 2 (Thread 0x7fdd2dffe700 (LWP 24747)):
#0  0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000005cd134 in suspend_thread (context=0x7fdd2dffd880, info=0x2091890) at sgen-os-posix.c:113
#2  suspend_handler (sig=<optimized out>, siginfo=<optimized out>, context=0x7fdd2dffd880) at sgen-os-posix.c:140
#3  <signal handler called>
#4  0x00007fdd3d33718b in read () from /lib/x86_64-linux-gnu/libpthread.so.0
#5  0x00007fdd38ce324d in fuse_kern_chan_receive (chp=<optimized out>, buf=0x1f3a6f0 "P", size=135168) at fuse_kern_chan.c:28
#6  0x00007fdd38ce77a2 in fuse_ll_receive_buf (se=0x1d92410, buf=0x7fdd2dffde10, chp=0x7fdd2dffde38) at fuse_lowlevel.c:2668
#7  0x00007fdd38ce38e6 in fuse_do_work (data=<optimized out>) at fuse_loop_mt.c:81
#8  0x00007fdd3d32fb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#9  0x00007fdd3d07a0ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
#10 0x0000000000000000 in ?? ()

Thread 1 (Thread 0x7fdd3dde2780 (LWP 19737)):
#0  0x00007fdd3cfd0824 in sigsuspend () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000005cd134 in suspend_thread (context=0x7ffff261c3c0, info=0x17fc030) at sgen-os-posix.c:113
#2  suspend_handler (sig=<optimized out>, siginfo=<optimized out>, context=0x7ffff261c3c0) at sgen-os-posix.c:140
#3  <signal handler called>
#4  0x00007fdd3d33641e in sem_wait () from /lib/x86_64-linux-gnu/libpthread.so.0
#5  0x00007fdd38ce378d in fuse_session_loop_mt (se=0x1d92410) at fuse_loop_mt.c:242
#6  0x00007fdd38ce8959 in fuse_loop_mt (f=0x1d92120) at fuse_mt.c:117
#7  0x00007fdd38ceb4f0 in fuse_main_common (argc=<optimized out>, argv=<optimized out>, op=<optimized out>, op_size=<optimized out>, user_data=<optimized out>, compat=<optimized out>) at helper.c:355
#8  0x00007fdd39202fed in mfh_fuse_main (argc=872412928, argv=0x80, ops=<optimized out>) at ./mfh.c:472
#9  0x0000000040875fb7 in ?? ()
#10 0x0000000001841ec0 in ?? ()
#11 0x00007ffff261ce80 in ?? ()
#12 0x000000000184b650 in ?? ()
#13 0x00007ffff261cb80 in ?? ()
#14 0x00007ffff261cad0 in ?? ()
#15 0x00007ffff261ce80 in ?? ()
#16 0x0000000000000001 in ?? ()
#17 0x00007ffff261ce80 in ?? ()
#18 0x00007fdd3c1297d0 in ?? ()
#19 0x0000000040875f50 in ?? ()
#20 0x00007ffff261cb80 in ?? ()
#21 0x000000004087267c in ?? ()
#22 0x00007fdd3dde2700 in ?? ()
#23 0x00007fdd3c3d6298 in ?? ()
#24 0x00007fdd3a9e4010 in ?? ()
#25 0x0000000001d67d30 in ?? ()
#26 0x00007fdd3c3d5d40 in ?? ()
#27 0x00007fdd3dc30010 in ?? ()
#28 0x0000000040872590 in ?? ()
#29 0x0000000001856200 in ?? ()
#30 0x00007fdd3a9e4010 in ?? ()
#31 0x00007fdd3c000ca8 in ?? ()
#32 0x00007ffff261cc20 in ?? ()
#33 0x00000000408218b8 in ?? ()
#34 0x0000000000000020 in ?? ()
#35 0x0000000000000000 in ?? ()

=================================================================
Got a SIGSEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================
Comment 1 Rodrigo Kumpera 2014-05-21 01:08:05 UTC
You much explicitly detach the thread you created outside of mono.
Comment 2 Marian Salaj 2014-05-21 08:48:55 UTC
Rodrigo Kumpera this is exactly the same answer you told me in another similar bug I reported and you closed it as invalid. I reopened the bug and someone else fixed it. So don't tell me it needs to be detached explicitly - I have looked at the code and I see that the detach is implicit in thread destructor handler.
If you are thinking that there is a problem in test code I provided than fix the test code. Why don't you read and think about the bug before you mark it as invalid?
Comment 3 Rodrigo Kumpera 2014-05-21 09:16:42 UTC
If you explicitly detach the thread, it won't trigger the assert in the waiting code as it won't pthread_join it.
Comment 4 Marian Salaj 2014-05-21 10:10:07 UTC
Then please tell me how to do that. I can't modify the unmanaged code. So what can I do to prevent the test code from crashing?
Comment 5 Rodrigo Kumpera 2014-05-21 10:24:19 UTC
Wrap up your managed callbacks in C code that explicitly detach after calling them.

Or, which is probably easier, avoid using pthread_join.

I wonder if you can't just create your thread using regular C# constructs and then have it call into your C code, that would solve it as you would then use the C# thread waiting facilities.
Comment 6 Marian Salaj 2014-05-21 10:57:54 UTC
The C code is creating threads when it needs them, I can't modify the C code, that means I can't remove the pthread_join and can't change the way how threads are created.
Comment 7 Adam Kemp 2014-06-05 20:18:46 UTC
This affects our code as well. We started hitting it when we updated to Xamarin.iOS 7.2.2.2.

Our Xamarin.iOS application uses a cross-platform library written in C++ to handle some low level communication with our hardware. That component uses a C API. Some of the functions in the C API take callbacks which it uses to send back notifications of interesting events. For example, in our C# code we have something like this:

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void MyCallback(IntPtr context);

    [DllImport(ImportName.DllName, EntryPoint="MyCFunc", CallingConvention=CallingConvention.Cdecl)]
    public static extern Int32 Initialize(
        MyCallback monitorCallback,
        IntPtr callbackContext);

Which in C might look like this:

    typedef void (MyCallback*)(intptr_t context);
    extern "C" void MyCFunc(MyCallback callback, intptr_t context);

Within that C API we sometimes spawn new threads to do things in the background, so those callbacks may be called in threads created by our C API. Then, at some later point, we need to shut down those threads we created, and to be safe we have to synchronize those thread shutdowns. Obviously we use pthread_join to do that. The problem is you can't pthread_join the same thread twice. That leads to the crash you see here.

The suggestions I'm seeing above seem to amount to "rearchitect your external code". That's not a valid suggestion. We have a component that knows nothing about mono or C# or anything outside of itself. It offers a plain C API. We have no problem using that API from C# on Windows (with a WPF application), and we had no problem using that same API on Xamarin.iOS up until 7.2.2.2.

This is a regression in behavior, and we don't think rewriting our code is the right solution to this issue. We think the fault is in Mono, and the fix should be there. Mono should not call pthread_join on threads it did not create. pthread_join should only ever be used on threads that your code owns. Please find an alternative way of doing whatever you're trying to do so that our application doesn't crash.
Comment 8 Miguel de Icaza [MSFT] 2014-06-05 20:28:22 UTC
Adam,

In your code, is your unmanaged code "surfacing" back into C# land? 

It seems from the sample that you showed there that you are surfacing back.
Comment 9 Adam Kemp 2014-06-05 20:32:40 UTC
Yes. The C code calls whatever callback function it's given, which in this case happens to be C# code. However, the C code doesn't know or care that its client is C#. It just has a function pointer. We do things in our managed code to ensure that the managed objects involved stick around long enough for this to work (using GCHandle).
Comment 10 Zoltan Varga 2014-06-05 21:01:20 UTC
This is indeed a regression. It should be fixed by mono master 0b5802888390331a4eba1031856c7ee3280f2875.
Comment 11 Adam Kemp 2014-06-06 17:52:29 UTC
Thank you!

When can we expect this fix in Xamarin.iOS?
Comment 12 Sebastien Pouliot 2014-06-17 22:22:34 UTC
That was released part of 7.2.6 [1] and is now in the alpha channel.

[1] http://developer.xamarin.com/releases/ios/xamarin.ios_7/xamarin.ios_7.2/
Comment 13 Zoltan Varga 2015-01-08 05:55:05 UTC
*** Bug 20502 has been marked as a duplicate of this bug. ***