xLua icon indicating copy to clipboard operation
xLua copied to clipboard

Unity多线程增加THREAD_SAFE宏定义仍然Crash

Open UnityLearnerr opened this issue 4 years ago • 6 comments

`========== OUTPUTTING STACK TRACE ==================

0x00007FFFB86B698A (xlua) lua_newthread 0x00007FFFB86B3B2B (xlua) lua_newthread 0x00007FFFB86B41A5 (xlua) lua_newthread 0x00007FFFB86A24D3 (xlua) lua_next 0x00007FFFB86B9AC6 (xlua) lua_newthread 0x00007FFFB86B9AA8 (xlua) lua_newthread 0x00007FFFB86BBC78 (xlua) luaL_where 0x00007FFFB86BBB45 (xlua) luaL_where 0x00007FFFB86BB8D3 (xlua) luaL_traceback 0x00007FFFB86BE42F (xlua) luaopen_coroutine 0x00007FFFB86A7C92 (xlua) lua_setlocal 0x00007FFFB86A7745 (xlua) lua_setlocal 0x00007FFFB86A77A5 (xlua) lua_setlocal 0x00007FFFB86A7F95 (xlua) lua_setlocal 0x00007FFFB86A79E0 (xlua) lua_setlocal 0x00007FFFB86A25F1 (xlua) lua_pcallk 0x00007FFFB86D1525 (xlua) lua_pcall 0x0000000055B05526 (Mono JIT Code) (wrapper managed-to-native) XLua.LuaDLL.Lua:lua_pcall (intptr,int,int,int) 0x0000000066B90D1B (Mono JIT Code) [E:\CellAtWorkClone\WorkCellClient\Assets\XLua\Src\StaticLuaCallbacks.cs:645] XLua.StaticLuaCallbacks:Print (intptr) 0x0000000055B01C0B (Mono JIT Code) (wrapper native-to-managed) XLua.StaticLuaCallbacks:Print (intptr) 0x00007FFFB86D10CC (xlua) cls_newindexer 0x00007FFFB86A7C92 (xlua) lua_setlocal 0x00007FFFB86B8437 (xlua) lua_newthread 0x00007FFFB86A7751 (xlua) lua_setlocal 0x00007FFFB86A77A5 (xlua) lua_setlocal 0x00007FFFB86A7F95 (xlua) lua_setlocal 0x00007FFFB86A79E0 (xlua) lua_setlocal 0x00007FFFB86A25F1 (xlua) lua_pcallk 0x00007FFFB86D1525 (xlua) lua_pcall 0x0000000055B05526 (Mono JIT Code) (wrapper managed-to-native) XLua.LuaDLL.Lua:lua_pcall (intptr,int,int,int) 0x0000000065F7BA53 (Mono JIT Code) XLuaGenDelegateImpl0:Gen_Delegate_Imp8 () 0x0000000066BA98D2 (Mono JIT Code) [E:\CellAtWorkClone\WorkCellClient\Assets\Scripts\Ping.cs:26] Ping:SendPing () 0x0000000066BA96DF (Mono JIT Code) System.Threading.ThreadHelper:ThreadStart_Context (object) 0x0000000066BA8B91 (Mono JIT Code) System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) 0x0000000066BA850B (Mono JIT Code) System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) 0x0000000066BA8353 (Mono JIT Code) System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object) 0x0000000066BA807B (Mono JIT Code) System.Threading.ThreadHelper:ThreadStart () 0x0000000046474CD0 (Mono JIT Code) (wrapper runtime-invoke) object:runtime_invoke_void__this (object,intptr,intptr,intptr) 0x00007FFFAF16BE7B (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\mini\mini-runtime.c:2809] mono_jit_runtime_invoke 0x00007FFFAF0F1E32 (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:2919] do_runtime_invoke 0x00007FFFAF0FB012 (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:3071] mono_runtime_invoke_checked 0x00007FFFAF11549F (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\threads.c:1043] start_wrapper_internal 0x00007FFFAF1151E6 (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\threads.c:1093] start_wrapper 0x00007FFFFDBD7034 (KERNEL32) BaseThreadInitThunk 0x00007FFFFDEE2651 (ntdll) RtlUserThreadStart

========== END OF STACKTRACE ===========`

`public class Ping : TSingletonComponent<Ping> { private Action luaSendPing = null; private Thread t;

public void Init(Action luaSendPing)
{
    this.luaSendPing = luaSendPing;
    Log.d("ping", "开启线程");
    t = new Thread(SendPing);
    t.Start();
}

void SendPing()
{
    while (true)
    {
        Thread.Sleep(5000);
        luaSendPing();
    }
}

private void OnDestroy()
{
    StopPing();
}

public void StopPing()
{
    if (t != null)
    {
        Log.d("ping", "关闭线程");
        t.Abort();
        t = null;
    }
    if (luaSendPing != null) 
    {
        luaSendPing = null;
    }
}

}`

UnityLearnerr avatar Aug 10 '21 08:08 UnityLearnerr

是不是漏了lua的代码?

chexiongsheng avatar Aug 10 '21 08:08 chexiongsheng

-- lua端接口传到了C#端 function Packet.CMDS2CLogin(bytes) print("CMDS2CLogin") local pbData = Packet.ParseMessage("S2CLogin", bytes) if pbData.isSuccess then App:GetModel("SystemModel"):ParseData(pbData) Packet.CMDC2SEnterGame(pbData.token) CS.Ping:GetInstance():Init(Packet.CMDC2SPing) end end

-- 在这里执行的,并且运行时能看到Ping的日志 function Packet.CMDC2SPing() CS.UnityEngine.Debug.Log("Ping") local sendData = {} sendData.code = App:GetModel("SystemModel").code + 1 Packet.SendPacket("CMDC2SPing", "C2SPing", sendData) end

UnityLearnerr avatar Aug 10 '21 08:08 UnityLearnerr

-- lua端接口传到了C#端 function Packet.CMDS2CLogin(bytes) print("CMDS2CLogin") local pbData = Packet.ParseMessage("S2CLogin", bytes) if pbData.isSuccess then App:GetModel("SystemModel"):ParseData(pbData) Packet.CMDC2SEnterGame(pbData.token) CS.Ping:GetInstance():Init(Packet.CMDC2SPing) end end

-- 在这里执行的,并且运行时能看到Ping的日志 function Packet.CMDC2SPing() CS.UnityEngine.Debug.Log("Ping") local sendData = {} sendData.code = App:GetModel("SystemModel").code + 1 Packet.SendPacket("CMDC2SPing", "C2SPing", sendData) end

这啥?能否有简单的例子,你这一大堆代码,调用了一大堆东西,你怎么确认是不是被调用c# api没做线程安全呢?

chexiongsheng avatar Aug 10 '21 09:08 chexiongsheng

一个简单例子: 1.在lua main文件中声明一个全局的方法ThreadMethod,方法内部进行日志打印,如下 function ThreadMethod() CS.UnityEngine.Debug.Log("ThreadMethod Call") end 2.C#端通过m_luaenv.Global.Get("ThreadMethod", out ThreadMethod); 获取该lua接口后,调用StartThread()开启线程 ` System.Threading.Thread t; private void StartThread() { t = new System.Threading.Thread(TreadCall); t.Start(); }

private void TreadCall()
{
    while (true)
    {
        ThreadMethod();
        Debug.Log("TreadCall");
        System.Threading.Thread.Sleep(1000);
    }
}`

3.挂着不动等待5分钟左右会崩溃,两次崩溃日志不太相同,请大佬指教哪里出了问题[抱拳] ---------------------------------------第一个崩溃日志------------------------------------------------- 0x00007FFFC45587BB (xlua) lua_yieldk 0x00007FFFC4557B6B (xlua) lua_setlocal 0x00007FFFC4557745 (xlua) lua_setlocal 0x00007FFFC45577A5 (xlua) lua_setlocal 0x00007FFFC4557F95 (xlua) lua_setlocal 0x00007FFFC45579E0 (xlua) lua_setlocal 0x00007FFFC45525F1 (xlua) lua_pcallk 0x00007FFFC4581525 (xlua) lua_pcall 0x00000000505A80F6 (Mono JIT Code) (wrapper managed-to-native) XLua.LuaDLL.Lua:lua_pcall (intptr,int,int,int) 0x00000000770D82DB (Mono JIT Code) XLuaGenDelegateImpl0:Gen_Delegate_Imp12 (single) 0x00000000770D7E3A (Mono JIT Code) [E:\CellAtWorkClone\WorkCellClient\Assets\Scripts\LuaHelper\LuaLooper.cs:88] LuaLooper:FixedUpdate () 0x000000005052E8A8 (Mono JIT Code) (wrapper runtime-invoke) object:runtime_invoke_void__this (object,intptr,intptr,intptr) 0x00007FFFB4CABE7B (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\mini\mini-runtime.c:2809] mono_jit_runtime_invoke 0x00007FFFB4C31E32 (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:2919] do_runtime_invoke 0x00007FFFB4C3AE3F (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:2966] mono_runtime_invoke 0x0000000140C006EA (Unity) scripting_method_invoke 0x0000000140BF0A3A (Unity) ScriptingInvocation::Invoke 0x0000000140BB9627 (Unity) MonoBehaviour::CallMethodIfAvailable 0x0000000140BB9D41 (Unity) MonoBehaviour::CallUpdateMethod 0x00000001406EC21C (Unity) BaseBehaviourManager::CommonUpdate<FixedBehaviourManager> 0x00000001406F28D6 (Unity) FixedBehaviourManager::Update 0x000000014095BD9C (Unity) InitPlayerLoopCallbacks'::2'::FixedUpdateScriptRunBehaviourFixedUpdateRegistrator::Forward 0x000000014095B397 (Unity) ExecutePlayerLoop 0x000000014095B463 (Unity) ExecutePlayerLoop 0x000000014095E721 (Unity) PlayerLoop 0x000000014133DE2F (Unity) PlayerLoopController::UpdateScene 0x000000014133C3E0 (Unity) Application::TickTimer 0x000000014149881B (Unity) MainMessageLoop 0x000000014149A4B6 (Unity) WinMain 0x00000001424864EA (Unity) __scrt_common_main_seh 0x00007FFFFDBD7034 (KERNEL32) BaseThreadInitThunk 0x00007FFFFDEE2651 (ntdll) RtlUserThreadStart) ---------------------------------------第二个崩溃日志------------------------------------------------- 0x00007FFFC45810DB (xlua) cls_newindexer 0x00007FFFC4557C92 (xlua) lua_setlocal 0x00007FFFC4568437 (xlua) lua_newthread 0x00007FFFC4557751 (xlua) lua_setlocal 0x00007FFFC45577A5 (xlua) lua_setlocal 0x00007FFFC4557F95 (xlua) lua_setlocal 0x00007FFFC45579E0 (xlua) lua_setlocal 0x00007FFFC45525F1 (xlua) lua_pcallk 0x00007FFFC4581525 (xlua) lua_pcall 0x000000005D4E80F6 (Mono JIT Code) (wrapper managed-to-native) XLua.LuaDLL.Lua:lua_pcall (intptr,int,int,int) 0x000000006F40B95B (Mono JIT Code) XLuaGenDelegateImpl0:Gen_Delegate_Imp12 (single) 0x000000006F40B4BA (Mono JIT Code) [E:\CellAtWorkClone\WorkCellClient\Assets\Scripts\LuaHelper\LuaLooper.cs:88] LuaLooper:FixedUpdate () 0x0000000057D50168 (Mono JIT Code) (wrapper runtime-invoke) object:runtime_invoke_void__this (object,intptr,intptr,intptr) 0x00007FFFB4CABE7B (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\mini\mini-runtime.c:2809] mono_jit_runtime_invoke 0x00007FFFB4C31E32 (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:2919] do_runtime_invoke 0x00007FFFB4C3AE3F (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:2966] mono_runtime_invoke TreadCall UnityEngine.DebugLogHandler:Internal_Log(LogType, String, Object) UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[]) UnityEngine.Logger:Log(LogType, Object) UnityEngine.Debug:Log(Object) LuaScriptManager:TreadCall() (at Assets\Scripts\LuaHelper\LuaScriptManager.cs:100) System.Threading.ThreadHelper:ThreadStart_Context(Object) System.Threading.ExecutionContext:RunInternal(ExecutionContext, ContextCallback, Object, Boolean) System.Threading.ExecutionContext:Run(ExecutionContext, ContextCallback, Object, Boolean) System.Threading.ExecutionContext:Run(ExecutionContext, ContextCallback, Object) System.Threading.ThreadHelper:ThreadStart()

(Filename: Assets/Scripts/LuaHelper/LuaScriptManager.cs Line: 100)

0x0000000140C006EA (Unity) scripting_method_invoke 0x0000000140BF0A3A (Unity) ScriptingInvocation::Invoke 0x0000000140BB9627 (Unity) MonoBehaviour::CallMethodIfAvailable 0x0000000140BB9D41 (Unity) MonoBehaviour::CallUpdateMethod 0x00000001406EC21C (Unity) BaseBehaviourManager::CommonUpdate<FixedBehaviourManager> 0x00000001406F28D6 (Unity) FixedBehaviourManager::Update 0x000000014095BD9C (Unity) InitPlayerLoopCallbacks'::2'::FixedUpdateScriptRunBehaviourFixedUpdateRegistrator::Forward 0x000000014095B397 (Unity) ExecutePlayerLoop 0x000000014095B463 (Unity) ExecutePlayerLoop 0x000000014095E721 (Unity) PlayerLoop 0x000000014133DE2F (Unity) PlayerLoopController::UpdateScene 0x000000014133C3E0 (Unity) Application::TickTimer 0x000000014149881B (Unity) MainMessageLoop 0x000000014149A4B6 (Unity) WinMain 0x00000001424864EA (Unity) __scrt_common_main_seh 0x00007FFFFDBD7034 (KERNEL32) BaseThreadInitThunk 0x00007FFFFDEE2651 (ntdll) RtlUserThreadStart

UnityLearnerr avatar Aug 11 '21 04:08 UnityLearnerr

THREAD_SAFE已经确保lua同一时间只能被一个线程访问。 而且按你的测试场景,即使不加THREAD_SAFE也不会有问题,因为只有一个线程在访问。 所以怀疑UnityEngine.Debug.Log在非主线程调用的问题。Unity很多api其实都不支持在非主线程调用。

chexiongsheng avatar Aug 12 '21 02:08 chexiongsheng

@UnityLearnerr 排查出来是log的问题还是 调用了其它untiy非线程安全api

superolddu avatar Sep 18 '21 07:09 superolddu