Reputation: 26505
We are working on a game using MonoGame, which has been working fine with MonoTouch 5.2.x until updating to 5.3.x betas, even 5.3.5.
The game would just lock up when loading our first level, and would only happen when compiled in Release mode for the device. Works fine in the simulator or in Debug mode for the device.
We had no clue what the issue was, until we used a trick Rolf Kvinge posted here.
Here is the useful snippet of the crash log:
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)
Looking at this, it appears to deadlocking on a line such as this:
Frame frame;
if (myFramesDictionary != null && myFramesDictionary.TryGetValue(index, out frame))
{
//Some code here
}
Frame
is a struct, myFramesDictionary
is a Dictionary<int, Frame>
.
Is this a possible bug in MonoTouch 5.3.x? I don't know how to recreate the issue without sending our entire app to Xamarin.
UPDATE
We disabled the LLVM compiler option and it fixed the hang.
I was not able to create a small project to reproduce the issue. Not sure I want to send the entire app to Xamarin to debug. Any ideas on re-creating this?
Upvotes: 4
Views: 208
Reputation: 26505
I updated to XCode 4.4 and command line tools and this problem went away.
I am not sure if the XCode update fixed it, or perhaps I updated XCode and not the command line tools.
Upvotes: 0
Reputation: 19345
Unless you have some very strange memory corruptions, you will not deadlock in memset.
Besides, to diagnose a deadlock you need to show more than one thread, since you need at least two threads to deadlock in the first place :)
I believe you're running into an infinite loop of some sort. You can easily check this either with a breakpoint in a debugger or with a Console.WriteLine at the start of frame #1 in your crash report.
Upvotes: 2