mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-27 16:20:35 +02:00
GdbmiDebugger: fix for none-seh exception-block stepping (step out from finally)
git-svn-id: trunk@64958 -
This commit is contained in:
parent
3bfe6e5a2c
commit
05d6300123
@ -718,6 +718,7 @@ type
|
|||||||
FRunToSrc: String;
|
FRunToSrc: String;
|
||||||
FRunToLine: Integer;
|
FRunToLine: Integer;
|
||||||
FStepBreakPoint: Integer;
|
FStepBreakPoint: Integer;
|
||||||
|
FForceContinueCheck: Boolean;
|
||||||
FInitialFP: TDBGPtr;
|
FInitialFP: TDBGPtr;
|
||||||
FStepOverFixNeeded: (sofNotNeeded, sofStepAgain, sofStepOut);
|
FStepOverFixNeeded: (sofNotNeeded, sofStepAgain, sofStepOut);
|
||||||
FStepStartedInFinSub: (sfsNone, sfsStepStarted, sfsStepExited);
|
FStepStartedInFinSub: (sfsNone, sfsStepStarted, sfsStepExited);
|
||||||
@ -6846,6 +6847,7 @@ begin
|
|||||||
if Reason = 'function-finished'
|
if Reason = 'function-finished'
|
||||||
then begin
|
then begin
|
||||||
CheckSehFinallyExited(List.Values['frame']);
|
CheckSehFinallyExited(List.Values['frame']);
|
||||||
|
Result := Result or FForceContinueCheck;
|
||||||
if not Result then begin
|
if not Result then begin
|
||||||
SetDebuggerState(dsPause);
|
SetDebuggerState(dsPause);
|
||||||
ProcessFrame(List.Values['frame'], False);
|
ProcessFrame(List.Values['frame'], False);
|
||||||
@ -7358,7 +7360,11 @@ var
|
|||||||
DisablePopCatches;
|
DisablePopCatches;
|
||||||
i := FindStackFrame(Fp, 0, 1); // -2 already stepped out of the desired frame, enter dsPause
|
i := FindStackFrame(Fp, 0, 1); // -2 already stepped out of the desired frame, enter dsPause
|
||||||
if (i in [0, 1]) or (i = -2) then begin
|
if (i in [0, 1]) or (i = -2) then begin
|
||||||
FCurrentExecCmd := ectStepOut; // ecStepOut will not offer a chance to ContinueStepping (there should be no breakpoint that can be hit before)
|
FForceContinueCheck := (FExecType = ectStepOut) and (i=1);
|
||||||
|
if FForceContinueCheck and (FStepBreakPoint > 0) then
|
||||||
|
FCurrentExecCmd := ectContinue
|
||||||
|
else
|
||||||
|
FCurrentExecCmd := ectStepOut; // ecStepOut will not offer a chance to ContinueStepping (there should be no breakpoint that can be hit before)
|
||||||
Result := True;
|
Result := True;
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
@ -7579,6 +7585,7 @@ begin
|
|||||||
FCanKillNow := False;
|
FCanKillNow := False;
|
||||||
FDidKillNow := False;
|
FDidKillNow := False;
|
||||||
FStepOverFixNeeded := sofNotNeeded;
|
FStepOverFixNeeded := sofNotNeeded;
|
||||||
|
FForceContinueCheck := False;
|
||||||
FNextExecQueued := False;
|
FNextExecQueued := False;
|
||||||
FP := 0;
|
FP := 0;
|
||||||
FInitialFP := FP;
|
FInitialFP := FP;
|
||||||
@ -7695,6 +7702,7 @@ begin
|
|||||||
ContinueStep := False;
|
ContinueStep := False;
|
||||||
if StoppedParams <> ''
|
if StoppedParams <> ''
|
||||||
then ContinueExecution := ProcessStopped(StoppedParams, FTheDebugger.PauseWaitState in [pwsInternal, pwsInternalCont]);
|
then ContinueExecution := ProcessStopped(StoppedParams, FTheDebugger.PauseWaitState in [pwsInternal, pwsInternalCont]);
|
||||||
|
FForceContinueCheck := False;
|
||||||
|
|
||||||
// FFpcSpecificHandlerCallFin was either hit, or the handler was exited
|
// FFpcSpecificHandlerCallFin was either hit, or the handler was exited
|
||||||
FTheDebugger.FFpcSpecificHandlerCallFin.Clear(Self);
|
FTheDebugger.FFpcSpecificHandlerCallFin.Clear(Self);
|
||||||
|
Loading…
Reference in New Issue
Block a user