c# - MonoTouch - LLVM 编译的 App 在 5.3.x 的 System.Collections.Generic.Dictionary 中挂起?

标签 c# dictionary xamarin.ios deadlock

我们正在开发一款使用 MonoGame 的游戏,它在 MonoTouch 5.2.x 上运行良好,直到更新到 5.3.x beta,甚至是 5.3.5。

游戏只会在加载我们的第一个关卡时锁定,并且只有在设备的 Release模式下编译时才会发生。在模拟器或设备的 Debug模式下工作正常。

我们不知道问题出在哪里,直到我们使用了 Rolf Kvinge 发布的技巧 here .

这是崩溃日志的有用片段:

0   libsystem_c.dylib               0x32bd68b0 memset$VARIANT$CortexA9 + 152
1   DrawAStickmaniPhone             0x00492e40 DrawAStickmanCore_System_Collections_Generic_Dictionary_2_int_DrawAStickman_Core_Json_Frame_TryGetValue_int_DrawAStickman_Core_Json_Frame_ (DrawAStickmanCore.dll.7.s:36462)
2   DrawAStickmaniPhone             0x004d4e3c DrawAStickman_Core_FrameCounter_OnFrameChanged (DrawAStickmanCore.dll.7.s:137904)
3   DrawAStickmaniPhone             0x00479dbc DrawAStickmanCore_DrawAStickman_Core_BaseCounter_Update_Microsoft_Xna_Framework_GameTime (DrawAStickmanCore.dll.7.s:974)
4   DrawAStickmaniPhone             0x0048694c DrawAStickmanCore_DrawAStickman_Core_ElementStateComponent_Update_Microsoft_Xna_Framework_GameTime (DrawAStickmanCore.dll.7.s:17895)
5   DrawAStickmaniPhone             0x0047ce70 DrawAStickmanCore_DrawAStickman_Core_ElementComponent_Update_Microsoft_Xna_Framework_GameTime (DrawAStickmanCore.dll.7.s:5028)
6   DrawAStickmaniPhone             0x004d72cc DrawAStickman_Core_LevelComponent_Update_Microsoft_Xna_Framework_GameTime_0 (DrawAStickmanCore.dll.7.s:138769)
7   DrawAStickmaniPhone             0x0003d170 MonoGame_Framework_Microsoft_Xna_Framework_Game__UpdateActionm__2C_Microsoft_Xna_Framework_IUpdateable_Microsoft_Xna_Framework_GameTime (MonoGame.Framework.dll.7.s:69150)
8   DrawAStickmaniPhone             0x0003d284 MonoGame_Framework_Microsoft_Xna_Framework_Game_SortingFilteringCollection_1_ForEachFilteredItem_TUserData_System_Action_2_T_TUserData_TUserData (MonoGame.Framework.dll.7.s:69246)
9   DrawAStickmaniPhone             0x0003c3bc MonoGame_Framework_Microsoft_Xna_Framework_Game_Update_Microsoft_Xna_Framework_GameTime (MonoGame.Framework.dll.7.s:67887)
10  DrawAStickmaniPhone             0x004c7664 DrawAStickman_Core_StickmanGame_Update_Microsoft_Xna_Framework_GameTime (DrawAStickmanCore.dll.7.s:133288)
11  DrawAStickmaniPhone             0x0003c674 MonoGame_Framework_Microsoft_Xna_Framework_Game_DoUpdate_Microsoft_Xna_Framework_GameTime (MonoGame.Framework.dll.7.s:68138)
12  DrawAStickmaniPhone             0x0003c284 MonoGame_Framework_Microsoft_Xna_Framework_Game_Tick (MonoGame.Framework.dll.7.s:67751)
13  DrawAStickmaniPhone             0x0003e43c MonoGame_Framework_Microsoft_Xna_Framework_iOSGamePlatform_RunTick (MonoGame.Framework.dll.7.s:70871)
14  DrawAStickmaniPhone             0x0003e39c MonoGame_Framework_Microsoft_Xna_Framework_iOSGamePlatform_Tick (MonoGame.Framework.dll.7.s:70820)
15  DrawAStickmaniPhone             0x002fe8c0 monotouch_MonoTouch_Foundation_NSActionDispatcher_Apply + 12
16  DrawAStickmaniPhone             0x006de878 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr_0 (mscorlib.dll.7.s:468944)
17  DrawAStickmaniPhone             0x00963780 mono_jit_runtime_invoke (mini.c:5792)
18  DrawAStickmaniPhone             0x009cdc04 mono_runtime_invoke (object.c:2788)
19  DrawAStickmaniPhone             0x0095aba4 native_to_managed_trampoline_MonoTouch_Foundation_NSActionDispatcher_Apply (registrar.m:19)

看看这个,它似乎在这样的一行上陷入僵局:

Frame frame;
if (myFramesDictionary != null && myFramesDictionary.TryGetValue(index, out frame))
{
    //Some code here
}

Frame是一个结构,myFramesDictionaryDictionary<int, Frame> .

这可能是 MonoTouch 5.3.x 中的错误吗?如果不将我们的整个应用程序发送到 Xamarin,我不知道如何重现该问题。

更新

我们禁用了 LLVM 编译器选项,它修复了挂起问题。

我无法创建一个小项目来重现该问题。不确定是否要将整个应用程序发送到 Xamarin 进行调试。关于重新创建这个的任何想法?

最佳答案

除非你有一些非常奇怪的内存损坏,否则你不会在 memset 中死锁。

此外,要诊断死锁,您需要显示多个线程,因为一开始您至少需要两个线程来死锁:)

我相信您遇到了某种无限循环。您可以使用调试器中的断点或崩溃报告中第 1 帧开头的 Console.WriteLine 轻松检查这一点。

关于c# - MonoTouch - LLVM 编译的 App 在 5.3.x 的 System.Collections.Generic.Dictionary 中挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11658167/

相关文章:

c# - WPF TabItem HeaderTemplate

swift - 找不到 Swift 字典 "keys"属性的内部实现

python - 在 Pandas 中列出字典?

ios - 为设备编译但不在模拟器上编译时出现 MonoTouch 错误 : MONO_PATCH_INFO_JIT_ICALL_ADDR mono_marshal_safearray_create

c# - 如何修复 System.IO.FileNotFoundException : Could not load file or assembly 'ScanAPIHelper.dll' or one of its dependencies

c# - 有没有办法为特定项目/命名空间/其他禁用智能感知?

c# - Dictionary.ContainsKey 返回 False,但想要 True

c# - MonoTouch AOT 编译器 - 大型方法失败

iphone - 在 monotuch 中通过 CGBitmapContext 组合两个图像时如何避免质量损失

c# - 将转换器应用于 Blend 中的数字时,设计 View 在 TextBlock 中显示 `System.Object`