Продолжается нестабильность MonoTouch: сбой распределителя управляемой памяти

Короче: Я могу выделить тонны неуправляемой памяти, но попытка выделить такое же количество (или намного меньше) в управляемой памяти приводит к сбою MonoTouch в GC_remap (стек вызовов ниже).

Подробности:

Я расскажу об одном примере поведения, описанного выше. Мое приложение время от времени выделяет кусок управляемой памяти размером 2,5 МБ (используя new byte []), и он часто умирает на моем iPhone4 со стеком вызовов, вставленным ниже (то есть ошибка mprotect во время выделения). Я не храню ссылки на эти блоки размером 2,5 МБ дольше, чем один вызов функции.

Ребята из MonoTouch говорят, что «mprotect errno 12» означает, что вы исчерпали память на вашем устройстве , но дело в том, что , У меня много памяти, доступной моему приложению. Я могу выделить 0 МБ , 10 МБ или 200 МБ из неуправляемой памяти (с помощью Marshal. AllocHGlobal) при запуске моего приложения, касайтесь его в каждом кадре, и это не повлияет на поведение моего приложения или частоту этой ошибки mprotect.

Некоторые примечания

  • GC.TotalMemory сообщает мне, что мое приложение сидит между 3 МБ и 5 МБ постоянно используемой управляемой памяти.
  • У меня есть другие места в моем приложении, где я выделяю еще большие блоки неуправляемой памяти, и там никогда не происходит сбоев. Я создал стресс-тесты, которые загружают 4 МБ (неуправляемых) данных текстуры, передают их в GL и рисуют каждый кадр, и приложение работает как скала, пока я не начну запрашивать большие блоки управляемой памяти.
  • GC.CollectionCount почти никогда не изменяется, если я сам не вызываю GC.Collect.
  • Такое же поведение происходит с MonoTouch 3.2.3, а также с MonoTouch 4.0.
  • Такое же поведение происходит на всех наших тестовых устройствах (iPhone 3G, 3GS, 4, iPad, iPad2).
  • Такое же поведение происходит в сборках выпуска и сборках отладки, хотя это происходит чаще с сборками отладки.
  • 1219] Способы спровоцировать сбой
    • Если я создаю поток, который зацикливается на вызове GC.Collect, а затем сплю на 1 мс, это приведет к тому, что сбой произойдет намного раньше (т.е. практически сразу же, если я нахожусь в отладочной сборке).
    • Использование определенных функций .NET, таких как WebRequest, также вызовет этот сбой. Я могу только предположить, что он также выделяет большие блоки управляемой памяти где-то там.

    Способы устранения сбоя

    Есть два способа уменьшить частоту сбоя или исправить его полностью:

    1. Если я Предварительно выделите этот кусок управляемой памяти размером 2,5 МБ, а затем просто сохраните его в течение всего срока службы приложения, тогда сбоя не будет.
    2. Если я закреплю кусок памяти размером 2,5 МБ перед тем, как что-либо с ним делать, это, похоже, поможет.

    Выводы / вопросы

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

    Вопросы:

    1. Могу ли я не доверять управляемому распределителю вообще?
    2. Почему я могу выделить 200 МБ неуправляемой памяти, но управляемый распределитель умирает, когда я запрашиваю 2,5 МБ ? (Примечание: оно умрет, когда я запрошу 2,5 МБ, даже если я не выделил 200 МБ неуправляемой памяти).
    3. Почему с приложением все в порядке, если я использую эти 2,5 МБ на время жизни приложение, но если я верну его системе (и вызову GC.Collect) и попрошу еще 2,5 МБ позже, аварийность будет хуже! Если это действительно проблема нехватки памяти, не лучше ли вернуть системе 2,5 МБ, чем забирать ее?

    Можем ли мы даже использовать MonoTouch?

    Моя команда серьезно рассматривает отказ от MonoTouch для нашего продукта потому что мы не можем добиться его стабильной работы.

    Мы также не можем узнать время дня от команды MonoTouch ни по stackoverflow, ни путем регистрации ошибок на сайте Novell, ни напрямую по электронной почте службы поддержки MonoTouch. Мы сократили использование нашей (управляемой и неуправляемой) памяти до смехотворного минимума, но приложение по-прежнему не работает из-за этой проблемы.

    В краткосрочной перспективе единственный обходной путь, который я придумал, - это выделить большой кусок памяти (2–5 МБ) при запуске, Закрепите его, чтобы сборщик мусора никогда не касался его, и напишите свой собственный распределитель, чтобы при необходимости раздать части этого блока памяти моему приложению. Но если это лучшее решение, которое возможно с помощью MonoTouch, то мне нужно вернуть свои деньги, как только я смогу достичь скорости выхода из MonoTouch.

    ...

    Mprotect failed at 0xaa00000 (length 3801088) with errno 12
    Stacktrace:
    
      at MyApp.GameScreen/VerifyPictureDialog.StoreBasePictureData () [0x00000] in /Users/dussault/s/MyApp/Main/Src/PhotoScreens.cs:428
      at MyApp.GameScreen/VerifyPictureDialog.ApplyFilters (bool) [0x0004b] in /Users/dussault/s/MyApp/Main/Src/PhotoScreens.cs:640
      at MyApp.GameScreen/VerifyPictureDialog.Simulate (single) [0x00077] in /Users/dussault/s/MyApp/Main/Src/PhotoScreens.cs:477
      at MyApp.BaseWindow.Simulate (single) [0x00007] in /Users/dussault/s/MyApp/Main/Src/BaseWindow.cs:56
      at MyApp.BaseWindow.Simulate (single) [0x00007] in /Users/dussault/s/MyApp/Main/Src/BaseWindow.cs:56
      at MyApp.GameScreen.Simulate (single) [0x00238] in /Users/dussault/s/MyApp/Main/Src/GameScreen.cs:3114
      at MyApp.BaseWindow.Simulate (single) [0x00007] in /Users/dussault/s/MyApp/Main/Src/BaseWindow.cs:56
      at MyApp.WindowMgr.Simulate (single) [0x0002f] in /Users/dussault/s/MyApp/Main/Src/WindowMgr.cs:126
      at MyApp.Game1.Update (Microsoft.Xna.Framework.GameTime) [0x0010f] in /Users/dussault/s/MyApp/Main/Src/Game1.cs:1194
      at Microsoft.Xna.Framework.Game.DispatchUpdate (Microsoft.Xna.Framework.GameTime) [0x00000] in /Users/dussault/s/MyApp/Main/Src/XNA-Emulation/GraphicsDevice.cs:531
      at MyApp_iOS.EAGLView.OnUpdateFrame () [0x00050] in /Users/dussault/s/MyApp/Main/Src/iOS/EAGLView.cs:310
      at MyApp_iOS.EAGLView.SimulateAndRender () [0x0000a] in /Users/dussault/s/MyApp/Main/Src/iOS/EAGLView.cs:279
      at MyApp_iOS.EAGLView.MainLoopTimerCallback () [0x00006] in /Users/dussault/s/MyApp/Main/Src/iOS/EAGLView.cs:231
      at MonoTouch.Foundation.NSActionDispatcher.Apply () <0x0002b>
      at (wrapper runtime-invoke) object.runtime_invoke_dynamic (intptr,intptr,intptr,intptr) <0xffffffff>
      at MonoTouch.UIKit.UIApplication.Main (string[],string,string) <0x000cf>
      at MonoTouch.UIKit.UIApplication.Main (string[]) <0x00023>
      at MyApp_iOS.Application.Main (string[]) [0x00000] in /Users/dussault/s/MyApp/Main/Src/iOS/Main.cs:57
      at (wrapper runtime-invoke) object.runtime_invoke_dynamic (intptr,intptr,intptr,intptr) <0xffffffff>
    
    Native stacktrace:
    
        0   MyApp_iOS                           0x00af1b48 mono_handle_native_sigsegv + 412
        1   MyApp_iOS                           0x00b1c66c sigabrt_signal_handler + 148
        2   libSystem.B.dylib                   0x33bd3ddf _sigtramp + 42
        3   libSystem.B.dylib                   0x33bd52cb kill + 10
        4   libSystem.B.dylib                   0x33bd52bd raise + 16
        5   libSystem.B.dylib                   0x33be9d79 abort + 56
        6   MyApp_iOS                           0x00c74378 GC_remap + 200
        7   MyApp_iOS                           0x00c62c04 GC_allochblk_nth + 1536
        8   MyApp_iOS                           0x00c625b4 GC_allochblk + 96
        9   MyApp_iOS                           0x00c6bf6c GC_alloc_large + 132
        10  MyApp_iOS                           0x00c6c5e8 GC_generic_malloc + 324
        11  MyApp_iOS                           0x00c6c8c8 GC_malloc_atomic + 332
        12  MyApp_iOS                           0x00bd8e88 mono_object_allocate_ptrfree + 64
        13  MyApp_iOS                           0x00bd8ff4 mono_array_new_specific + 148
        14  MyApp_iOS                           0x009173f4 wrapper_managed_to_native_object___icall_wrapper_mono_array_new_specific_intptr_int + 68
        15  MyApp_iOS                           0x002cd880 MyApp_GameScreen_VerifyPictureDialog_ApplyFilters_bool + 628
        16  MyApp_iOS                           0x002cbffc MyApp_GameScreen_VerifyPictureDialog_Simulate_single + 768
        17  MyApp_iOS                           0x002ef9d0 MyApp_BaseWindow_Simulate_single + 280
        18  MyApp_iOS                           0x002ef9d0 MyApp_BaseWindow_Simulate_single + 280
        19  MyApp_iOS                           0x002a71fc MyApp_GameScreen_Simulate_single + 2736
        20  MyApp_iOS                           0x002ef9d0 MyApp_BaseWindow_Simulate_single + 280
        21  MyApp_iOS                           0x0038068c MyApp_WindowMgr_Simulate_single + 376
        22  MyApp_iOS                           0x0027f798 MyApp_Game1_Update_Microsoft_Xna_Framework_GameTime + 1992
        23  MyApp_iOS                           0x0039afc8 Microsoft_Xna_Framework_Game_DispatchUpdate_Microsoft_Xna_Framework_GameTime + 148
        24  MyApp_iOS                           0x0026ec10 MyApp_iOS_EAGLView_OnUpdateFrame + 716
        25  MyApp_iOS                           0x0026e8cc MyApp_iOS_EAGLView_SimulateAndRender + 196
        26  MyApp_iOS                           0x0026e1cc MyApp_iOS_EAGLView_MainLoopTimerCallback + 296
        27  MyApp_iOS                           0x009a7dfc MonoTouch_Foundation_NSActionDispatcher_Apply + 44
        28  MyApp_iOS                           0x00912540 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 200
        29  MyApp_iOS                           0x00acc9c4 mono_jit_runtime_invoke + 2800
        30  MyApp_iOS                           0x00bd3ea4 mono_runtime_invoke + 140
        31  MyApp_iOS                           0x00c7d214 monotouch_trampoline + 2840
        32  Foundation                          0x3363b469 __NSFireTimer + 136
        33  CoreFoundation                      0x33a770a3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 14
        34  CoreFoundation                      0x33a76b5b __CFRunLoopDoTimer + 850
        35  CoreFoundation                      0x33a481b5 __CFRunLoopRun + 1088
        36  CoreFoundation                      0x33a47c87 CFRunLoopRunSpecific + 230
        37  CoreFoundation                      0x33a47b8f CFRunLoopRunInMode + 58
        38  GraphicsServices                    0x33b0e4ab GSEventRunModal + 114
        39  GraphicsServices                    0x33b0e557 GSEventRun + 62
        40  UIKit                               0x32099329 -[UIApplication _run] + 412
        41  UIKit                               0x32096e93 UIApplicationMain + 670
        42  MyApp_iOS                           0x009d484c wrapper_managed_to_native_MonoTouch_UIKit_UIApplication_UIApplicationMain_int_string___intptr_intptr + 240
        43  MyApp_iOS                           0x009b4c00 MonoTouch_UIKit_UIApplication_Main_string__ + 36
        44  MyApp_iOS                           0x00269694 MyApp_iOS_Application_Main_string__ + 128
        45  MyApp_iOS                           0x00912540 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 200
        46  MyApp_iOS                           0x00acc9c4 mono_jit_runtime_invoke + 2800
        47  MyApp_iOS                           0x00bd3ea4 mono_runtime_invoke + 140
        48  MyApp_iOS                           0x00bd6f3c mono_runtime_exec_main + 784
        49  MyApp_iOS                           0x00bd5f6c mono_runtime_run_main + 1048
        50  MyApp_iOS                           0x00ad7940 mono_jit_exec + 216
        51  MyApp_iOS                           0x00ac2e38 main + 3536
        52  MyApp_iOS                           0x000133a0 start + 52
    
    Debug info from gdb:
    
    
    =================================================================
    Got a SIGABRT while executing native code. This usually indicates
    a fatal error in the mono runtime or one of the native libraries
    used by your application.
    =================================================================
    

8
задан Community 23 May 2017 в 11:50
поделиться