Hi Jonathan, Thanks for your help! On 13.07.2012 17:39, Jonathan Pryor wrote: > On Jul 12, 2012, at 10:51 AM, henon wrote: >> The problem is, that I am experiencing non-deterministic hangups. When >> hanging I pause the debugger and I always see that the executing thread >> (mostly my code on the GUI thread) hangs in some random method > Which Mono for Android version? (Have you tried the 4.2.4 beta?) I use the latest update that has been automatically downloaded by MonoDevelop on Windows. I searched around but I don't find a download link for 4.2.4 beta. How do you get the beta version? How to find out the Version of Mono4Android? Monodevelop says the version of MFA is 3.0.3 but I don't believe it ;) > > Does it have non-deterministic hangups if you don't have the debugger > attached? Yes, definitely. > >> The stacktrace of the hanging thread always looks like this >> >> System.Threading.Monitor.TryEnter ... >> System.Threading.Monitor.Enter ... >> Java.Lang.Object.GetObject ... >> Java.Lang.Object._GetObject >> Java.Lang.Object.GetObject ... >> ... > You have any methods beyond that? Stacktraces:
Normal case, GuiThread in Deadlock: System.Threading.Monitor.TryEnter (obj=, millisecondsTimeout=, lockTaken=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/mono/mcs/class/corlib/System.Threading/Monitor.cs:224 System.Threading.Monitor.Enter (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/mono/mcs/class/corlib/System.Threading/Monitor.cs:198 Java.Interop.TypeManager.CreateInstance (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Interop/TypeManager.cs:172 Java.Lang.Object.GetObject (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Object.cs:226 Android.Runtime.AndroidEnvironment.GetLastThrowable (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Runtime/AndroidEnvironment.cs:57 Android.Runtime.JNIEnv.FindClass (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:258 Android.Runtime.JNIEnv.CreateInstance (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:203 Java.Lang.Thread.RunnableImplementor..ctor (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Thread.cs Java.Lang.Thread.RunnableImplementor..ctor (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Thread.cs Android.App.Activity.RunOnUiThread (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Android.App/Activity.cs:23 DeadlockRepro.Activity1.ThreadBody (Parameters=) in c:\Projects\DeadlockRepro\DeadlockRepro\Activity1.cs:40 System.Threading.Thread.StartInternal (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/mono/mcs/class/corlib/System.Threading/Thread.cs:708 I even managed to reproduce a deadlock where the finalizer Thread is involved. All 3 of 4 threads were hanging in TryEnter: First Thread: System.Threading.Monitor.TryEnter (obj=, millisecondsTimeout=, lockTaken=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/mono/mcs/class/corlib/System.Threading/Monitor.cs:224 System.Threading.Monitor.Enter (obj=The vm is not suspended., lockTaken=false) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/mono/mcs/class/corlib/System.Threading/Monitor.cs:198 Java.Lang.Object.GetObject (handle=0x4143e5c8, transfer=, type=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Object.cs:215 Java.Lang.Object._GetObject (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Object.cs:207 Java.Lang.Object.GetObject (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Object.cs:199 Java.Lang.IRunnableInvoker.n_Run (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/platforms/android-8/src/generated/Java.Lang.IRunnable.cs:68 object.96985076-ae7e-4301-b924-2b58374646b7 (Parameters=) in Second Thread: System.Threading.Monitor.TryEnter (obj=, millisecondsTimeout=, lockTaken=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/mono/mcs/class/corlib/System.Threading/Monitor.cs:224 System.Threading.Monitor.Enter (obj=The vm is not suspended., lockTaken=false) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/mono/mcs/class/corlib/System.Threading/Monitor.cs:198 Java.Lang.Object.RegisterInstance (instance=The vm is not suspended., value=0x41376938, transfer=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Object.cs:153 Java.Lang.Throwable.SetHandle (value=, transfer=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Throwable.cs:53 Java.Lang.Throwable..ctor (handle=, transfer=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Throwable.cs:22 Java.Lang.Error..ctor (javaReference=, transfer=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/platforms/android-8/src/generated/Java.Lang.Error.cs Java.Lang.LinkageError..ctor (javaReference=, transfer=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/platforms/android-8/src/generated/Java.Lang.LinkageError.cs Java.Lang.NoClassDefFoundError..ctor (javaReference=, transfer=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/platforms/android-8/src/generated/Java.Lang.NoClassDefFoundError.cs Third Thread (GUI Thread ?) Android.Runtime.JNIEnv.LogCreateLocalRef (jobject=0x0) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:391 Android.Runtime.JNIEnv.FindClass (classname="mono/java/lang/RunnableImplementor") in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:256 Android.Runtime.JNIEnv.CreateInstance (jniClassName="mono/java/lang/RunnableImplementor", signature="()V", constructorParameters={Android.Runtime.JValue[0]}) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:203 Java.Lang.Thread.RunnableImplementor..ctor (handler={System.Action}, removable=false) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Thread.cs Java.Lang.Thread.RunnableImplementor..ctor (handler={System.Action}) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Thread.cs Android.App.Activity.RunOnUiThread (action={System.Action}) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Android.App/Activity.cs:23 DeadlockRepro.Activity1.ThreadBody () in c:\Projects\DeadlockRepro\DeadlockRepro\Activity1.cs:40 System.Threading.Thread.StartInternal () in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/mono/mcs/class/corlib/System.Threading/Thread.cs:708 Finalizer Thread System.Threading.Monitor.TryEnter (obj=, millisecondsTimeout=, lockTaken=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/mono/mcs/class/corlib/System.Threading/Monitor.cs:224 System.Threading.Monitor.Enter (obj=, lockTaken=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/mono/mcs/class/corlib/System.Threading/Monitor.cs:198 Java.Lang.Object.DeregisterInstance (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Object.cs:171 Java.Lang.Object.Dispose (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Object.cs:118 Java.Lang.Throwable.Finalize (Parameters=) in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.3-branch/410a5aba/source/monodroid/src/Mono.Android/src/Java.Lang/Throwable.cs:95 Below is a very simple Mono4Android activity that reproduces the deadlock very likely (the stacktraces above are actually taken from it). Create a new Mono4AndroidProject with below code for Activity1. Nothing else is needed. I was able to reproduce the deadlock on my GalaxyTab 10.1 very easily even on first run. using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; using System.Threading; namespace DeadlockRepro { [Activity (Label = "DeadlockRepro", MainLauncher = true)] public class Activity1 : Activity { int count = 1; bool m_stop=false; Thread m_background_worker; protected override void OnCreate (Bundle bundle) { base.OnCreate (bundle); // Set our view from the "main" layout resource SetContentView (Resource.Layout.Main); // Get our button from the layout resource, // and attach an event to it //Button button = FindViewById<Button> (Resource.Id.myButton); m_background_worker=new Thread(ThreadBody); m_background_worker.Start(); } private void ThreadBody() { while(!m_stop) { Thread.Sleep(100); count++; RunOnUiThread(GuiUpdate); } } private void GuiUpdate() { var button=FindViewById<Button> (Resource.Id.myButton); button.Text=string.Format("Background thread cycles: {0}", count); } } } If it does not deadlock at the first run, please run it a few times and leave it running for a minute or so. It usually hangs within seconds after starting and it happens even when detached from the debugger. Hope this gets you on the right track. If you need anything else, let me know. Please also let me know if you were able to reproduce the behavior. Thanks, -- Henon > > Thanks, > - Jon > > _______________________________________________ > Monodroid mailing list > Monodroid@lists.ximian.com > > UNSUBSCRIBE INFORMATION: > http://lists.ximian.com/mailman/listinfo/monodroid > _______________________________________________ Monodroid mailing list Monodroid@lists.ximian.com UNSUBSCRIBE INFORMATION: http://lists.ximian.com/mailman/listinfo/monodroid