协同呼叫崩溃

时间:2014-04-14 13:56:11

标签: c# ios unity3d coroutine

我遇到了非常奇怪的崩溃事件:

Exception Type:  EXC_BAD_ACCESS (SIGABRT)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000004
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x3b1cc350 __pthread_kill + 8
1   libsystem_c.dylib               0x3b14311e pthread_kill + 54
2   libsystem_c.dylib               0x3b17f96e abort + 90
3   _example                        0x0161cd74 mono_handle_native_sigsegv + 312
4   _example                        0x0160c6e4 mono_sigsegv_signal_handler + 256
5   libsystem_c.dylib               0x3b14ce90 _sigtramp + 40
6   _example                        0x01707114 g_hash_table_lookup_extended + 172
7   _example                        0x01707154 g_hash_table_lookup + 20
8   _example                        0x016a3144 mono_metadata_parse_type_full + 636
9   _example                        0x016a2e70 mono_metadata_parse_generic_inst + 88
10  _example                        0x016a34bc do_mono_metadata_parse_type + 768
11  _example                        0x016a3abc mono_type_create_from_typespec + 216
12  _example                        0x0164ee70 mono_type_retrieve_from_typespec + 32
13  _example                        0x016464bc mono_class_get_full + 208
14  _example                        0x01677fc4 method_from_memberref + 276
15  _example                        0x016774a4 mono_get_method_from_token + 688
16  _example                        0x01677140 mono_get_method_full + 176
17  _example                        0x01677754 mono_get_method + 12
18  _example                        0x01613554 decode_patch + 412
19  _example                        0x016161f8 mono_aot_plt_resolve + 244
20  _example                        0x0161e518 mono_aot_plt_trampoline + 32
21  _example                        0x00dd33d8 generic_trampoline_6 + 120
22  _example                        0x0124b0a8 scripting_method_invoke(ScriptingMethod*, MonoObject*, ScriptingArguments&, MonoException**) (ScriptingBackendApi_Mono.cpp:180)
23  _example                        0x012ceed0 ScriptingInvocation::Invoke(MonoException**, bool) (ScriptingInvocation.cpp:113)
24  _example                        0x012cee9c ScriptingInvocation::Invoke(MonoException**) (ScriptingInvocation.cpp:98)
25  _example                        0x012cee48 bool ScriptingInvocation::Invoke<bool>(MonoException**) (ScriptingInvocation.cpp:72)
26  _example                        0x012b2548 Coroutine::InvokeMoveNext(MonoException**) (Coroutine.cpp:180)
27  _example                        0x012b229c Coroutine::Run() (Coroutine.cpp:205)
28  _example                        0x012c4f6c MonoBehaviour::CreateCoroutine(MonoObject*, ScriptingMethod*) (MonoBehaviour.cpp:786)
29  _example                        0x012c51f0 MonoBehaviour::StartCoroutineManaged2(MonoObject*) (MonoBehaviour.cpp:824)
30  _example                        0x0144f89c MonoBehaviour_CUSTOM_StartCoroutine_Auto(ReadOnlyScriptingObjectOfType<MonoBehaviour>, MonoObject*) (UnityEngineMonoBehaviour.cpp:78)
31  _example                        0x00b6745c m_UnityEngine_MonoBehaviour_StartCoroutine_System_Collections_IEnumerator + 40

它们在iOS 6的4S上大约20%的时间发生在同一个地方,但是我无法在iOS 7的iPhone 5上重现它们。

在代码中,我试图调用coroutine,它看起来像这样:

IEnumerator SomeCoroutine(System.Action<bool> _Success)
{
    #if UNITY_IPHONE
    NativeObjectiveCMethod();
    #elif UNITY_ANDROID
    // ... something else, not relevant here
    #endif
    while(m_PrivateFieldSetInOtherThread == null)
    {
        yield return null;
    }

    if (_Success != null)
    {
        _Success(m_PrivateFieldSetInOtherThread.Value);
    }
    m_PrivateFieldSetInOtherThread = null;

}

我甚至不知道它究竟在哪里崩溃。

澄清:此字段在其他线程中设置,因为调用源自本机级别的第三方API。

1 个答案:

答案 0 :(得分:3)

Unity的ApI 线程安全,因此无法从另一个线程使用它。 Unity还实现了一个线程检查,以防止您尝试从另一个线程使用它。