mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-23 11:19:10 +02:00
FpDebug: Fixed memory corruption by encapulating log-strings inside a class instead of a record
git-svn-id: trunk@48523 -
This commit is contained in:
parent
f61f5b2163
commit
e2399a4c0d
@ -50,7 +50,8 @@ type
|
|||||||
|
|
||||||
{ TFpDbgLogMessage }
|
{ TFpDbgLogMessage }
|
||||||
|
|
||||||
TFpDbgLogMessage = record
|
TFpDbgLogMessage = class
|
||||||
|
public
|
||||||
SyncLogMessage: string;
|
SyncLogMessage: string;
|
||||||
SyncLogLevel: TFPDLogLevel;
|
SyncLogLevel: TFPDLogLevel;
|
||||||
end;
|
end;
|
||||||
@ -84,7 +85,7 @@ type
|
|||||||
FFpDebugThread: TFpDebugThread;
|
FFpDebugThread: TFpDebugThread;
|
||||||
FQuickPause: boolean;
|
FQuickPause: boolean;
|
||||||
FRaiseExceptionBreakpoint: FpDbgClasses.TDBGBreakPoint;
|
FRaiseExceptionBreakpoint: FpDbgClasses.TDBGBreakPoint;
|
||||||
FDbgLogMessageList: array of TFpDbgLogMessage;
|
FDbgLogMessageList: TFPObjectList;
|
||||||
FLogCritSection: TRTLCriticalSection;
|
FLogCritSection: TRTLCriticalSection;
|
||||||
FMemConverter: TFpDbgMemConvertorLittleEndian;
|
FMemConverter: TFpDbgMemConvertorLittleEndian;
|
||||||
FMemReader: TDbgMemReader;
|
FMemReader: TDbgMemReader;
|
||||||
@ -1266,23 +1267,36 @@ end;
|
|||||||
procedure TFpDebugDebugger.DoLog(Data: PtrInt);
|
procedure TFpDebugDebugger.DoLog(Data: PtrInt);
|
||||||
var
|
var
|
||||||
AMessage: TFpDbgLogMessage;
|
AMessage: TFpDbgLogMessage;
|
||||||
|
AnObjList: TFPObjectList;
|
||||||
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
FLogAsyncQueued:=false;
|
FLogAsyncQueued:=false;
|
||||||
EnterCriticalsection(FLogCritSection);
|
|
||||||
try
|
|
||||||
if length(FDbgLogMessageList) = 0 then
|
|
||||||
Exit;
|
|
||||||
AMessage := FDbgLogMessageList[0];
|
|
||||||
move(FDbgLogMessageList[1], FDbgLogMessageList[0], SizeOf(TFpDbgLogMessage)*high(FDbgLogMessageList));
|
|
||||||
SetLength(FDbgLogMessageList, high(FDbgLogMessageList));
|
|
||||||
finally
|
|
||||||
LeaveCriticalsection(FLogCritSection);
|
|
||||||
end;
|
|
||||||
|
|
||||||
case AMessage.SyncLogLevel of
|
AnObjList:=TFPObjectList.Create(false);
|
||||||
dllDebug: DebugLn(AMessage.SyncLogMessage);
|
try
|
||||||
dllInfo: ShowMessage(AMessage.SyncLogMessage);
|
EnterCriticalsection(FLogCritSection);
|
||||||
dllError: raise exception.Create(AMessage.SyncLogMessage);
|
try
|
||||||
|
while FDbgLogMessageList.Count > 0 do
|
||||||
|
begin
|
||||||
|
AnObjList.Add(FDbgLogMessageList[0]);
|
||||||
|
FDbgLogMessageList.Delete(0);
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
LeaveCriticalsection(FLogCritSection);
|
||||||
|
end;
|
||||||
|
|
||||||
|
for i := 0 to AnObjList.Count-1 do
|
||||||
|
begin
|
||||||
|
AMessage := TFpDbgLogMessage(AnObjList[i]);
|
||||||
|
case AMessage.SyncLogLevel of
|
||||||
|
dllDebug: DebugLn(AMessage.SyncLogMessage);
|
||||||
|
dllInfo: ShowMessage(AMessage.SyncLogMessage);
|
||||||
|
dllError: raise exception.Create(AMessage.SyncLogMessage);
|
||||||
|
end; {case}
|
||||||
|
AMessage.Free;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
AnObjList.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1561,12 +1575,12 @@ begin
|
|||||||
// This function could be running in a thread. Add the log-message to an
|
// This function could be running in a thread. Add the log-message to an
|
||||||
// array and queue the processing in the main thread. Not an ideal
|
// array and queue the processing in the main thread. Not an ideal
|
||||||
// implementation. But good enough for now.
|
// implementation. But good enough for now.
|
||||||
|
AMessage := TFpDbgLogMessage.Create;
|
||||||
AMessage.SyncLogLevel:=ALogLevel;
|
AMessage.SyncLogLevel:=ALogLevel;
|
||||||
AMessage.SyncLogMessage:=AString;
|
AMessage.SyncLogMessage:=AString;
|
||||||
EnterCriticalsection(FLogCritSection);
|
EnterCriticalsection(FLogCritSection);
|
||||||
try
|
try
|
||||||
setlength(FDbgLogMessageList, length(FDbgLogMessageList)+1);
|
FDbgLogMessageList.Add(AMessage);
|
||||||
FDbgLogMessageList[high(FDbgLogMessageList)] := AMessage;
|
|
||||||
finally
|
finally
|
||||||
LeaveCriticalsection(FLogCritSection);
|
LeaveCriticalsection(FLogCritSection);
|
||||||
end;
|
end;
|
||||||
@ -1736,6 +1750,7 @@ begin
|
|||||||
inherited Create(AExternalDebugger);
|
inherited Create(AExternalDebugger);
|
||||||
FWatchEvalList := TFPList.Create;
|
FWatchEvalList := TFPList.Create;
|
||||||
FPrettyPrinter := TFpPascalPrettyPrinter.Create(sizeof(pointer));
|
FPrettyPrinter := TFpPascalPrettyPrinter.Create(sizeof(pointer));
|
||||||
|
FDbgLogMessageList := TFPObjectList.Create(false);
|
||||||
InitCriticalSection(FLogCritSection);
|
InitCriticalSection(FLogCritSection);
|
||||||
FMemReader := TFpDbgMemReader.Create(self);
|
FMemReader := TFpDbgMemReader.Create(self);
|
||||||
FMemConverter := TFpDbgMemConvertorLittleEndian.Create;
|
FMemConverter := TFpDbgMemConvertorLittleEndian.Create;
|
||||||
@ -1763,6 +1778,7 @@ begin
|
|||||||
FreeAndNil(FMemManager);
|
FreeAndNil(FMemManager);
|
||||||
FreeAndNil(FMemConverter);
|
FreeAndNil(FMemConverter);
|
||||||
FreeAndNil(FMemReader);
|
FreeAndNil(FMemReader);
|
||||||
|
FreeAndNil(FDbgLogMessageList);
|
||||||
DoneCriticalsection(FLogCritSection);
|
DoneCriticalsection(FLogCritSection);
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user