我遇到了非常奇怪的崩溃事件:
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。
答案 0 :(得分:3)
Unity的ApI 不线程安全,因此无法从另一个线程使用它。 Unity还实现了一个线程检查,以防止您尝试从另一个线程使用它。