From 54b37b9baef669f1ac70d429b1d4251d2a3a6aa0 Mon Sep 17 00:00:00 2001 From: Colin Senner Date: Sun, 12 Jul 2026 23:49:58 -0700 Subject: [PATCH 1/2] fixes an issue where you cannot step over int3 instructions even with Skip INT3 Stepping enabled --- TitanEngine/TitanEngine.Debugger.DebugLoop.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp b/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp index d11889f..1dad859 100644 --- a/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp +++ b/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp @@ -601,6 +601,10 @@ __declspec(dllexport) void TITCALL DebugLoop() ULONG_PTR exceptionAddress = (ULONG_PTR)DBGEvent.u.Exception.ExceptionRecord.ExceptionAddress; if(recentlyDeletedBpx.find(exceptionAddress) != recentlyDeletedBpx.end()) + unsigned char currentByte = 0xCC; + MemoryReadSafe(dbgProcessInformation.hProcess, (void*)exceptionAddress, ¤tByte, 1, nullptr); + + if(currentByte != 0xCC && recentlyDeletedBpx.find(exceptionAddress) != recentlyDeletedBpx.end()) { //breakpoint was recently deleted - handle the stale event gracefully hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId); From 363a961c8cfc2a8742d5ec093c80f863d09fab1c Mon Sep 17 00:00:00 2001 From: Colin Senner Date: Sun, 12 Jul 2026 23:49:58 -0700 Subject: [PATCH 2/2] fixes an issue where you cannot step over int3 instructions even with Skip INT3 Stepping enabled --- TitanEngine/TitanEngine.Debugger.DebugLoop.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp b/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp index d11889f..1eb07ee 100644 --- a/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp +++ b/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp @@ -600,7 +600,10 @@ __declspec(dllexport) void TITCALL DebugLoop() { ULONG_PTR exceptionAddress = (ULONG_PTR)DBGEvent.u.Exception.ExceptionRecord.ExceptionAddress; - if(recentlyDeletedBpx.find(exceptionAddress) != recentlyDeletedBpx.end()) + unsigned char currentByte = 0xCC; + MemoryReadSafe(dbgProcessInformation.hProcess, (void*)exceptionAddress, ¤tByte, 1, nullptr); + + if(currentByte != 0xCC && recentlyDeletedBpx.find(exceptionAddress) != recentlyDeletedBpx.end()) { //breakpoint was recently deleted - handle the stale event gracefully hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);