应用程序立即崩溃,无异常或记录(似乎 xamarin/mono 错误)

App Crash instantly without exception or log (seems like xamarin/mono bug)

这里的情况很奇怪:),我已经在我的片段中实现了这段代码来扫描 multithread environment 中的 TCP Ports ,它是 crash 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_

tried to set Target Android to 23 that didn’t work.

tried running adb shell setprop debug.mono.env MONO_DEBUG=soft-breakpoints that didn’t work.

tried to compile using different Android API's Versions

知道为什么会这样吗??

HERE IS MY CODE:

    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...

Here is the debugger output :

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_ 

谢谢大家...

要使 apk 文件在连接 USB 调试以外的其他设备上运行,您需要发布签名的 APK 文件并分发它,请检查以下内容 link: https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/

https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_2_-_signing_the_android_application_package/

所以我遇到了与 Xamarin 和 VS 类似的问题。事实证明,并非所有错误都记录到 VS 调试控制台中,但它们都在设备日志中。那次我必须做的是在我的机器上使用模拟器,然后 运行 它同时让设备登录。并在崩溃后立即停止记录。在该日志中很清楚问题出在哪里(在我的例子中是错误配置的权限)。希望对您有所帮助。

正如您所描述的那样,它在没有您的那部分代码的情况下也能正常工作...所以错误一定是在您的代码中的某个地方。

一起来看看吧

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 的方法,它必须是包含 class 的字段。

在没有锁的情况下从多个任务/线程访问共享字段从来都不是一个好主意。

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

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 以上)

问题似乎出在 xamarin.android platform 因为在上次更新后 6/9/2017 Visual Studio 2017 version 15.2 (26430.13) 它不再崩溃了......无论如何感谢你的时间.. 这个错误发生在尝试时创建 (n) 个 threads/task ...