SIGABRT бросил xamarin формирует пользовательский геттер / сеттер в модели c # - PullRequest
0 голосов
/ 07 декабря 2018

**

Уведомление;21-12-2018 - изменено название вопроса, чтобы соответствовать новому экземпляру этой проблемы.Информация об этом находится внизу.

**

Я боролся с этой ошибкой уже 3 недели, перепробовал все, что мог придумать, даже переустанавливая visual studio 2017.

Сначала немного предыстории;

Я занимаюсь разработкой приложения, в котором можно заказать бутерброды, и большинство важных функций закончено.Весь процесс заказа работал в течение последних 4 месяцев.Пару недель назад была неделя катастрофы, перегоревший блок предохранителей, который вызвал отключение электроэнергии.Это как-то сломало брандмауэр, и вся сеть компании вышла из строя.Во время установки андроид студии (рядом с visual studio / xamarin).Пару дней спустя обновление visual studio 2017 пошло не так, и я сделал полную переустановку и удалил Android Studio.Затем начали появляться ошибки.

Большинство приложений по-прежнему работает нормально, однако вы можете войти в систему, проверить корзины, просмотреть категории и т. Д .;когда в реализации REST вызывается определенная функция, приложение закрывается, и отладчик показывает Fatal signal 6 SIGABRT -6 error.

12-07 12: 57: 29.409 F / (20795): * Утверждение в / Users / builder / jenkins / workspace / xamarin-android-d15-9 / xamarin-android / внешний / моно/mono/mini/unwind.c:640, условие `cfa_reg! = -1 'не выполнено

12-07 12: 57: 29.409 F / libc (20795): фатальный сигнал 6 (SIGABRT), код-6 в tid 20828 (Thread Pool Wor), pid 20795 (e.Appnamehere)

Код ниже:

public async Task<ObservableCollection<T>> GetAllWithId<T>(Guid id)
{
    var t = typeof(T);
    var uri = GetURI<T>();
    ObservableCollection<T> oc = new ObservableCollection<T>();
    try
    {
        var tmpUri = "";
        // IF statements to determine URI, if no ifs succeed let run and catch exception.. ps. can be changed for typeswitch
        if (typeof(T) == typeof(Product)) { tmpUri = uri + "/incategory/" + id; }/*use category id inside*/
        if (typeof(T) == typeof(Order)) { tmpUri = uri + "/fromuser/" + id; }/*use user id*/
        var client = GetNewClient();
        using (client)
        {
            HttpResponseMessage result = await client.GetAsync(tmpUri);
            if (result.IsSuccessStatusCode)
            {
                var content = await result.Content.ReadAsStringAsync();
                Debug.WriteLine(content);             
                oc = JsonConvert.DeserializeObject<ObservableCollection<T>>(content);// <<<<<< SIGABRT THROWN HERE
                //* Assertion at /Users/builder/jenkins/workspace/xamarin-android-d15-9/xamarin-android/external/mono/mono/mini/unwind.c:640, condition `cfa_reg != -1' not met
            }
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine(@"ERROR {0}", ex.Message);
    }

    return oc;
}

Существует одна реализация, использующая обобщенные значения, используемые всеми контроллерами.Методы getURI и getNewClient соответственно создают URI для соответствующего типа и возвращают экземпляр клиента.

С момента начала разработки ядро ​​xamarin и другие пакеты не обновлялись, так как обычно это не работает.вещи.Текущие версии всех пакетов такие же, как и в начале разработки (т.е. когда ошибок не было).(список пакетов и версий внизу).

Ошибка возникает в последних 2 версиях пакетов newtonsoft.json (ошибка началась в версии 11.0.2, затем я обновился до версии 12.0.1, ошибка все еще сохраняетсяпроисходит).Данные API извлекаются и работают так, как задумано, и возвращают данные в правильном формате.Отладчик не показывает трассировки стека, но говорит, что ошибка обычно вызвана собственным моно-кодом или собственным кодом, используемым зависимостями.

Если кому-то понадобится дополнительная информация, я буду рад предоставить ее, поскольку я не смог найти в Google ничего о том, как это исправить.

Ошибка также возникает на всех эмуляторах(от 512 МБ до 2 ГБ оперативной памяти, различные размеры кучи и различные средства визуализации. Я не могу проверить с физическим устройством, потому что сеть все еще заблокирована и каким-то образом устройство не может подключиться)

VersionInformation

Обновление;это исправлено (я думаю). 20-12-2018

Я явно строю объекты на стороне API и отправляю их как объект соответствующего типа (например, Product, Order и т. д.) вместоvar.

После десериализации, повторной сериализации и повторения этого, я в итоге получил рабочее, но крайне неэффективное решение.

После этого я вырезал несколько пользовательских методов получения и установки для свойств намодели.(Это ни в коем случае не является определенной причиной этой проблемы, но это помогло ее исправить.)

Это все еще работало, затем я попытался использовать исходную строку кода, как показано в вопросе, которая работала.

Обратите внимание, я дважды переустанавливал visual studio .. (один раз при обновлении с 15.9.2 до 15.9.3, вчера удалил его и установил с новым обновлением 15.9.4).

Это делается на более старой ветке, в которой все еще есть исходные версии всех зависимостей.

В общем, эта ошибка не должна быть вызвана ошибками в несовпадающих объектах десериализации.Такая ошибка должна быть вызвана ошибкой десериализации или чем-то подобным, а не исходной моно-ошибкой раскрутки.

(строка кода, которая вызывает эту ошибку, окружена двумя вложенными блоками try-catch ..)

Обновление .. это произошло снова 21-12-2018

Итак, ошибка исчезла вчера.Я надеялся, что это было навсегда, но теперь это повторилось.Я сузил это до модели продукта.(поскольку исходная ошибка возникла при загрузке товаров и при загрузке исторических заказов, которые использовали только один и тот же метод API, она должна была быть там, и это было тоже).

Выдается та же ошибка, кроме теперьИсторические заказы все еще работают, кроме продуктов нет.Это произошло, когда я добавил пользовательский геттер и сеттер в свою модель.код ниже;

public Object ProductImage {
             get { return ProductImage; }
             set {

                try
                {
                    if (value.ToString().Contains("/api/DynamicImages/getimageonly/"))
                    {
                        string imreBase64Data = Convert.ToBase64String(Constants.ObjectToByteArray(value));
                        ProductImage = string.Format("data:image/png;base64,{0}", imreBase64Data);
                    }
                    else
                    {
                        ProductImage = value;
                    }


                }
                catch (Exception ex) { ProductImage = value; }


            }
           //   get;set;//<-- when i use this instead no signal abort is thrown but the images wont load when they are retrieved as either a file or data from my own API. (images retrieved as link to external site still work, falling back to place holders still works too.)
        }

Когда я вернусь к простому get; set;оно работает.Любой берущий?Заметка;Я обновил название вопроса, чтобы он был более конкретным для этой новой проблемы.

1 Ответ

0 голосов
/ 15 мая 2019

основной причиной является безостановочный рекурсивный вызов.
, такой как:
ProductImage = value -> это снова вызовет установщик вызова.
в результате, установщик вызывается снова и снова.

в Java, он сообщит об ошибке переполнения стека для такого случая.
однако в моно, он показывает такое сообщение об ошибке, которое не ясно для отладки.

решение:

private Object _productImage;
public Object ProductImage {
    get { return _productImage; }
    set {
    ... 
    _productImage = {some value};
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...