FpDebug: Fix stepping does not stop at next line (seen on Win7 only / Maybe issue #39383).

When checking if a step-in/over returned from going over a called proc (using the hidden-break), do not trust the BasePointer.
This commit is contained in:
Martin 2021-12-09 23:11:49 +01:00
parent 5aa4ccaa47
commit 5c22ff5ad2

View File

@ -82,7 +82,7 @@ type
private private
FStackFrameInfo: TDbgStackFrameInfo; FStackFrameInfo: TDbgStackFrameInfo;
FHiddenBreakpoint: TFpInternalBreakpoint; FHiddenBreakpoint: TFpInternalBreakpoint;
FHiddenBreakAddr, FHiddenBreakInstrPtr, FHiddenBreakFrameAddr, FHiddenBreakStackPtrAddr: TDBGPtr; FHiddenBreakAddr, FHiddenBreakInstrPtr, FHiddenBreakStackPtrAddr: TDBGPtr;
function GetIsSteppedOut: Boolean; function GetIsSteppedOut: Boolean;
protected protected
function IsAtHiddenBreak: Boolean; inline; function IsAtHiddenBreak: Boolean; inline;
@ -742,13 +742,9 @@ begin
Result := HasHiddenBreak; Result := HasHiddenBreak;
if not Result then if not Result then
exit; exit;
if (FHiddenBreakInstrPtr = FThread.GetInstructionPointerRegisterValue) then (* This is to check, if we have returned from a "call" instruction. Back to the original frame. *)
Result := ((FHiddenBreakStackPtrAddr < FThread.GetStackPointerRegisterValue) or Result := (FHiddenBreakStackPtrAddr <= FThread.GetStackPointerRegisterValue);
(FHiddenBreakFrameAddr < FThread.GetStackBasePointerRegisterValue))
else
// InstructPtr moved, so SP can be equal
Result := ((FHiddenBreakStackPtrAddr <= FThread.GetStackPointerRegisterValue) or
(FHiddenBreakFrameAddr < FThread.GetStackBasePointerRegisterValue));
debugln(FPDBG_COMMANDS and Result and (FHiddenBreakpoint <> nil), ['BreakStepBaseCmd.IsAtOrOutOfHiddenBreakFrame: Gone past hidden break = true']); debugln(FPDBG_COMMANDS and Result and (FHiddenBreakpoint <> nil), ['BreakStepBaseCmd.IsAtOrOutOfHiddenBreakFrame: Gone past hidden break = true']);
end; end;
@ -756,7 +752,6 @@ procedure TDbgControllerHiddenBreakStepBaseCmd.SetHiddenBreak(AnAddr: TDBGPtr);
begin begin
// The callee may not setup a stackfram (StackBasePtr unchanged). So we use SP to detect recursive hits // The callee may not setup a stackfram (StackBasePtr unchanged). So we use SP to detect recursive hits
FHiddenBreakStackPtrAddr := FThread.GetStackPointerRegisterValue; FHiddenBreakStackPtrAddr := FThread.GetStackPointerRegisterValue;
FHiddenBreakFrameAddr := FThread.GetStackBasePointerRegisterValue;
FHiddenBreakInstrPtr := FThread.GetInstructionPointerRegisterValue; FHiddenBreakInstrPtr := FThread.GetInstructionPointerRegisterValue;
FHiddenBreakAddr := AnAddr; FHiddenBreakAddr := AnAddr;
FHiddenBreakpoint := FProcess.AddInternalBreak(AnAddr); FHiddenBreakpoint := FProcess.AddInternalBreak(AnAddr);