@@ -109,15 +109,30 @@ __declspec(dllexport) void TITCALL DebugLoop()
109
109
}
110
110
}
111
111
112
- if (IsDbgReplyLaterSupported && DBGEvent. dwDebugEventCode == EXCEPTION_DEBUG_EVENT )
112
+ if (IsDbgReplyLaterSupported)
113
113
{
114
- // Check if there is a thread processing a single step
115
- if (ThreadBeingProcessed != 0 && DBGEvent.dwThreadId != ThreadBeingProcessed)
114
+ if (DBGEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT)
116
115
{
117
- // Reply to the dbg event later
118
- DBGCode = DBG_REPLY_LATER;
116
+ // Check if there is a thread processing a single step
117
+ if (ThreadBeingProcessed != 0 && DBGEvent.dwThreadId != ThreadBeingProcessed)
118
+ {
119
+ // Reply to the dbg event later
120
+ DBGCode = DBG_REPLY_LATER;
121
+
122
+ goto continue_dbg_event;
123
+ }
124
+ }
125
+ else if (DBGEvent.dwDebugEventCode == EXIT_THREAD_DEBUG_EVENT)
126
+ {
127
+ if (ThreadBeingProcessed != 0 && DBGEvent.dwThreadId == ThreadBeingProcessed)
128
+ {
129
+ // Resume the other threads since the thread being processed is exiting
130
+ for (auto & Thread : SuspendedThreads)
131
+ ResumeThread (Thread.hThread );
119
132
120
- goto continue_dbg_event;
133
+ SuspendedThreads.clear ();
134
+ ThreadBeingProcessed = 0 ;
135
+ }
121
136
}
122
137
}
123
138
@@ -1394,7 +1409,7 @@ __declspec(dllexport) void TITCALL DebugLoop()
1394
1409
break ;
1395
1410
}
1396
1411
1397
- if (IsDbgReplyLaterSupported)
1412
+ if (IsDbgReplyLaterSupported && DBGEvent. dwDebugEventCode != EXIT_THREAD_DEBUG_EVENT )
1398
1413
{
1399
1414
CONTEXT DbgCtx;
1400
1415
@@ -1414,6 +1429,11 @@ __declspec(dllexport) void TITCALL DebugLoop()
1414
1429
if (ThreadBeingProcessed == Thread.dwThreadId )
1415
1430
continue ;
1416
1431
1432
+ // Check if the thread is already suspended
1433
+ for (auto & SuspendedThread : SuspendedThreads)
1434
+ if (SuspendedThread.dwThreadId == Thread.dwThreadId )
1435
+ continue ;
1436
+
1417
1437
if (SuspendThread (Thread.hThread ) != -1 )
1418
1438
SuspendedThreads.push_back (Thread);
1419
1439
}
0 commit comments