diff --git a/debugger/debugger.pp b/debugger/debugger.pp index 7f77536171..8b297fc3c2 100644 --- a/debugger/debugger.pp +++ b/debugger/debugger.pp @@ -2272,6 +2272,7 @@ type protected procedure ChangeCurrentThread({%H-}ANewId: Integer); virtual; procedure RequestMasterData; virtual; + procedure DoStateChange(const AOldState: TDBGState); override; procedure DoStateEnterPause; override; procedure DoStateLeavePause; override; procedure DoStateLeavePauseClean; override; @@ -5816,6 +5817,13 @@ begin // end; +procedure TThreadsSupplier.DoStateChange(const AOldState: TDBGState); +begin + if (Debugger.State = dsStop) and (CurrentThreads <> nil) then + CurrentThreads.Clear; + inherited DoStateChange(AOldState); +end; + procedure TThreadsSupplier.DoStateEnterPause; begin if (CurrentThreads = nil) then Exit; @@ -6143,6 +6151,7 @@ begin TThreadEntry(Flist[0]).Free; FList.Delete(0); end; + FCurrentThreadId := 0; end; procedure TThreads.Add(AThread: TThreadEntry); diff --git a/debugger/gdbmidebugger.pp b/debugger/gdbmidebugger.pp index 43745e4d08..f698579e1e 100644 --- a/debugger/gdbmidebugger.pp +++ b/debugger/gdbmidebugger.pp @@ -7192,6 +7192,8 @@ begin if (State = dsError) and (DebugProcessRunning) then begin FCurrentStackFrameValid := False; FCurrentThreadIdValid := False; + FCurrentThreadId := 0; + FCurrentStackFrame := 0; SendCmdLn('kill'); // try to kill the debugged process. bypass all queues. DebugProcess.Terminate(0); end; @@ -7210,6 +7212,12 @@ end; procedure TGDBMIDebugger.DoBeforeState(const OldState: TDBGState); begin + if State in [dsStop] then begin + FCurrentStackFrameValid := False; + FCurrentThreadIdValid := False; + FCurrentThreadId := 0; + FCurrentStackFrame := 0; + end; inherited DoBeforeState(OldState); Threads.CurrentThreads.CurrentThreadId := FCurrentThreadId; // TODO: Works only because CurrentThreadId is always valid end;