gpt4 book ai didi

ios4 - MonoTouch 不稳定继续 : managed memory allocator crashes

转载 作者:行者123 更新时间:2023-12-02 00:27:13 31 4
gpt4 key购买 nike

长话短说:我可以分配大量的非托管内存,但是尝试在托管内存中分配相同数量(或更少)会导致 GC_remap 中的 MonoTouch(下面的调用堆栈)崩溃。

详情:

我将讨论我上面描述的行为的一个例子。我的应用程序偶尔会分配 2.5MB 的托管内存块(使用 new byte[]),并且它经常在我的 iPhone4 上死机,调用堆栈粘贴在下面(即分配期间的 mprotect 错误)。我保留对这些 2.5MB 块的引用的时间不会超过单个函数调用。

The MonoTouch guys say that 'mprotect errno 12' means you've exhausted memory on your device ,但问题是,我有 手数我的应用程序可用的内存。我可以分配 0MB , 10MB , 或 200MB 非托管 内存(使用 Marshal.AllocHGlobal)在我的应用程序启动时,每帧触摸它,它使我的应用程序的行为或此 mprotect 错误的频率为零差异。

一些笔记

  • GC.TotalMemory 告诉我我的应用程序位于 之间3MB 5MB 托管内存使用情况。
  • 我的应用程序中还有其他地方可以分配更大的块 非托管 内存,它永远不会在那里崩溃。我创建了压力测试,加载 4MB(非托管)纹理数据,将其交给 GL,并在每一帧绘制它,应用程序坚如磐石,直到我开始要求 的大块托管 内存。
  • GC.CollectionCount 几乎不会改变,除非我自己调用 GC.Collect。
  • MonoTouch 3.2.3 和 MonoTouch 4.0 也会发生相同的行为。
  • 我们所有的测试设备(iPhone 3G、3GS、4、iPad、iPad2)都会出现相同的行为。
  • 相同的行为发生在发布版本和调试版本中,尽管它在调试版本中发生得更频繁。

  • 引发崩溃的方法
  • 如果我创建一个循环调用 GC.Collect 的线程,然后休眠 1 毫秒,这会使崩溃发生得更快(即,如果我在调试版本中,几乎立即发生)。
  • 使用某些 .NET 功能(如 WebRequest)也会导致此崩溃。我只能假设它也在那里的某个地方分配了大块的托管内存。

  • 避免崩溃的方法

    有两种方法可以减少崩溃的频率或完全修复它:
  • 如果我预先分配了 2.5MB 的托管内存块,然后在应用程序的整个生命周期内保留它,那么就不会发生崩溃。
  • 如果我在做任何事情之前固定 2.5MB 内存块,这似乎有帮助。

  • 结论/问题

    由于这个问题,我们还没有在我们的应用程序中实现完全稳定性。这种崩溃(总是在 GC_remap 内)发生在我们应用程序的随机分配中(我这里的 2.5MB 示例只是我选择隔离和重现的示例)。

    问题:
  • 我可以完全不信任托管分配器吗?
  • 为什么我可以分配 200MB 非托管内存,但是当我要求时托管分配器死了 2.5MB ? (注意:即使我没有分配 200MB 的非托管内存,当我要求 2.5MB 时它也会死)。
  • 为什么如果我在应用程序的生命周期内占用 2.5MB 的应用程序是完全没问题的,但是如果我将它归还给系统(并调用 GC.Collect)并在以后要求另外 2.5MB 的空间,崩溃会更糟!如果这确实是内存不足的情况,那么将 2.5MB 回馈给系统不是比占用它更好吗?

  • 我们甚至可以使用 MonoTouch 吗?

    我的团队正在认真考虑为我们的产品放弃 MonoTouch,因为我们无法使其稳定可靠。

    我们也无法从 MonoTouch 团队获得一天中的时间 在 stackoverflow 上,通过在 Novell 的站点上提交错误,或通过电子邮件直接发送 MonoTouch 的支持电子邮件。我们已将我们的(托管和非托管)内存使用量减少到荒谬的低点,但由于这个问题,应用程序仍然崩溃。

    在短期内,我想到的唯一解决方法是在启动时分配一大块内存(2-5MB),将其固定,以便垃圾收集器永远不会触及它,并编写我自己的分配器来分发部分根据需要将此内存块添加到我的应用程序中。但是,如果这是在 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.
    =================================================================

    最佳答案

    Darwin 内核过度使用内存。

    这意味着如果您请求 200 兆内存,您将获得它们,即使它们不可用并且只要您不实际消耗内存,您的应用程序就会运行良好。

    只有当您实际写入页面时,页面才会分配给您的进程。

    正确的测试需要您分配内存,然后填满已使用的内存,这就是为什么您可能会觉得即使您可能没有内存也可以分配 200 兆内存。

    一个简单的程序会告诉你:尝试分配 500 megs,操作系统会说“是的,你明白了”,但没有这种内存的 iPhone。

    示例测试用例将大大有助于显示问题所在。

    关于ios4 - MonoTouch 不稳定继续 : managed memory allocator crashes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5666905/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com