mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-15 19:39:28 +02:00
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:
parent
5aa4ccaa47
commit
5c22ff5ad2
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user