From 268dbdf7353c99be6d12c6e67979167708ed8fab Mon Sep 17 00:00:00 2001 From: mattias Date: Sat, 27 Oct 2018 09:45:10 +0000 Subject: [PATCH] Debugger (gdb): Fix Debug-Inspector for dwarf3. Match fieldnames case insensitive. Depending on gdb, try to find the MixedCase version of any name. Issue #0034453 git-svn-id: branches/fixes_2_0@59369 - --- .../debuggerintf/dbgintfdebuggerbase.pp | 4 +-- components/lazdebuggergdbmi/gdbmidebugger.pp | 32 ++++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/components/debuggerintf/dbgintfdebuggerbase.pp b/components/debuggerintf/dbgintfdebuggerbase.pp index 536c3988d5..eaf86da52e 100644 --- a/components/debuggerintf/dbgintfdebuggerbase.pp +++ b/components/debuggerintf/dbgintfdebuggerbase.pp @@ -538,11 +538,11 @@ type ALocation: TDBGFieldLocation; AFlags: TDBGFieldFlags = []; AClassName: String = ''); destructor Destroy; override; - property Name: String read FName; + property Name: String read FName write FName; property DBGType: TDBGType read FDBGType; property Location: TDBGFieldLocation read FLocation; property Flags: TDBGFieldFlags read FFlags; - property ClassName: String read FClassName; // the class in which the field was declared + property ClassName: String read FClassName write FClassName; // the class in which the field was declared end; { TDBGFields } diff --git a/components/lazdebuggergdbmi/gdbmidebugger.pp b/components/lazdebuggergdbmi/gdbmidebugger.pp index 63a66d6fe6..599ef8e617 100644 --- a/components/lazdebuggergdbmi/gdbmidebugger.pp +++ b/components/lazdebuggergdbmi/gdbmidebugger.pp @@ -11997,7 +11997,7 @@ var procedure PutValuesInTypeRecord(const AType: TDBGType; const ATextInfo: String); var GDBParser: TGDBStringIterator; - Payload: String; + Payload, s: String; Composite: Boolean; StopChar: Char; j: Integer; @@ -12023,11 +12023,16 @@ var Break; end; - if Payload <> AType.Fields[j].Name + s := uppercase(AType.Fields[j].Name); + if uppercase(Payload) <> s then begin debugln(DBGMI_STRUCT_PARSER, 'Field name does not match, expected "', AType.Fields[j].Name, '" but found "', Payload,'"'); Break; end; + if (Payload <> AType.Fields[j].Name) and (s = AType.Fields[j].Name) then begin + // gdb returned different case + AType.Fields[j].Name := Payload; + end; if StopChar <> '=' then begin @@ -12098,7 +12103,7 @@ var procedure ProcessAncestor(ATypeName: String); var HelpPtr, HelpPtr2: PChar; - NewName, NewVal: String; + NewName, NewVal, Sn, Sc: String; i: Integer; NewField: TDBGField; begin @@ -12138,7 +12143,7 @@ var while (StartPtr <= EndPtr) and (StartPtr^ <> '}') do begin HelpPtr := StartPtr; while (HelpPtr < EndPtr) and not (HelpPtr^ in [' ', '=', ',']) do inc(HelpPtr); - NewName := uppercase(copy(StartPtr, 1, HelpPtr - StartPtr)); // name of field + NewName := copy(StartPtr, 1, HelpPtr - StartPtr); // name of field StartPtr := HelpPtr; SkipSpaces; @@ -12159,13 +12164,15 @@ var NewVal := copy(HelpPtr, 1, HelpPtr2 + 1 - HelpPtr); // name of field i := AType.Fields.Count - 1; + Sn := UpperCase(NewName); + Sc := UpperCase(ATypeName); while (i >= 0) - and ( (uppercase(AType.Fields[i].Name) <> NewName) - or (uppercase(AType.Fields[i].ClassName) <> ATypeName) ) + and ( (uppercase(AType.Fields[i].Name) <> Sn) + or (uppercase(AType.Fields[i].ClassName) <> Sc) ) do dec(i); if i < 0 then begin - if (uppercase(ATypeName) <> 'TOBJECT') or (pos('VPTR', uppercase(NewName)) < 1) then begin + if (Sc <> 'TOBJECT') or (pos('VPTR', Sn) < 1) then begin if not(defFullTypeInfo in FEvalFlags) then begin NewField := TDBGField.Create(NewName, TGDBType.Create(skSimple, ''), flPublic, [], ''); AType.Fields.Add(NewField); @@ -12175,8 +12182,17 @@ var debugln(DBGMI_STRUCT_PARSER, 'WARNING: PutValuesInClass: No field for "' + ATypeName + '"."' + NewName + '"'); end; end - else + else begin + if (AType.Fields[i].Name <> NewName) and + (uppercase(AType.Fields[i].Name) = AType.Fields[i].Name) + then + AType.Fields[i].Name := NewName; // Adjust to mixed case + if (AType.Fields[i].ClassName <> ATypeName) and + (uppercase(AType.Fields[i].ClassName) = AType.Fields[i].ClassName) + then + AType.Fields[i].ClassName := ATypeName; // Adjust to mixed case AType.Fields[i].DBGType.Value.AsString := HexCToHexPascal(NewVal); + end; if (StartPtr^ <> '}') then inc(StartPtr); SkipSpaces;