应用程序崩溃无一例外或日志(似乎是xamarin / mono bug)

时间:2017-05-23 16:22:58

标签: c# android xamarin mono xamarin.android

这是一个奇怪的情况:),我已在我的片段中实现了此代码,以便在TCP Ports中扫描multithread environmentcrash when debugging,有时crash in release mode也有消息:

E/art (12972): Nested signal detected - original signal being reported

F/art (12972): art/runtime/fault_handler.cc:117] Check failed: !initialized_

  

尝试设置无效的目标Android to 23

     

尝试运行无效的adb shell setprop debug.mono.env MONO_DEBUG=soft-breakpoints

     

尝试使用不同的Android API's Versions

进行编译

任何想法为什么会发生这种情况?

  
    

这是我的代码:

  
    public void start()
    {
        for (int i = 0; i < 50; i++)
        {
            Task.Run(() => RunScanTcp());
            //ThreadPool.QueueUserWorkItem(RunScanTcp);
            //Thread thread = new Thread(new ThreadStart(RunScanTcp));
            //thread.Start();
        }
    }


    public void RunScanTcp()
    {
        while (abort != true)
        {
                port = port + 1;
                Log.Info("PORT SCANNER", port.ToString());
        }
    }

    public class PortList
    {
        private int start;
        private int stop;
        private int ports;
        private static readonly object _syncRoot = new object();

        public PortList(int starts, int stops)
        {
            start = starts;
            stop = stops;
            ports = start;
        }

        public bool MorePorts()
        {
            lock (_syncRoot)
            {
                return (stop - ports) >= 0;
            }
        }

        public int NextPort()
        {
            lock (_syncRoot)
            {
                if (MorePorts())
                {
                    return ports++;
                }
                return -1;
            }
        }
    }

我正在编译:

Android Version (Android 7.1 Nougat)

最低Android版本:

Android 4.1 (API Level 16 - Jelly Bean)

目标Android版:

Compile Using SDK Version

更新:

Visual Studio Update 15.2 (26430.12)之后,Xamarin 4.5.0.476 - 30/05/2017(dd / mm / yyyy)应用crashed同时connected to debugger ...

  

这是调试器输出:

referenceTable GDEF length=814 1
referenceTable GSUB length=11364 1
referenceTable GPOS length=47302 1
referenceTable head length=54 1
referenceTable GDEF length=428 1
referenceTable GSUB length=2302 1
referenceTable GPOS length=43252 1
referenceTable head length=54 1
referenceTable GDEF length=808 1
referenceTable GSUB length=11364 1
referenceTable GPOS length=49128 1
referenceTable head length=54 1
referenceTable GDEF length=808 1
referenceTable GSUB length=11364 1
referenceTable GPOS length=47320 1
referenceTable head length=54 1
05-31 04:31:51.590 F/art     (17427): art/runtime/fault_handler.cc:117] Check failed: !initialized_ 

感谢所有人......

4 个答案:

答案 0 :(得分:3)

正如您所描述的那样,如果没有代码的那部分,它的工作正常...所以错误必须在您的代码中的某处。

让我们看一下。

public void start()
{
    for (int i = 0; i < 50; i++)
    {
        Task.Run(() => RunScanTcp());
    }
}


public void RunScanTcp()
{
    while (abort != true)
    {
            port = port + 1;
            Log.Info("PORT SCANNER", port.ToString());
    }
}

start方法中,您启动了50个任务 - 而不是await任何一个任务 - 这意味着可能所有任务并行运行(至少肯定一些任务尝试同时访问port

这些任务执行的是访问port的方法,该方法必须是包含类的字段。

如果没有锁定,从多个任务/线程访问共享字段绝不是一个好主意。

尝试使用以下代码(如果由于某种原因确实需要并行任务)。

public class YourClass
{

    private bool abort;
    private int port;
    private object portLock = new object();

    public void start()
    {
        for (int i = 0; i < 50; i++)
        {
            Task.Run(() => RunScanTcp());
        }
    }


    public void RunScanTcp()
    {
        while (abort != true && this.port < int.MaxValue)
        {
            lock (this.portLock) {
                port = port + 1;
                Log.Info("PORT SCANNER", port.ToString());
            }
        }
    }

}

可能更好的方法是仅使用一个任务await

public class YourClass
{

    private bool abort;
    private int port;
    private object portLock = new object();

    public Task start()
    {
        return Task.Run(() => RunScanTcp());
    }


    public void RunScanTcp()
    {
        lock (this.portLock) {
            while (abort != true && this.port < int.MaxValue)
            {
                port = port + 1;
                Log.Info("PORT SCANNER", port.ToString());
            }
        }
    }

}

如果这样可以解决您当前的问题,您可能需要添加另一个问题,了解如何正确解决您实际尝试解决的问题(因为您当前的代码基本上只会增加port,直到它被中止或应用程序崩溃(因为它超过了Int32 MaxValue)

答案 1 :(得分:2)

所以我遇到了与Xamarin和VS一样的问题。事实证明,并非所有错误都记录在VS调试控制台中,但它们都在设备日志中。我当时要做的就是在我的机器上使用模拟器并在设备登录时运行它。并在崩溃后立即停止了记录。在该日志中,很清楚问题是什么(在我的情况下是错误配置的权限)。希望有所帮助。

答案 2 :(得分:0)

答案 3 :(得分:0)

问题似乎出现在xamarin.android platform,因为在上次更新6/9/2017 Visual Studio 2017 version 15.2 (26430.13)之后它再也不会崩溃...无论如何,谢谢你的时间..这个错误在尝试创建时发生( n)线程数/任务......