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

Reply via email to