Jonathan, Another info: I just tested with an older Samsung Galaxy S that has only one core and couldn't reproduce any deadlocks even with 10 background threads whereas with the dual core Galaxy Tab 10.1 it is really easy to reproduce. -- Henon
Dipl. Ing. Meinrad Recheis eqqon GmbH Friedmanngasse 32/20 1160 Wien, Österreich Tel.: +43 (0) 680-31-800-37 Fax: +43 (0) 1-25-330-339-356 meinrad.rech...@eqqon.com Firma: eqqon GmbH Rechtsform: Gesellschaft mit beschränkter Haftung Firmensitz: Wien Firmenbuchnummer: FN 327919 i Firmenbuchgericht: Handelsgericht Wien -- eqqon Disclaimer / Legal notice: http://www.eqqon.com/index.php/Disclaimer On 16.07.2012 13:03, Meinrad Recheis wrote: > 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 > _______________________________________________ Monodroid mailing list Monodroid@lists.ximian.com UNSUBSCRIBE INFORMATION: http://lists.ximian.com/mailman/listinfo/monodroid