EXC_BAD_ACCESS KERN_INVALID_АДРЕС 0x0000000000000000 : Формы Xamarin, iOS, прерывистый сбой

#c# #ios #xamarin.forms

Вопрос:

  • Версия форм Xamarin : 4.8.0.1560
  • Происходит для нескольких версий iOS
  • iPhone и iPad

Сбой происходит периодически и происходит в производственном выпуске для 12 % от общего числа пользователей.

аналитика сбоев firebase показывает нижеприведенную строку в качестве точки сбоя, и список никогда не бывает пустым или пустым

  try { foreach (var item in ViewModel?.availableList?.anotherList?.GetRange(0, 2)) } catch (Exception ex) { do something}
 

Вы, ребята, думаете, что глубокое копирование и последующая итерация помогут?

Примечание :

  • Я пока не могу воспроизвести его сам.
  • Я также проверил, что список не обновляется ни из каких других потоков

Полный журнал

  Crashed: tid_407
0  someNameSpace.iOS                     0x1047ac840 someNameSpace._Views_view._Addpocket   386 (view..xaml.cs:386)
1  someNameSpace.iOS                     0x1047ab204 someNameSpace._Views_view._Displaypocket   174 (view..xaml.cs:174)
2  someNameSpace.iOS                     0x1047ab204 someNameSpace._Views_view._Displaypocket   174 (view..xaml.cs:174)
3  someNameSpace.iOS                     0x1047e2c08 someNameSpace._Views_view.___ctorb__9_5_string   57 (view..xaml.cs:57)
4  someNameSpace.iOS                     0x103538880 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr   4342433920
5  someNameSpace.iOS                     0x10558b21c mono_jit_runtime_invoke   3165 (mini-runtime.c:3165)
6  someNameSpace.iOS                     0x105646940 mono_runtime_invoke_checked   3052 (object.c:3052)
7  someNameSpace.iOS                     0x10564e214 mono_runtime_try_invoke_array   5626 (object.c:5626)
8  someNameSpace.iOS                     0x1055efcec ves_icall_InternalInvoke   3927 (icall.c:3927)
9  someNameSpace.iOS                     0x105600f50 ves_icall_InternalInvoke_raw   667 (icall-def.h:667)
10 someNameSpace.iOS                     0x103301808 wrapper_managed_to_native_System_Reflection_RuntimeMethodInfo_InternalInvoke_System_Reflection_RuntimeMethodInfo_object_object___System_Exception_   4340111368
11 someNameSpace.iOS                     0x1033019b0 System_Reflection_RuntimeMethodInfo_Invoke_object_System_Reflection_BindingFlags_System_Reflection_Binder_object___System_Globalization_CultureInfo   4340111792
12 someNameSpace.iOS                     0x1032ef48c System_Reflection_MethodBase_Invoke_object_object__   4340036748
13 someNameSpace.iOS                     0x10369259c Xamarin_Forms_MessagingCenter_Subscription_InvokeCallback_object_object   95 (MessagingCenter.cs:95)
14 someNameSpace.iOS                     0x103691974 Xamarin_Forms_MessagingCenter_InnerSend_string_System_Type_System_Type_object_object   213 (MessagingCenter.cs:213)
15 someNameSpace.iOS                     0x1036910d4 Xamarin_Forms_MessagingCenter_Xamarin_Forms_IMessagingCenter_Send_TSender_REF_TSender_REF_string   128 (MessagingCenter.cs:128)
16 someNameSpace.iOS                     0x103691078 Xamarin_Forms_MessagingCenter_Send_TSender_REF_TSender_REF_string   121 (MessagingCenter.cs:121)
17 someNameSpace.iOS                     0x1045837e0 someNameSpace._ViewModels_view.Model__GetpocketInfod__23_MoveNext   177 (view.Model.cs:177)
18 someNameSpace.iOS                     0x1032df31c System_Runtime_CompilerServices_AsyncMethodBuilderCore_MoveNextRunner_InvokeMoveNext_object   4339970844
19 someNameSpace.iOS                     0x10325f8fc System_Threading_ExecutionContext_RunInternal_System_Threading_ExecutionContext_System_Threading_ContextCallback_object_bool   4339448060
20 someNameSpace.iOS                     0x10325f6fc System_Threading_ExecutionContext_Run_System_Threading_ExecutionContext_System_Threading_ContextCallback_object_bool   4339447548
21 someNameSpace.iOS                     0x1032df1d8 System_Runtime_CompilerServices_AsyncMethodBuilderCore_MoveNextRunner_Run   4339970520
22 someNameSpace.iOS                     0x10327f264 System_Threading_Tasks_AwaitTaskContinuation_InvokeAction_object   4339577444
23 someNameSpace.iOS                     0x10327f394 System_Threading_Tasks_AwaitTaskContinuation_RunCallback_System_Threading_ContextCallback_object_System_Threading_Tasks_Task_   4339577748
24 someNameSpace.iOS                     0x10327e5ac System_Threading_Tasks_SynchronizationContextAwaitTaskContinuation_Run_System_Threading_Tasks_Task_bool   4339574188
25 someNameSpace.iOS                     0x103278740 System_Threading_Tasks_Task_FinishContinuations   4339550016
26 someNameSpace.iOS                     0x103276b90 System_Threading_Tasks_Task_FinishStageThree   4339542928
27 someNameSpace.iOS                     0x103271ab4 System_Threading_Tasks_Task_1_TResult_REF_TrySetResult_TResult_REF   4339522228
28 someNameSpace.iOS                     0x1032dd98c System_Runtime_CompilerServices_AsyncTaskMethodBuilder_1_TResult_REF_SetResult_TResult_REF   4339964300
29 someNameSpace.iOS                     0x1045cbcf8 someNameSpace._Repo_FoodieClubRepo__Getpocketd__18_MoveNext   126 (FoodieClubRepo.cs:126)
30 someNameSpace.iOS                     0x1032df31c System_Runtime_CompilerServices_AsyncMethodBuilderCore_MoveNextRunner_InvokeMoveNext_object   4339970844
31 someNameSpace.iOS                     0x10325f8fc System_Threading_ExecutionContext_RunInternal_System_Threading_ExecutionContext_System_Threading_ContextCallback_object_bool   4339448060
32 someNameSpace.iOS                     0x10325f6fc System_Threading_ExecutionContext_Run_System_Threading_ExecutionContext_System_Threading_ContextCallback_object_bool   4339447548
33 someNameSpace.iOS                     0x1032df1d8 System_Runtime_CompilerServices_AsyncMethodBuilderCore_MoveNextRunner_Run   4339970520
34 someNameSpace.iOS                     0x10327ea08 System_Threading_Tasks_SynchronizationContextAwaitTaskContinuation__c___cctorb__7_0_object   4339575304
35 someNameSpace.iOS                     0x104174c6c Foundation_NSAsyncSynchronizationContextDispatcher_Apply   178 (NSAction.cs:178)
36 someNameSpace.iOS                     0x103538880 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr   4342433920
37 someNameSpace.iOS                     0x10558b21c mono_jit_runtime_invoke   3165 (mini-runtime.c:3165)
38 someNameSpace.iOS                     0x105646940 mono_runtime_invoke_checked   3052 (object.c:3052)
39 someNameSpace.iOS                     0x10564a1a4 mono_runtime_invoke   3107 (object.c:3107)
40 someNameSpace.iOS                     0x10310d3c8 native_to_managed_trampoline_11(objc_object*, objc_selector*, _MonoMethod**, unsigned int)   408 (registrar.m:408)
41 someNameSpace.iOS                     0x103113f8c -[__MonoMac_NSAsyncSynchronizationContextDispatcher xamarinApplySelector]   9024 (registrar.m:9024)
42 Foundation                     0x1966b7b90 __NSThreadPerformPerform   188
43 CoreFoundation                 0x19529d76c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__   28
44 CoreFoundation                 0x19529d668 __CFRunLoopDoSource0   208
45 CoreFoundation                 0x19529c9cc __CFRunLoopDoSources0   376
46 CoreFoundation                 0x195296a8c __CFRunLoopRun   824
47 CoreFoundation                 0x19529621c CFRunLoopRunSpecific   600
48 GraphicsServices               0x1ace60784 GSEventRunModal   164
49 UIKitCore                      0x197cd6ee8 -[UIApplication _run]   1072
50 UIKitCore                      0x197cdc75c UIApplicationMain   168
51 someNameSpace.iOS                     0x1041e7ca8 wrapper_managed_to_native_UIKit_UIApplication_UIApplicationMain_int_string___intptr_intptr   4355734696
52 someNameSpace.iOS                     0x10411d6d0 UIKit_UIApplication_Main_string___intptr_intptr   86 (UIApplication.cs:86)
53 someNameSpace.iOS                     0x10411d654 UIKit_UIApplication_Main_string___string_string   66 (UIApplication.cs:66)
54 someNameSpace.iOS                     0x103141e64 someNameSpace._iOS_Application_Main_string__   1 (<unknown>:1)
55 someNameSpace.iOS                     0x103538880 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr   4342433920
56 someNameSpace.iOS                     0x10558b21c mono_jit_runtime_invoke   3165 (mini-runtime.c:3165)
57 someNameSpace.iOS                     0x105646940 mono_runtime_invoke_checked   3052 (object.c:3052)
58 someNameSpace.iOS                     0x10564cb98 mono_runtime_exec_main_checked   5178 (object.c:5178)
59 someNameSpace.iOS                     0x1055697b0 mono_jit_exec   1383 (driver.c:1383)
60 someNameSpace.iOS                     0x105727350 xamarin_main   493 (monotouch-main.m:493)
61 someNameSpace.iOS                     0x10313de40 main   190 (main.m:190)
62 libdyld.dylib                  0x194f566b0 start   4
 

Ответ №1:

Не вводите код xx?.method() foreach , это опасно.

Если xx равно null , то xx?.method() равно null , поэтому следующий код, например

 foreach (var item in null)
{ 

}      
 

Послушно приложение рухнет .

И для другого сценария : если количество xx меньше 2, приложение выдаст OutOfbounds исключение.

Правильный и безопасный код

 var list = ViewModel?.availableList?.anotherList;

if(list != null and list.Count>=2){
   var newList = list.GetRange(0, 2);
   foreach (var item in newList){}
}

 

Другой способ-поместить исходный код в try-catch .

Комментарии:

1. Спасибо @Colex — MSFT, текущий код находится в try/catch. Список не является нулевым. Я думал о том же, чтобы сначала получить глубокую копию списка из 2 пунктов, а затем поработать над ним, но не был уверен, поможет ли это. var list = (deep copy) ViewModel?.availableList?.anotherList.get 2 items ;

2. Вы имеете в виду, что сбой все равно произойдет, даже если поместить код в try/catch ? И как вы реализуете глубокое копирование в этом сценарии ?

3. Да, сбой происходит даже после попытки поймать. Теперь мы реализовали глубокое копирование с помощью . ToList(), я обновлю здесь, как только получу результат от производства.

4. Конечно, это прекрасно .

Ответ №2:

Выполнение глубокого копирования вместо использования getRange решило эту проблему.