Fixed a bug in which thread termination froze

This commit is contained in:
the_janitor 2021-09-19 03:05:46 +02:00
parent bbab6359b0
commit 39fe35a09e
1 changed files with 27 additions and 7 deletions

View File

@ -109,7 +109,9 @@ __declspec(dllexport) void TITCALL DebugLoop()
} }
} }
if (IsDbgReplyLaterSupported && DBGEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT) if (IsDbgReplyLaterSupported)
{
if (DBGEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT)
{ {
// Check if there is a thread processing a single step // Check if there is a thread processing a single step
if (ThreadBeingProcessed != 0 && DBGEvent.dwThreadId != ThreadBeingProcessed) if (ThreadBeingProcessed != 0 && DBGEvent.dwThreadId != ThreadBeingProcessed)
@ -120,6 +122,19 @@ __declspec(dllexport) void TITCALL DebugLoop()
goto continue_dbg_event; goto continue_dbg_event;
} }
} }
else if (DBGEvent.dwDebugEventCode == EXIT_THREAD_DEBUG_EVENT)
{
if (ThreadBeingProcessed != 0 && DBGEvent.dwThreadId == ThreadBeingProcessed)
{
// Resume the other threads since the thread being processed is exiting
for (auto& Thread : SuspendedThreads)
ResumeThread(Thread.hThread);
SuspendedThreads.clear();
ThreadBeingProcessed = 0;
}
}
}
if(engineExecutePluginCallBack) if(engineExecutePluginCallBack)
{ {
@ -1394,7 +1409,7 @@ __declspec(dllexport) void TITCALL DebugLoop()
break; break;
} }
if (IsDbgReplyLaterSupported) if (IsDbgReplyLaterSupported && DBGEvent.dwDebugEventCode != EXIT_THREAD_DEBUG_EVENT)
{ {
CONTEXT DbgCtx; CONTEXT DbgCtx;
@ -1414,6 +1429,11 @@ __declspec(dllexport) void TITCALL DebugLoop()
if (ThreadBeingProcessed == Thread.dwThreadId) if (ThreadBeingProcessed == Thread.dwThreadId)
continue; continue;
// Check if the thread is already suspended
for (auto& SuspendedThread : SuspendedThreads)
if (SuspendedThread.dwThreadId == Thread.dwThreadId)
continue;
if (SuspendThread(Thread.hThread) != -1) if (SuspendThread(Thread.hThread) != -1)
SuspendedThreads.push_back(Thread); SuspendedThreads.push_back(Thread);
} }