mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-15 23:59:12 +02:00
Debugger: added some fail-safety for destruction
git-svn-id: trunk@28254 -
This commit is contained in:
parent
14b597be41
commit
1ab431705c
@ -121,6 +121,7 @@ type
|
|||||||
TGDBMIDebuggerCommand = class
|
TGDBMIDebuggerCommand = class
|
||||||
private
|
private
|
||||||
FOnCancel: TNotifyEvent;
|
FOnCancel: TNotifyEvent;
|
||||||
|
FOnDestroy: TNotifyEvent;
|
||||||
FOnExecuted: TNotifyEvent;
|
FOnExecuted: TNotifyEvent;
|
||||||
FKeepFinished: Boolean;
|
FKeepFinished: Boolean;
|
||||||
FState : TGDBMIDebuggerCommandState;
|
FState : TGDBMIDebuggerCommandState;
|
||||||
@ -155,6 +156,7 @@ type
|
|||||||
procedure DoDbgEvent(const ACategory: TDBGEventCategory; const AText: String);
|
procedure DoDbgEvent(const ACategory: TDBGEventCategory; const AText: String);
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TGDBMIDebugger);
|
constructor Create(AOwner: TGDBMIDebugger);
|
||||||
|
destructor Destroy; override;
|
||||||
// DoQueued: Called if queued *behind* others
|
// DoQueued: Called if queued *behind* others
|
||||||
procedure DoQueued;
|
procedure DoQueued;
|
||||||
// DoFinished: Called after processing is done
|
// DoFinished: Called after processing is done
|
||||||
@ -166,6 +168,7 @@ type
|
|||||||
property State: TGDBMIDebuggerCommandState read FState;
|
property State: TGDBMIDebuggerCommandState read FState;
|
||||||
property OnExecuted: TNotifyEvent read FOnExecuted write FOnExecuted;
|
property OnExecuted: TNotifyEvent read FOnExecuted write FOnExecuted;
|
||||||
property OnCancel: TNotifyEvent read FOnCancel write FOnCancel;
|
property OnCancel: TNotifyEvent read FOnCancel write FOnCancel;
|
||||||
|
property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy;
|
||||||
property KeepFinished: Boolean read FKeepFinished write SetKeepFinished;
|
property KeepFinished: Boolean read FKeepFinished write SetKeepFinished;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -657,7 +660,6 @@ type
|
|||||||
{ TGDBMILocals }
|
{ TGDBMILocals }
|
||||||
|
|
||||||
TGDBMILocals = class(TDBGLocals)
|
TGDBMILocals = class(TDBGLocals)
|
||||||
procedure DoEvaluationFinished(Sender: TObject);
|
|
||||||
private
|
private
|
||||||
FEvaluatedState: TGDBMIEvaluationState;
|
FEvaluatedState: TGDBMIEvaluationState;
|
||||||
FEvaluationCmdObj: TGDBMIDebuggerCommandLocals;
|
FEvaluationCmdObj: TGDBMIDebuggerCommandLocals;
|
||||||
@ -666,6 +668,8 @@ type
|
|||||||
procedure LocalsNeeded;
|
procedure LocalsNeeded;
|
||||||
procedure CancelEvaluation;
|
procedure CancelEvaluation;
|
||||||
procedure AddLocals(const AParams:String);
|
procedure AddLocals(const AParams:String);
|
||||||
|
procedure DoEvaluationDestroyed(Sender: TObject);
|
||||||
|
procedure DoEvaluationFinished(Sender: TObject);
|
||||||
protected
|
protected
|
||||||
procedure DoStateChange(const AOldState: TDBGState); override;
|
procedure DoStateChange(const AOldState: TDBGState); override;
|
||||||
procedure Invalidate;
|
procedure Invalidate;
|
||||||
@ -689,6 +693,7 @@ type
|
|||||||
Map: TMap;
|
Map: TMap;
|
||||||
end;
|
end;
|
||||||
FGetLineSymbolsCmdObj: TGDBMIDebuggerCommandLineSymbolInfo;
|
FGetLineSymbolsCmdObj: TGDBMIDebuggerCommandLineSymbolInfo;
|
||||||
|
procedure DoGetLineSymbolsDestroyed(Sender: TObject);
|
||||||
procedure ClearSources;
|
procedure ClearSources;
|
||||||
procedure AddInfo(const ASource: String; const AResult: TGDBMIExecResult);
|
procedure AddInfo(const ASource: String; const AResult: TGDBMIExecResult);
|
||||||
procedure DoGetLineSymbolsFinished(Sender: TObject);
|
procedure DoGetLineSymbolsFinished(Sender: TObject);
|
||||||
@ -708,8 +713,6 @@ type
|
|||||||
{ TGDBMIRegisters }
|
{ TGDBMIRegisters }
|
||||||
|
|
||||||
TGDBMIRegisters = class(TDBGRegisters)
|
TGDBMIRegisters = class(TDBGRegisters)
|
||||||
procedure DoGetRegisterNamesFinished(Sender: TObject);
|
|
||||||
procedure DoGetRegValuesFinished(Sender: TObject);
|
|
||||||
private
|
private
|
||||||
FRegisters: TGDBMICpuRegisters;
|
FRegisters: TGDBMICpuRegisters;
|
||||||
|
|
||||||
@ -723,6 +726,10 @@ type
|
|||||||
|
|
||||||
procedure RegistersNeeded;
|
procedure RegistersNeeded;
|
||||||
procedure ValuesNeeded;
|
procedure ValuesNeeded;
|
||||||
|
procedure DoGetRegisterNamesDestroyed(Sender: TObject);
|
||||||
|
procedure DoGetRegisterNamesFinished(Sender: TObject);
|
||||||
|
procedure DoGetRegValuesDestroyed(Sender: TObject);
|
||||||
|
procedure DoGetRegValuesFinished(Sender: TObject);
|
||||||
protected
|
protected
|
||||||
procedure DoStateChange(const AOldState: TDBGState); override;
|
procedure DoStateChange(const AOldState: TDBGState); override;
|
||||||
procedure Invalidate;
|
procedure Invalidate;
|
||||||
@ -737,7 +744,6 @@ type
|
|||||||
{ TGDBMIWatch }
|
{ TGDBMIWatch }
|
||||||
|
|
||||||
TGDBMIWatch = class(TDBGWatch)
|
TGDBMIWatch = class(TDBGWatch)
|
||||||
procedure DoEvaluationFinished(Sender: TObject);
|
|
||||||
private
|
private
|
||||||
FEvaluatedState: TGDBMIEvaluationState;
|
FEvaluatedState: TGDBMIEvaluationState;
|
||||||
FEvaluationCmdObj: TGDBMIDebuggerCommandEvaluate;
|
FEvaluationCmdObj: TGDBMIDebuggerCommandEvaluate;
|
||||||
@ -747,6 +753,8 @@ type
|
|||||||
procedure EvaluationNeeded;
|
procedure EvaluationNeeded;
|
||||||
procedure CancelEvaluation;
|
procedure CancelEvaluation;
|
||||||
procedure ClearOwned;
|
procedure ClearOwned;
|
||||||
|
procedure DoEvaluationFinished(Sender: TObject);
|
||||||
|
procedure DoEvaluationDestroyed(Sender: TObject);
|
||||||
protected
|
protected
|
||||||
procedure DoEnableChange; override;
|
procedure DoEnableChange; override;
|
||||||
procedure DoExpressionChange; override;
|
procedure DoExpressionChange; override;
|
||||||
@ -774,14 +782,16 @@ type
|
|||||||
{ TGDBMICallStack }
|
{ TGDBMICallStack }
|
||||||
|
|
||||||
TGDBMICallStack = class(TDBGCallStack)
|
TGDBMICallStack = class(TDBGCallStack)
|
||||||
procedure DoDepthCommandExecuted(Sender: TObject);
|
|
||||||
procedure DoFramesCommandExecuted(Sender: TObject);
|
|
||||||
private
|
private
|
||||||
FFramesEvalCmdObj: TGDBMIDebuggerCommandStackFrames;
|
FFramesEvalCmdObj: TGDBMIDebuggerCommandStackFrames;
|
||||||
FDepthEvalCmdObj: TGDBMIDebuggerCommandStackDepth;
|
FDepthEvalCmdObj: TGDBMIDebuggerCommandStackDepth;
|
||||||
FInEvalDepth: Boolean;
|
FInEvalDepth: Boolean;
|
||||||
FInEvalFrames: Boolean;
|
FInEvalFrames: Boolean;
|
||||||
function InternalCreateEntry(AIndex: Integer; AArgInfo, AFrameInfo: TGDBMINameValueList): TCallStackEntry;
|
function InternalCreateEntry(AIndex: Integer; AArgInfo, AFrameInfo: TGDBMINameValueList): TCallStackEntry;
|
||||||
|
procedure DoDepthCommandExecuted(Sender: TObject);
|
||||||
|
procedure DoFramesCommandExecuted(Sender: TObject);
|
||||||
|
procedure DoDepthCommandDestroyed(Sender: TObject);
|
||||||
|
procedure DoFramesCommandDestroyed(Sender: TObject);
|
||||||
protected
|
protected
|
||||||
procedure Clear; override;
|
procedure Clear; override;
|
||||||
function CheckCount: Boolean; override;
|
function CheckCount: Boolean; override;
|
||||||
@ -806,6 +816,7 @@ type
|
|||||||
FDisassembleEvalCmdObj: TGDBMIDebuggerCommandDisassembe;
|
FDisassembleEvalCmdObj: TGDBMIDebuggerCommandDisassembe;
|
||||||
FLastExecAddr: TDBGPtr;
|
FLastExecAddr: TDBGPtr;
|
||||||
procedure DoDisassembleExecuted(Sender: TObject);
|
procedure DoDisassembleExecuted(Sender: TObject);
|
||||||
|
procedure DoDisassembleDestroyed(Sender: TObject);
|
||||||
protected
|
protected
|
||||||
function PrepareEntries(AnAddr: TDbgPtr; ALinesBefore, ALinesAfter: Integer): Boolean; override;
|
function PrepareEntries(AnAddr: TDbgPtr; ALinesBefore, ALinesAfter: Integer): Boolean; override;
|
||||||
function HandleRangeWithInvalidAddr(ARange: TDBGDisassemblerEntryRange;AnAddr:
|
function HandleRangeWithInvalidAddr(ARange: TDBGDisassemblerEntryRange;AnAddr:
|
||||||
@ -1097,6 +1108,12 @@ end;
|
|||||||
|
|
||||||
{ TGDBMIDisassembler }
|
{ TGDBMIDisassembler }
|
||||||
|
|
||||||
|
procedure TGDBMIDisassembler.DoDisassembleDestroyed(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if FDisassembleEvalCmdObj = Sender
|
||||||
|
then FDisassembleEvalCmdObj := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TGDBMIDisassembler.DoDisassembleExecuted(Sender: TObject);
|
procedure TGDBMIDisassembler.DoDisassembleExecuted(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
// Results were added from inside the TGDBMIDebuggerCommandDisassembe object
|
// Results were added from inside the TGDBMIDebuggerCommandDisassembe object
|
||||||
@ -1152,7 +1169,8 @@ begin
|
|||||||
|
|
||||||
FDisassembleEvalCmdObj := TGDBMIDebuggerCommandDisassembe.Create
|
FDisassembleEvalCmdObj := TGDBMIDebuggerCommandDisassembe.Create
|
||||||
(TGDBMIDebugger(Debugger), EntryRanges, AnAddr, AnAddr, ALinesBefore, ALinesAfter);
|
(TGDBMIDebugger(Debugger), EntryRanges, AnAddr, AnAddr, ALinesBefore, ALinesAfter);
|
||||||
FDisassembleEvalCmdObj.OnExecuted := @DoDisassembleExecuted;
|
FDisassembleEvalCmdObj.OnExecuted := @DoDisassembleExecuted;
|
||||||
|
FDisassembleEvalCmdObj.OnDestroy := @DoDisassembleDestroyed;
|
||||||
TGDBMIDebugger(Debugger).QueueCommand(FDisassembleEvalCmdObj);
|
TGDBMIDebugger(Debugger).QueueCommand(FDisassembleEvalCmdObj);
|
||||||
(* DoDepthCommandExecuted may be called immediately at this point *)
|
(* DoDepthCommandExecuted may be called immediately at this point *)
|
||||||
Result := FDisassembleEvalCmdObj = nil; // already executed
|
Result := FDisassembleEvalCmdObj = nil; // already executed
|
||||||
@ -1187,7 +1205,10 @@ procedure TGDBMIDisassembler.Clear;
|
|||||||
begin
|
begin
|
||||||
inherited Clear;
|
inherited Clear;
|
||||||
if FDisassembleEvalCmdObj <> nil
|
if FDisassembleEvalCmdObj <> nil
|
||||||
then FDisassembleEvalCmdObj.Cancel;
|
then begin
|
||||||
|
FDisassembleEvalCmdObj.Cancel;
|
||||||
|
FDisassembleEvalCmdObj.OnDestroy := nil;
|
||||||
|
end;
|
||||||
FDisassembleEvalCmdObj := nil;
|
FDisassembleEvalCmdObj := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2299,6 +2320,12 @@ end;
|
|||||||
|
|
||||||
{ TGDBMILineInfo }
|
{ TGDBMILineInfo }
|
||||||
|
|
||||||
|
procedure TGDBMILineInfo.DoGetLineSymbolsDestroyed(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if FGetLineSymbolsCmdObj = Sender
|
||||||
|
then FGetLineSymbolsCmdObj := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TGDBMILineInfo.ClearSources;
|
procedure TGDBMILineInfo.ClearSources;
|
||||||
var
|
var
|
||||||
n: Integer;
|
n: Integer;
|
||||||
@ -2473,7 +2500,8 @@ begin
|
|||||||
then TGDBMIDebugger(Debugger).GDBPause(True);
|
then TGDBMIDebugger(Debugger).GDBPause(True);
|
||||||
|
|
||||||
FGetLineSymbolsCmdObj := TGDBMIDebuggerCommandLineSymbolInfo.Create(TGDBMIDebugger(Debugger), ASource);
|
FGetLineSymbolsCmdObj := TGDBMIDebuggerCommandLineSymbolInfo.Create(TGDBMIDebugger(Debugger), ASource);
|
||||||
FGetLineSymbolsCmdObj.OnExecuted := @DoGetLineSymbolsFinished;
|
FGetLineSymbolsCmdObj.OnExecuted := @DoGetLineSymbolsFinished;
|
||||||
|
FGetLineSymbolsCmdObj.OnDestroy := @DoGetLineSymbolsDestroyed;
|
||||||
TGDBMIDebugger(Debugger).QueueCommand(FGetLineSymbolsCmdObj);
|
TGDBMIDebugger(Debugger).QueueCommand(FGetLineSymbolsCmdObj);
|
||||||
(* DoEvaluationFinished may be called immediately at this point *)
|
(* DoEvaluationFinished may be called immediately at this point *)
|
||||||
end;
|
end;
|
||||||
@ -4320,11 +4348,14 @@ begin
|
|||||||
end;
|
end;
|
||||||
if (State = dsRun) and (FTargetPID <> 0) // not in startup
|
if (State = dsRun) and (FTargetPID <> 0) // not in startup
|
||||||
then begin
|
then begin
|
||||||
debugln(['WARNING: breakpoint hit, but nothing known about it BreakId=', BreakID, ' brbtno=', List.Values['bkptno'] ]);
|
debugln(['********** WARNING: breakpoint hit, but nothing known about it BreakId=', BreakID, ' brbtno=', List.Values['bkptno'] ]);
|
||||||
{$IFDEF DBG_VERBOSE_BRKPOINT}
|
{$IFDEF DBG_VERBOSE_BRKPOINT}
|
||||||
debugln(['-*- List of breakpoints Cnt=', Breakpoints.Count]);
|
debugln(['-*- List of breakpoints Cnt=', Breakpoints.Count]);
|
||||||
for BreakID := 0 to Breakpoints.Count - 1 do
|
for BreakID := 0 to Breakpoints.Count - 1 do
|
||||||
debugln(['* ',Dbgs(Breakpoints[BreakID]), ':', DbgsName(Breakpoints[BreakID]), ' BreakId=',TGDBMIBreakPoint(Breakpoints[BreakID]).FBreakID, ' Source=', Breakpoints[BreakID].Source, ' Line=', Breakpoints[BreakID].Line ]);
|
debugln(['* ',Dbgs(Breakpoints[BreakID]), ':', DbgsName(Breakpoints[BreakID]), ' BreakId=',TGDBMIBreakPoint(Breakpoints[BreakID]).FBreakID, ' Source=', Breakpoints[BreakID].Source, ' Line=', Breakpoints[BreakID].Line ]);
|
||||||
|
debugln(['************************************************************************ ']);
|
||||||
|
debugln(['************************************************************************ ']);
|
||||||
|
debugln(['************************************************************************ ']);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
SetState(dsPause);
|
SetState(dsPause);
|
||||||
end;
|
end;
|
||||||
@ -5189,6 +5220,7 @@ end;
|
|||||||
|
|
||||||
destructor TGDBMILocals.Destroy;
|
destructor TGDBMILocals.Destroy;
|
||||||
begin
|
begin
|
||||||
|
CancelEvaluation;
|
||||||
inherited;
|
inherited;
|
||||||
FreeAndNil(FLocals);
|
FreeAndNil(FLocals);
|
||||||
end;
|
end;
|
||||||
@ -5248,6 +5280,12 @@ begin
|
|||||||
else Result := '';
|
else Result := '';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TGDBMILocals.DoEvaluationDestroyed(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if FEvaluationCmdObj = Sender
|
||||||
|
then FEvaluationCmdObj := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TGDBMILocals.DoEvaluationFinished(Sender: TObject);
|
procedure TGDBMILocals.DoEvaluationFinished(Sender: TObject);
|
||||||
var
|
var
|
||||||
Cmd: TGDBMIDebuggerCommandLocals;
|
Cmd: TGDBMIDebuggerCommandLocals;
|
||||||
@ -5274,7 +5312,8 @@ begin
|
|||||||
FInLocalsNeeded := True;
|
FInLocalsNeeded := True;
|
||||||
FEvaluatedState := esRequested;
|
FEvaluatedState := esRequested;
|
||||||
FEvaluationCmdObj := TGDBMIDebuggerCommandLocals.Create(TGDBMIDebugger(Debugger));
|
FEvaluationCmdObj := TGDBMIDebuggerCommandLocals.Create(TGDBMIDebugger(Debugger));
|
||||||
FEvaluationCmdObj.OnExecuted := @DoEvaluationFinished;
|
FEvaluationCmdObj.OnExecuted := @DoEvaluationFinished;
|
||||||
|
FEvaluationCmdObj.OnDestroy := @DoEvaluationDestroyed;
|
||||||
TGDBMIDebugger(Debugger).QueueCommand(FEvaluationCmdObj);
|
TGDBMIDebugger(Debugger).QueueCommand(FEvaluationCmdObj);
|
||||||
(* DoEvaluationFinished may be called immediately at this point *)
|
(* DoEvaluationFinished may be called immediately at this point *)
|
||||||
FInLocalsNeeded := False;
|
FInLocalsNeeded := False;
|
||||||
@ -5283,8 +5322,11 @@ end;
|
|||||||
procedure TGDBMILocals.CancelEvaluation;
|
procedure TGDBMILocals.CancelEvaluation;
|
||||||
begin
|
begin
|
||||||
FEvaluatedState := esInvalid;
|
FEvaluatedState := esInvalid;
|
||||||
if FEvaluationCmdObj <> nil then
|
if FEvaluationCmdObj <> nil
|
||||||
|
then begin
|
||||||
FEvaluationCmdObj.Cancel;
|
FEvaluationCmdObj.Cancel;
|
||||||
|
FEvaluationCmdObj.OnDestroy := nil;;
|
||||||
|
end;
|
||||||
FEvaluationCmdObj := nil;
|
FEvaluationCmdObj := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -5378,6 +5420,12 @@ begin
|
|||||||
else Result := '';
|
else Result := '';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TGDBMIRegisters.DoGetRegisterNamesDestroyed(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if FGetRegisterCmdObj = Sender
|
||||||
|
then FGetRegisterCmdObj := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TGDBMIRegisters.DoGetRegisterNamesFinished(Sender: TObject);
|
procedure TGDBMIRegisters.DoGetRegisterNamesFinished(Sender: TObject);
|
||||||
var
|
var
|
||||||
Cmd: TGDBMIDebuggerCommandRegisterNames;
|
Cmd: TGDBMIDebuggerCommandRegisterNames;
|
||||||
@ -5400,6 +5448,12 @@ begin
|
|||||||
then Changed;
|
then Changed;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TGDBMIRegisters.DoGetRegValuesDestroyed(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if FGetValuesCmdObj = Sender
|
||||||
|
then FGetValuesCmdObj := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TGDBMIRegisters.RegistersNeeded;
|
procedure TGDBMIRegisters.RegistersNeeded;
|
||||||
begin
|
begin
|
||||||
if (Debugger = nil) or (FRegistersReqState in [esRequested, esValid])
|
if (Debugger = nil) or (FRegistersReqState in [esRequested, esValid])
|
||||||
@ -5412,7 +5466,8 @@ begin
|
|||||||
SetLength(FRegisters, 0);
|
SetLength(FRegisters, 0);
|
||||||
|
|
||||||
FGetRegisterCmdObj := TGDBMIDebuggerCommandRegisterNames.Create(TGDBMIDebugger(Debugger));
|
FGetRegisterCmdObj := TGDBMIDebuggerCommandRegisterNames.Create(TGDBMIDebugger(Debugger));
|
||||||
FGetRegisterCmdObj.OnExecuted := @DoGetRegisterNamesFinished;
|
FGetRegisterCmdObj.OnExecuted := @DoGetRegisterNamesFinished;
|
||||||
|
FGetRegisterCmdObj.OnDestroy := @DoGetRegisterNamesDestroyed;
|
||||||
TGDBMIDebugger(Debugger).QueueCommand(FGetRegisterCmdObj);
|
TGDBMIDebugger(Debugger).QueueCommand(FGetRegisterCmdObj);
|
||||||
(* DoEvaluationFinished may be called immediately at this point *)
|
(* DoEvaluationFinished may be called immediately at this point *)
|
||||||
FInRegistersNeeded := False;
|
FInRegistersNeeded := False;
|
||||||
@ -5438,7 +5493,8 @@ begin
|
|||||||
FValuesReqState := esRequested;
|
FValuesReqState := esRequested;
|
||||||
|
|
||||||
FGetValuesCmdObj := TGDBMIDebuggerCommandRegisterValues.Create(TGDBMIDebugger(Debugger), FRegisters);
|
FGetValuesCmdObj := TGDBMIDebuggerCommandRegisterValues.Create(TGDBMIDebugger(Debugger), FRegisters);
|
||||||
FGetValuesCmdObj.OnExecuted := @DoGetRegValuesFinished;
|
FGetValuesCmdObj.OnExecuted := @DoGetRegValuesFinished;
|
||||||
|
FGetValuesCmdObj.OnDestroy := @DoGetRegValuesDestroyed;
|
||||||
TGDBMIDebugger(Debugger).QueueCommand(FGetValuesCmdObj);
|
TGDBMIDebugger(Debugger).QueueCommand(FGetValuesCmdObj);
|
||||||
(* DoEvaluationFinished may be called immediately at this point *)
|
(* DoEvaluationFinished may be called immediately at this point *)
|
||||||
FInValuesNeeded := False;
|
FInValuesNeeded := False;
|
||||||
@ -5458,6 +5514,7 @@ end;
|
|||||||
|
|
||||||
destructor TGDBMIWatch.Destroy;
|
destructor TGDBMIWatch.Destroy;
|
||||||
begin
|
begin
|
||||||
|
CancelEvaluation;
|
||||||
FreeAndNil(FTypeInfo);
|
FreeAndNil(FTypeInfo);
|
||||||
inherited;
|
inherited;
|
||||||
end;
|
end;
|
||||||
@ -5508,6 +5565,12 @@ begin
|
|||||||
then Changed;
|
then Changed;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TGDBMIWatch.DoEvaluationDestroyed(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if FEvaluationCmdObj = Sender
|
||||||
|
then FEvaluationCmdObj := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TGDBMIWatch.EvaluationNeeded;
|
procedure TGDBMIWatch.EvaluationNeeded;
|
||||||
begin
|
begin
|
||||||
if FEvaluatedState in [esValid, esRequested] then Exit;
|
if FEvaluatedState in [esValid, esRequested] then Exit;
|
||||||
@ -5521,7 +5584,8 @@ begin
|
|||||||
ClearOwned;
|
ClearOwned;
|
||||||
SetValid(vsValid);
|
SetValid(vsValid);
|
||||||
FEvaluationCmdObj := TGDBMIDebuggerCommandEvaluate.Create(TGDBMIDebugger(Debugger), Expression);
|
FEvaluationCmdObj := TGDBMIDebuggerCommandEvaluate.Create(TGDBMIDebugger(Debugger), Expression);
|
||||||
FEvaluationCmdObj.OnExecuted := @DoEvaluationFinished;
|
FEvaluationCmdObj.OnExecuted := @DoEvaluationFinished;
|
||||||
|
FEvaluationCmdObj.OnDestroy := @DoEvaluationDestroyed;
|
||||||
TGDBMIDebugger(Debugger).QueueCommand(FEvaluationCmdObj);
|
TGDBMIDebugger(Debugger).QueueCommand(FEvaluationCmdObj);
|
||||||
(* DoEvaluationFinished may be called immediately at this point *)
|
(* DoEvaluationFinished may be called immediately at this point *)
|
||||||
FInEvaluationNeeded := False;
|
FInEvaluationNeeded := False;
|
||||||
@ -5534,8 +5598,11 @@ end;
|
|||||||
procedure TGDBMIWatch.CancelEvaluation;
|
procedure TGDBMIWatch.CancelEvaluation;
|
||||||
begin
|
begin
|
||||||
FEvaluatedState := esInvalid;
|
FEvaluatedState := esInvalid;
|
||||||
if FEvaluationCmdObj <> nil then
|
if FEvaluationCmdObj <> nil
|
||||||
|
then begin
|
||||||
FEvaluationCmdObj.Cancel;
|
FEvaluationCmdObj.Cancel;
|
||||||
|
FEvaluationCmdObj.OnDestroy := nil;
|
||||||
|
end;
|
||||||
FEvaluationCmdObj := nil;
|
FEvaluationCmdObj := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -5614,13 +5681,26 @@ begin
|
|||||||
|
|
||||||
FInEvalDepth := True;
|
FInEvalDepth := True;
|
||||||
FDepthEvalCmdObj := TGDBMIDebuggerCommandStackDepth.Create(TGDBMIDebugger(Debugger));
|
FDepthEvalCmdObj := TGDBMIDebuggerCommandStackDepth.Create(TGDBMIDebugger(Debugger));
|
||||||
FDepthEvalCmdObj.OnExecuted := @DoDepthCommandExecuted;
|
FDepthEvalCmdObj.OnExecuted := @DoDepthCommandExecuted;
|
||||||
|
FDepthEvalCmdObj.OnDestroy := @DoDepthCommandDestroyed;
|
||||||
TGDBMIDebugger(Debugger).QueueCommand(FDepthEvalCmdObj);
|
TGDBMIDebugger(Debugger).QueueCommand(FDepthEvalCmdObj);
|
||||||
(* DoDepthCommandExecuted may be called immediately at this point *)
|
(* DoDepthCommandExecuted may be called immediately at this point *)
|
||||||
FInEvalDepth := False;
|
FInEvalDepth := False;
|
||||||
Result := FDepthEvalCmdObj = nil; // count is good
|
Result := FDepthEvalCmdObj = nil; // count is good
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TGDBMICallStack.DoDepthCommandDestroyed(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if FDepthEvalCmdObj = Sender
|
||||||
|
then FDepthEvalCmdObj := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TGDBMICallStack.DoFramesCommandDestroyed(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if FFramesEvalCmdObj = Sender
|
||||||
|
then FFramesEvalCmdObj := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
function TGDBMICallStack.InternalCreateEntry(AIndex: Integer; AArgInfo, AFrameInfo : TGDBMINameValueList) : TCallStackEntry;
|
function TGDBMICallStack.InternalCreateEntry(AIndex: Integer; AArgInfo, AFrameInfo : TGDBMINameValueList) : TCallStackEntry;
|
||||||
var
|
var
|
||||||
n, e: Integer;
|
n, e: Integer;
|
||||||
@ -5675,10 +5755,17 @@ end;
|
|||||||
procedure TGDBMICallStack.Clear;
|
procedure TGDBMICallStack.Clear;
|
||||||
begin
|
begin
|
||||||
if FDepthEvalCmdObj <> nil
|
if FDepthEvalCmdObj <> nil
|
||||||
then FDepthEvalCmdObj.Cancel;
|
then begin
|
||||||
|
FDepthEvalCmdObj.Cancel;
|
||||||
|
FDepthEvalCmdObj.OnDestroy := nil;
|
||||||
|
end;
|
||||||
FDepthEvalCmdObj := nil;
|
FDepthEvalCmdObj := nil;
|
||||||
|
|
||||||
if FFramesEvalCmdObj <> nil
|
if FFramesEvalCmdObj <> nil
|
||||||
then FFramesEvalCmdObj.Cancel;
|
then begin
|
||||||
|
FFramesEvalCmdObj.Cancel;
|
||||||
|
FFramesEvalCmdObj.OnDestroy := nil;
|
||||||
|
end;
|
||||||
FFramesEvalCmdObj := nil;
|
FFramesEvalCmdObj := nil;
|
||||||
inherited Clear;
|
inherited Clear;
|
||||||
end;
|
end;
|
||||||
@ -5793,7 +5880,8 @@ begin
|
|||||||
FInEvalFrames := True;
|
FInEvalFrames := True;
|
||||||
// Todo: keep the old reference too, so it can be canceled
|
// Todo: keep the old reference too, so it can be canceled
|
||||||
FFramesEvalCmdObj := TGDBMIDebuggerCommandStackFrames.Create(TGDBMIDebugger(Debugger), AIndex, ACount);
|
FFramesEvalCmdObj := TGDBMIDebuggerCommandStackFrames.Create(TGDBMIDebugger(Debugger), AIndex, ACount);
|
||||||
FFramesEvalCmdObj.OnExecuted := @DoFramesCommandExecuted;
|
FFramesEvalCmdObj.OnExecuted := @DoFramesCommandExecuted;
|
||||||
|
FFramesEvalCmdObj.OnDestroy := @DoFramesCommandDestroyed;
|
||||||
TGDBMIDebugger(Debugger).QueueCommand(FFramesEvalCmdObj);
|
TGDBMIDebugger(Debugger).QueueCommand(FFramesEvalCmdObj);
|
||||||
(* DoFramesCommandExecuted may be called immediately at this point *)
|
(* DoFramesCommandExecuted may be called immediately at this point *)
|
||||||
FInEvalFrames := False;
|
FInEvalFrames := False;
|
||||||
@ -7053,6 +7141,13 @@ begin
|
|||||||
FKeepFinished := False;
|
FKeepFinished := False;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
destructor TGDBMIDebuggerCommand.Destroy;
|
||||||
|
begin
|
||||||
|
if assigned(FOnDestroy)
|
||||||
|
then FOnDestroy(Self);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TGDBMIDebuggerCommand.DoQueued;
|
procedure TGDBMIDebuggerCommand.DoQueued;
|
||||||
begin
|
begin
|
||||||
SetState(dcsQueued);
|
SetState(dcsQueued);
|
||||||
|
Loading…
Reference in New Issue
Block a user