mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-06 23:46:28 +02:00
LazDebuggerFp: Prevent crash, if debugger instance is destroyed before logging is handled.
git-svn-id: trunk@59787 -
This commit is contained in:
parent
d4079f1a6c
commit
f4544c2ac8
@ -90,8 +90,6 @@ type
|
||||
FFpDebugThread: TFpDebugThread;
|
||||
FQuickPause: boolean;
|
||||
FRaiseExceptionBreakpoint: TFpInternalBreakpoint;
|
||||
FDbgLogMessageList: TFPObjectList;
|
||||
FLogCritSection: TRTLCriticalSection;
|
||||
FMemConverter: TFpDbgMemConvertorLittleEndian;
|
||||
FMemReader: TDbgMemReader;
|
||||
FMemManager: TFpDbgMemManager;
|
||||
@ -304,6 +302,10 @@ uses
|
||||
FpDbgUtil,
|
||||
FpDbgDisasX86;
|
||||
|
||||
var
|
||||
DbgLogCritSection: TRTLCriticalSection;
|
||||
DbgLogMessageList: TFPObjectList;
|
||||
|
||||
type
|
||||
|
||||
{ TFpDbgMemReader }
|
||||
@ -1549,22 +1551,26 @@ end;
|
||||
procedure TFpDebugDebugger.DoLog();
|
||||
var
|
||||
AMessage: TFpDbgLogMessage;
|
||||
AnObjList: TFPObjectList;
|
||||
AnObjList, t: TFPObjectList;
|
||||
i: Integer;
|
||||
begin
|
||||
AnObjList:=TFPObjectList.Create(false);
|
||||
// Do *NOT* access SELF. It may have been destroyed already
|
||||
AnObjList := nil;
|
||||
try
|
||||
EnterCriticalsection(FLogCritSection);
|
||||
EnterCriticalsection(DbgLogCritSection);
|
||||
try
|
||||
while FDbgLogMessageList.Count > 0 do
|
||||
begin
|
||||
AnObjList.Add(FDbgLogMessageList[0]);
|
||||
FDbgLogMessageList.Delete(0);
|
||||
end;
|
||||
if DbgLogMessageList.Count > 0 then begin
|
||||
t := TFPObjectList.Create(false);
|
||||
AnObjList := DbgLogMessageList;
|
||||
DbgLogMessageList := t;
|
||||
end;
|
||||
finally
|
||||
LeaveCriticalsection(FLogCritSection);
|
||||
LeaveCriticalsection(DbgLogCritSection);
|
||||
end;
|
||||
|
||||
if AnObjList = nil then
|
||||
exit;
|
||||
|
||||
for i := 0 to AnObjList.Count-1 do
|
||||
begin
|
||||
AMessage := TFpDbgLogMessage(AnObjList[i]);
|
||||
@ -1897,11 +1903,11 @@ begin
|
||||
AMessage := TFpDbgLogMessage.Create;
|
||||
AMessage.SyncLogLevel:=ALogLevel;
|
||||
AMessage.SyncLogMessage:=AString;
|
||||
EnterCriticalsection(FLogCritSection);
|
||||
EnterCriticalsection(DbgLogCritSection);
|
||||
try
|
||||
FDbgLogMessageList.Add(AMessage);
|
||||
DbgLogMessageList.Add(AMessage);
|
||||
finally
|
||||
LeaveCriticalsection(FLogCritSection);
|
||||
LeaveCriticalsection(DbgLogCritSection);
|
||||
end;
|
||||
TThread.Queue(nil, @DoLog);
|
||||
end;
|
||||
@ -2111,8 +2117,6 @@ begin
|
||||
inherited Create(AExternalDebugger);
|
||||
FWatchEvalList := TFPList.Create;
|
||||
FPrettyPrinter := TFpPascalPrettyPrinter.Create(sizeof(pointer));
|
||||
FDbgLogMessageList := TFPObjectList.Create(false);
|
||||
InitCriticalSection(FLogCritSection);
|
||||
FMemReader := TFpDbgMemReader.Create(self);
|
||||
FMemConverter := TFpDbgMemConvertorLittleEndian.Create;
|
||||
FMemManager := TFpDbgMemManager.Create(FMemReader, FMemConverter);
|
||||
@ -2137,8 +2141,6 @@ begin
|
||||
FreeAndNil(FMemManager);
|
||||
FreeAndNil(FMemConverter);
|
||||
FreeAndNil(FMemReader);
|
||||
FreeAndNil(FDbgLogMessageList);
|
||||
DoneCriticalsection(FLogCritSection);
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
@ -2220,5 +2222,13 @@ begin
|
||||
dcRunTo, dcPause, dcStepOut, dcStepInto, dcEvaluate, dcSendConsoleInput];
|
||||
end;
|
||||
|
||||
initialization
|
||||
InitCriticalSection(DbgLogCritSection);
|
||||
DbgLogMessageList := TFPObjectList.Create(false);
|
||||
|
||||
finalization
|
||||
FreeAndNil(DbgLogMessageList);
|
||||
DoneCriticalsection(DbgLogCritSection);
|
||||
|
||||
end.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user