**
Уведомление;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 ГБ оперативной памяти, различные размеры кучи и различные средства визуализации. Я не могу проверить с физическим устройством, потому что сеть все еще заблокирована и каким-то образом устройство не может подключиться)
Обновление;это исправлено (я думаю). 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;оно работает.Любой берущий?Заметка;Я обновил название вопроса, чтобы он был более конкретным для этой новой проблемы.