LazDebugger(Fp)Lldb: improve cancel watch eval (cancel current watch, in mem-reader), on receiving run/step request

git-svn-id: trunk@60652 -
This commit is contained in:
martin 2019-03-11 13:45:22 +00:00
parent 767e4c056c
commit 19b18e1f67
2 changed files with 20 additions and 0 deletions

View File

@ -45,10 +45,12 @@ type
//FThreadId: Integer; //FThreadId: Integer;
//FStackFrame: Integer; //FStackFrame: Integer;
FDebugger: TFpLldbDebugger; FDebugger: TFpLldbDebugger;
FEnabled: Boolean;
//FCmd: TLldbDebuggerCommandMemReader; //FCmd: TLldbDebuggerCommandMemReader;
protected protected
// TODO: needs to be handled by memory manager // TODO: needs to be handled by memory manager
//FThreadId, FStackFrame: Integer; //FThreadId, FStackFrame: Integer;
property Enabled: Boolean read FEnabled write FEnabled;
public public
constructor Create(ADebugger: TFpLldbDebugger); constructor Create(ADebugger: TFpLldbDebugger);
destructor Destroy; override; destructor Destroy; override;
@ -152,6 +154,7 @@ type
property TargetPID; property TargetPID;
{$EndIf} {$EndIf}
property DebugInstructionQueue; property DebugInstructionQueue;
property MemReader: TFpLldbDbgMemReader read FMemReader;
protected protected
procedure DoWatchFreed(Sender: TObject); procedure DoWatchFreed(Sender: TObject);
function EvaluateExpression(AWatchValue: TWatchValue; function EvaluateExpression(AWatchValue: TWatchValue;
@ -368,6 +371,8 @@ begin
FOwner.ProcessLocals(FLocals); FOwner.ProcessLocals(FLocals);
FLocals.RemoveFreeNotification(@DoLocalsFreed); FLocals.RemoveFreeNotification(@DoLocalsFreed);
end; end;
if TFpLldbDebugger(Debugger).MemReader <> nil then
TFpLldbDebugger(Debugger).MemReader.Enabled := True;
Finished; Finished;
end; end;
@ -375,6 +380,8 @@ procedure TFpLldbDebuggerCommandLocals.DoCancel;
begin begin
inherited DoCancel; inherited DoCancel;
FOwner.FLocalsEvalCancel := True; FOwner.FLocalsEvalCancel := True;
if TFpLldbDebugger(Debugger).MemReader <> nil then
TFpLldbDebugger(Debugger).MemReader.Enabled := False;
end; end;
constructor TFpLldbDebuggerCommandLocals.Create(AOwner: TFPLldbLocals; ALocals: TLocals); constructor TFpLldbDebuggerCommandLocals.Create(AOwner: TFPLldbLocals; ALocals: TLocals);
@ -478,6 +485,8 @@ begin
FOwner.FEvaluationCmdObj := nil; FOwner.FEvaluationCmdObj := nil;
FOwner.ProcessEvalList; FOwner.ProcessEvalList;
Finished; Finished;
if TFpLldbDebugger(Debugger).FMemReader <> nil then
TFpLldbDebugger(Debugger).FMemReader.Enabled := True;
end; end;
procedure TFpLldbDebuggerCommandEvaluate.DoFree; procedure TFpLldbDebuggerCommandEvaluate.DoFree;
@ -490,6 +499,8 @@ procedure TFpLldbDebuggerCommandEvaluate.DoCancel;
begin begin
inherited DoCancel; inherited DoCancel;
FOwner.FWatchEvalCancel := True; FOwner.FWatchEvalCancel := True;
if TFpLldbDebugger(Debugger).FMemReader <> nil then
TFpLldbDebugger(Debugger).FMemReader.Enabled := False;
end; end;
//procedure TFpLldbDebuggerCommandEvaluate.DoCancel; //procedure TFpLldbDebuggerCommandEvaluate.DoCancel;
@ -557,6 +568,7 @@ end;
constructor TFpLldbDbgMemReader.Create(ADebugger: TFpLldbDebugger); constructor TFpLldbDbgMemReader.Create(ADebugger: TFpLldbDebugger);
begin begin
FDebugger := ADebugger; FDebugger := ADebugger;
FEnabled := True;
//FCmd := TLldbDebuggerCommandMemReader.Create(ADebugger); //FCmd := TLldbDebuggerCommandMemReader.Create(ADebugger);
end; end;
@ -573,6 +585,8 @@ var
InStr: TLldbInstructionMemory; InStr: TLldbInstructionMemory;
begin begin
Result := False; Result := False;
if not Enabled then
Exit;
InStr := TLldbInstructionMemory.Create(AnAddress, ASize); InStr := TLldbInstructionMemory.Create(AnAddress, ASize);
try try
FDebugger.DebugInstructionQueue.QueueInstruction(InStr); FDebugger.DebugInstructionQueue.QueueInstruction(InStr);
@ -614,6 +628,8 @@ var
QItem: TLldbDebuggerCommand; QItem: TLldbDebuggerCommand;
begin begin
Result := False; Result := False;
if not Enabled then
Exit;
// WINDOWS gdb dwarf names // WINDOWS gdb dwarf names
@ -1090,6 +1106,8 @@ procedure TFpLldbDebugger.DoState(const OldState: TDBGState);
var var
i: Integer; i: Integer;
begin begin
if FMemReader <> nil then
FMemReader.Enabled := True;
inherited DoState(OldState); inherited DoState(OldState);
if State in [dsStop, dsError, dsNone] then if State in [dsStop, dsError, dsNone] then
UnLoadDwarf; UnLoadDwarf;

View File

@ -2187,10 +2187,12 @@ begin
FIsRunning := True; FIsRunning := True;
d := Debugger; d := Debugger;
try try
AddReference;
d.LockRelease; d.LockRelease;
DoExecute; // may call Finished and Destroy Self DoExecute; // may call Finished and Destroy Self
finally finally
d.UnlockRelease; d.UnlockRelease;
ReleaseReference;
end; end;
end; end;