Сбой приложения мгновенно, без исключений или лога

Здесь странная ситуация :), я внедрил этот код в свой фрагмент для сканирования TCP Ports в multithread environment, это crash when debugging, а иногда и crash in release mode тоже с сообщениями thoose:

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 (дд /мм /гггг) приложения 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_ 

Спасибо всем вам ...

7 голосов | спросил EAK TEAM 23 Maypm17 2017, 19:22:58

4 ответа


0

Кажется, проблема в xamarin.android platform, поскольку после последнего обновления 6/9/2017 Visual Studio 2017 version 15.2 (26430.13) больше не вылетает ... в любом случае, спасибо за ваше время (n) количество потоков /задач ...

ответил EAK TEAM 10 J0000006Europe/Moscow 2017, 20:51:04
0

Как вы описали, он работает без этой части вашего кода ... поэтому ошибка должна быть где-то в вашем коде.

давайте посмотрим на это.

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)

ответил woelliJ 9 J0000006Europe/Moscow 2017, 10:29:39
0

Итак, я столкнулся с такой же проблемой с Xamarin и VS. оказывается, что не все ошибки регистрируются в консоли отладки VS, но они находятся в журнале устройства. В то время мне нужно было пойти и использовать эмулятор на моей машине и запустить его, когда устройство включено. и прекратил запись сразу после аварии. В этом журнале было ясно, в чем проблема (что в моем случае было неправильно настроенным разрешением). Надеюсь, это поможет.

ответил user3130628 2 J0000006Europe/Moscow 2017, 10:59:01
0

Чтобы файл apk работал на других устройствах, кроме подключенных к USB-отладке, необходимо опубликовать подписанный APK-файл и распространить его, перейдите по ссылке ниже: https://developer.xamarin.comguides /Android /развертывание, _testing, _and_metrics /publishing_an_application /part_1 _-_ preparing_an_application_for_release /

https: //developer.xmar. ком /руководства /Android /развертывание, _testing, _and_metrics /publishing_an_application /part_2 _-_ signing_the_android_application_package /

ответил Sanny Nagveker 1 J0000006Europe/Moscow 2017, 22:52:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132