FP Debugger: fix range checks / do not use arbitrary large static arrays (gdb dislikes the debuginfo)

git-svn-id: trunk@58399 -
This commit is contained in:
martin 2018-06-24 22:56:20 +00:00
parent d1d1d58a04
commit 23d5c0bdc7

View File

@ -55,8 +55,7 @@ uses
FpDbgLoader;
type
PnlistArray = ^TnlistArray;
TnlistArray = array[0..maxSmallint] of nlist;
PnlistArray = ^nlist; // ^array[0..infinite] of nlist;
const
// Symbol-map section name
@ -198,13 +197,13 @@ begin
SymbolCount := PDbgImageSectionEx(p)^.Sect.Size div sizeof(nlist);
for i := 0 to SymbolCount-1 do
begin
if (SymbolArr^[i].n_type and $e0)<>0 then
if (SymbolArr[i].n_type and $e0)<>0 then
// This is a stabs-entry. Ignore.
Continue;
if (SymbolArr^[i].n_type and $0e)=$e then
if (SymbolArr[i].n_type and $0e)=$e then
begin
// Section-index is ignored for now...
AfpSymbolInfo.AddObject(pchar(SymbolStr+SymbolArr^[i].n_un.n_strx), TObject(PtrUInt(SymbolArr^[i].n_value)));
AfpSymbolInfo.AddObject(pchar(SymbolStr+SymbolArr[i].n_un.n_strx), TObject(PtrUInt(SymbolArr[i].n_value)));
end
end;
end;
@ -583,20 +582,20 @@ begin
case state of
dtsEnd:
begin
if SymbolArr^[i].n_type = N_SO then
if SymbolArr[i].n_type = N_SO then
begin
if assigned(DwarfDebugMap) then
DwarfDebugMap.Free;
DwarfDebugMap := TAppleDwarfDebugMap.Create;
DwarfDebugMap.Dir := pchar(SymbolStr+SymbolArr^[i].n_un.n_strx);
DwarfDebugMap.Dir := pchar(SymbolStr+SymbolArr[i].n_un.n_strx);
state := dtsDir;
end;
end;
dtsDir:
begin
if SymbolArr^[i].n_type = N_SO then
if SymbolArr[i].n_type = N_SO then
begin
DwarfDebugMap.SourceFile:=pchar(SymbolStr+SymbolArr^[i].n_un.n_strx);
DwarfDebugMap.SourceFile:=pchar(SymbolStr+SymbolArr[i].n_un.n_strx);
inc(state);
end
else
@ -604,27 +603,27 @@ begin
end;
dtsSource:
begin
if SymbolArr^[i].n_type = N_OSO then
if SymbolArr[i].n_type = N_OSO then
begin
DwarfDebugMap.ObjectFile:=pchar(SymbolStr+SymbolArr^[i].n_un.n_strx);
DwarfDebugMap.ObjFileAge:=SymbolArr^[i].n_value;
DwarfDebugMap.ObjectFile:=pchar(SymbolStr+SymbolArr[i].n_un.n_strx);
DwarfDebugMap.ObjFileAge:=SymbolArr[i].n_value;
inc(state);
end;
end;
dtsObjectFile:
begin
if (SymbolArr^[i].n_type = N_BNSYM) then
if (SymbolArr[i].n_type = N_BNSYM) then
begin
inc(state);
end
else if (SymbolArr^[i].n_type = N_STSYM) then
else if (SymbolArr[i].n_type = N_STSYM) then
begin
AddressMap.NewAddr:=SymbolArr^[i].n_value;
AddressMap.NewAddr:=SymbolArr[i].n_value;
AddressMap.OrgAddr:=0;
AddressMap.Length:=0;
DwarfDebugMap.GlobalList.Add(pchar(SymbolStr+SymbolArr^[i].n_un.n_strx), AddressMap);
DwarfDebugMap.GlobalList.Add(pchar(SymbolStr+SymbolArr[i].n_un.n_strx), AddressMap);
end
else if (SymbolArr^[i].n_type = N_SO) and (SymbolArr^[i].n_sect=1) then
else if (SymbolArr[i].n_type = N_SO) and (SymbolArr[i].n_sect=1) then
begin
state := dtsEnd;
SubFiles.AddObject(DwarfDebugMap.ObjectFile, DwarfDebugMap);
@ -633,24 +632,24 @@ begin
end;
dtsProc:
begin
if (SymbolArr^[i].n_type = N_FUN) and (SymbolArr^[i].n_sect=1) then
if (SymbolArr[i].n_type = N_FUN) and (SymbolArr[i].n_sect=1) then
begin
AddressMap.NewAddr:=SymbolArr^[i].n_value;
ProcName:=pchar(SymbolStr+SymbolArr^[i].n_un.n_strx);
AddressMap.NewAddr:=SymbolArr[i].n_value;
ProcName:=pchar(SymbolStr+SymbolArr[i].n_un.n_strx);
inc(state);
end;
end;
dtsProcLen:
begin
if (SymbolArr^[i].n_type = N_FUN) and (SymbolArr^[i].n_sect=0) then
if (SymbolArr[i].n_type = N_FUN) and (SymbolArr[i].n_sect=0) then
begin
AddressMap.Length:=SymbolArr^[i].n_value;
AddressMap.Length:=SymbolArr[i].n_value;
inc(state);
end;
end;
dtsProcEnd:
begin
if (SymbolArr^[i].n_type = N_ENSYM) and (SymbolArr^[i].n_sect=1) then
if (SymbolArr[i].n_type = N_ENSYM) and (SymbolArr[i].n_sect=1) then
begin
DwarfDebugMap.GlobalList.Add(ProcName, AddressMap);
state := dtsObjectFile;
@ -684,25 +683,25 @@ begin
SymbolCount := PDbgImageSectionEx(p)^.Sect.Size div sizeof(nlist);
for i := 0 to SymbolCount-1 do
begin
if SymbolArr^[i].n_type = N_SECT then
if SymbolArr[i].n_type = N_SECT then
begin
s := pchar(SymbolStr+SymbolArr^[i].n_un.n_strx);
s := pchar(SymbolStr+SymbolArr[i].n_un.n_strx);
ind := MainDwarfDebugMap.GlobalList.Find(s);
if assigned(ind) then
begin
AddressMap:=MainDwarfDebugMap.GlobalList.Items[s];
AddressMap.OrgAddr:=SymbolArr^[i].n_value;
AddressMap.OrgAddr:=SymbolArr[i].n_value;
AddressMapList.Add(AddressMap);
end;
end;
if SymbolArr^[i].n_type = N_SECT+N_EXT then
if SymbolArr[i].n_type = N_SECT+N_EXT then
begin
s := pchar(SymbolStr+SymbolArr^[i].n_un.n_strx);
s := pchar(SymbolStr+SymbolArr[i].n_un.n_strx);
ind := MainDwarfDebugMap.GlobalList.Find(s);
if assigned(ind) then
begin
AddressMap:=MainDwarfDebugMap.GlobalList.Items[s];
AddressMap.OrgAddr:=SymbolArr^[i].n_value;
AddressMap.OrgAddr:=SymbolArr[i].n_value;
AddressMapList.Add(AddressMap);
end;
end;