mirror of https://gitlab.com/basile.b/dexed.git
deactivated GDB commander to build next rlz
This commit is contained in:
parent
b17c58d924
commit
b8aefcb761
168
src/ce_gdb.pas
168
src/ce_gdb.pas
|
@ -105,7 +105,6 @@ type
|
||||||
function GetValue: ansistring; override;
|
function GetValue: ansistring; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
TGDBMI_Frame = record
|
TGDBMI_Frame = record
|
||||||
level: integer;
|
level: integer;
|
||||||
func: string;
|
func: string;
|
||||||
|
@ -115,6 +114,21 @@ type
|
||||||
from: string;
|
from: string;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{
|
||||||
|
breakpoint:
|
||||||
|
|
||||||
|
(gdb)
|
||||||
|
=breakpoint-modified,bkpt={number="2",type="breakpoint",disp="keep",enabled="y",addr="0x000000000049dc7a",func="D main",file="/home/basile/Dev/dproj/Resource.d/src/resource.d",fullname="/home/basile/Dev/dproj/Resource.d/src/resource.d",line="39",thread-groups=["i1"],times="1",original-location="/home/basile/Dev/dproj/Resource.d/src/resource.d:39"}
|
||||||
|
~"\nBreakpoint "
|
||||||
|
~"2, D main (args=...) at /home/basile/Dev/dproj/Resource.d/src/resource.d:39\n"
|
||||||
|
~"39\t getopt(args, config.passThrough, \"h|help\", &wantHelp);\n"
|
||||||
|
*stopped,reason="breakpoint-hit",disp="keep",bkptno="2",frame={addr="0x000000000049dc7a",func="D main",args=[{name="args",value="..."}],file="/home/basile/Dev/dproj/Resource.d/src/resource.d",fullname="/home/basile/Dev/dproj/Resource.d/src/resource.d",line="39"},thread-id="1",stopped-threads="all",core="3"
|
||||||
|
(gdb)
|
||||||
|
|
||||||
|
. line starting with = is to parse as TGDBMI_Breakpoint, thorically its [opt token]=, no token for breakpoint reached since it's not a result
|
||||||
|
. lines starting with "~" can be ignored, they represent the output stream displayed in the CLI
|
||||||
|
|
||||||
|
}
|
||||||
TGDBMI_Breakpoint = record
|
TGDBMI_Breakpoint = record
|
||||||
number: integer;
|
number: integer;
|
||||||
tpe: string; // named "type"
|
tpe: string; // named "type"
|
||||||
|
@ -243,162 +257,22 @@ end;
|
||||||
|
|
||||||
procedure TInspectableState.parseCallStack(stream: TStream);
|
procedure TInspectableState.parseCallStack(stream: TStream);
|
||||||
var
|
var
|
||||||
rdr: TStringList;
|
rng: TStringRange = (ptr: nil; pos: 0; len: 0);
|
||||||
str: string;
|
str: string;
|
||||||
i,j: integer;
|
i,j: integer;
|
||||||
begin
|
begin
|
||||||
fCallStack.Clear;
|
|
||||||
for i := low(fLastCalls) to high(fLastCalls) do
|
|
||||||
fLastCalls[i] := '';
|
|
||||||
rdr := TStringList.Create;
|
|
||||||
try
|
|
||||||
rdr.LoadFromStream(stream);
|
|
||||||
if (rdr.Count = 0) or (pos('(gdb)', rdr[0]) = -1) then
|
|
||||||
exit;
|
|
||||||
// fix first line
|
|
||||||
str := rdr[0];
|
|
||||||
rdr[0] := str[7 .. str.length];
|
|
||||||
for str in rdr do
|
|
||||||
begin
|
|
||||||
if fWordSpliter.Exec(str) and fWordSpliter.ExecNext then
|
|
||||||
fCallStack.Insert(0, str[fWordSpliter.MatchLen[0]+1 .. str.length]);
|
|
||||||
end;
|
|
||||||
if fCallStack.Count > 9 then j := 9 else j := fCallStack.Count-1;
|
|
||||||
for i := 0 to j do
|
|
||||||
fLastCalls[i] := fCallStack[i];
|
|
||||||
finally
|
|
||||||
rdr.free;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TInspectableState.parseRegisters(stream: TStream);
|
procedure TInspectableState.parseRegisters(stream: TStream);
|
||||||
var
|
var
|
||||||
rdr: TStringList;
|
|
||||||
str: string;
|
|
||||||
reg: string;
|
reg: string;
|
||||||
val: string;
|
val: string;
|
||||||
rng: TStringRange = (ptr: nil; pos: 0; len: 0);
|
rng: TStringRange = (ptr: nil; pos: 0; len: 0);
|
||||||
begin
|
begin
|
||||||
|
|
||||||
setLength(str, stream.Size);
|
|
||||||
stream.Read(str[1], str.length);
|
|
||||||
rng.init(str);
|
|
||||||
|
|
||||||
if rng.empty then
|
|
||||||
exit;
|
|
||||||
if not rng.startsWith('&"info registers\n"') then
|
|
||||||
exit;
|
|
||||||
rng.popUntil(#10)^.popFront;
|
|
||||||
|
|
||||||
while not rng.empty do
|
|
||||||
begin
|
|
||||||
if rng.front <> '~' then
|
|
||||||
exit;
|
|
||||||
rng.popFront;
|
|
||||||
if rng.front <> '"' then
|
|
||||||
exit;
|
|
||||||
rng.popFront;
|
|
||||||
|
|
||||||
reg := rng.takeUntil([' ', #9]).yield;
|
|
||||||
|
|
||||||
if (reg = 'rip') or (reg = 'eip') then
|
|
||||||
begin
|
|
||||||
rng.popUntil(#10)^.popFront;
|
|
||||||
rng.popUntil(#10)^.popFront;
|
|
||||||
continue;
|
|
||||||
end;
|
|
||||||
|
|
||||||
rng.popUntil(#10)^.popFront;
|
|
||||||
if rng.front <> '~' then
|
|
||||||
exit;
|
|
||||||
rng.popFront;
|
|
||||||
if rng.front <> '"' then
|
|
||||||
exit;
|
|
||||||
rng.popFront;
|
|
||||||
if rng.front <> '\' then
|
|
||||||
exit;
|
|
||||||
rng.popFront;
|
|
||||||
|
|
||||||
if rng.front <> 't' then
|
|
||||||
exit;
|
|
||||||
rng.popFront;
|
|
||||||
|
|
||||||
|
|
||||||
if reg = 'eflags' then
|
|
||||||
begin
|
|
||||||
fFlags := [];
|
|
||||||
if rng.front <> '[' then
|
|
||||||
exit;
|
|
||||||
rng.popFront;
|
|
||||||
while rng.front <> ']' do
|
|
||||||
begin
|
|
||||||
val := rng.popWhile([' ', #9])^.takeUntil([' ', #9, ']']).yield;
|
|
||||||
case val of
|
|
||||||
'CS': include(fFlags, TFLAG.CS);
|
|
||||||
'PF': include(fFlags, TFLAG.PF);
|
|
||||||
'AF': include(fFlags, TFLAG.AF);
|
|
||||||
'ZF': include(fFlags, TFLAG.ZF);
|
|
||||||
'SF': include(fFlags, TFLAG.SF);
|
|
||||||
'TF': include(fFlags, TFLAG.TF);
|
|
||||||
'IF': include(fFlags, TFLAG.IF_);
|
|
||||||
'DF': include(fFlags, TFLAG.DF);
|
|
||||||
'OF': include(fFlags, TFLAG.OF_);
|
|
||||||
//'NT': include(fFlags, TFLAG.NT);
|
|
||||||
//'RF': include(fFlags, TFLAG.RF);
|
|
||||||
//'VM': include(fFlags, TFLAG.VM);
|
|
||||||
//'AC': include(fFlags, TFLAG.AC);
|
|
||||||
//'VIF':include(fFlags, TFLAG.VIF);
|
|
||||||
//'VIP':include(fFlags, TFLAG.VIP);
|
|
||||||
//'ID': include(fFlags, TFLAG.ID);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
rng.popUntil(#10)^.popFront;
|
|
||||||
rng.popUntil(#10)^.popFront;
|
|
||||||
continue;
|
|
||||||
end;
|
|
||||||
|
|
||||||
val := rng.takeWhile(['0','1','2','3','4','5','6','7','8','9']).yield;
|
|
||||||
rng.popUntil(#10)^.popFront;
|
|
||||||
rng.popUntil(#10)^.popFront;
|
|
||||||
case reg of
|
|
||||||
'cs': fSegment[TSegmentRegister.S_CS] := StrToInt(val);
|
|
||||||
'ds': fSegment[TSegmentRegister.S_DS] := StrToInt(val);
|
|
||||||
'es': fSegment[TSegmentRegister.S_ES] := StrToInt(val);
|
|
||||||
'fs': fSegment[TSegmentRegister.S_FS] := StrToInt(val);
|
|
||||||
'gs': fSegment[TSegmentRegister.S_GS] := StrToInt(val);
|
|
||||||
'ss': fSegment[TSegmentRegister.S_SS] := StrToInt(val);
|
|
||||||
{$IFDEF CPU64}
|
|
||||||
'rax': fRegisters[TCpuRegister.rax] := StrToInt64(val);
|
|
||||||
'rbx': fRegisters[TCpuRegister.rbx] := StrToInt64(val);
|
|
||||||
'rcx': fRegisters[TCpuRegister.rcx] := StrToInt64(val);
|
|
||||||
'rdx': fRegisters[TCpuRegister.rdx] := StrToInt64(val);
|
|
||||||
'rdi': fRegisters[TCpuRegister.rdi] := StrToInt64(val);
|
|
||||||
'rsi': fRegisters[TCpuRegister.rsi] := StrToInt64(val);
|
|
||||||
'rbp': fRegisters[TCpuRegister.rbp] := StrToInt64(val);
|
|
||||||
'rsp': fRegisters[TCpuRegister.rsp] := StrToInt64(val);
|
|
||||||
'r8': fRegisters[TCpuRegister.r8] := StrToInt64(val);
|
|
||||||
'r9': fRegisters[TCpuRegister.r9] := StrToInt64(val);
|
|
||||||
'r10': fRegisters[TCpuRegister.r10] := StrToInt64(val);
|
|
||||||
'r11': fRegisters[TCpuRegister.r11] := StrToInt64(val);
|
|
||||||
'r12': fRegisters[TCpuRegister.r12] := StrToInt64(val);
|
|
||||||
'r13': fRegisters[TCpuRegister.r13] := StrToInt64(val);
|
|
||||||
'r14': fRegisters[TCpuRegister.r14] := StrToInt64(val);
|
|
||||||
'r15': fRegisters[TCpuRegister.r15] := StrToInt64(val);
|
|
||||||
'rip': fRegisters[TCpuRegister.rip] := StrToInt64(val);
|
|
||||||
{$ELSE}
|
|
||||||
'eax': fRegisters[TCpuRegister.eax] := StrToInt(val);
|
|
||||||
'ebx': fRegisters[TCpuRegister.ebx] := StrToInt(val);
|
|
||||||
'ecx': fRegisters[TCpuRegister.ecx] := StrToInt(val);
|
|
||||||
'edx': fRegisters[TCpuRegister.edx] := StrToInt(val);
|
|
||||||
'edi': fRegisters[TCpuRegister.edi] := StrToInt(val);
|
|
||||||
'esi': fRegisters[TCpuRegister.esi] := StrToInt(val);
|
|
||||||
'ebp': fRegisters[TCpuRegister.ebp] := StrToInt(val);
|
|
||||||
'esp': fRegisters[TCpuRegister.esp] := StrToInt(val);
|
|
||||||
'eip': fRegisters[TCpuRegister.eip] := StrToInt(val);
|
|
||||||
{$ENDIF}
|
|
||||||
end;
|
|
||||||
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
{$ENDREGION}
|
{$ENDREGION}
|
||||||
|
|
||||||
|
@ -638,12 +512,14 @@ end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.infoRegs;
|
procedure TCEGdbWidget.infoRegs;
|
||||||
begin
|
begin
|
||||||
gdbCommand('info registers', @processInfoRegs);
|
// GDBMI output format, "info registers" is for CLI output
|
||||||
|
gdbCommand('-data-list-register-values d', @processInfoRegs);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.infoStack;
|
procedure TCEGdbWidget.infoStack;
|
||||||
begin
|
begin
|
||||||
gdbCommand('info stack', @processInfoStack);
|
// GDBMI output format, "info frame" is for CLI output
|
||||||
|
gdbCommand('-stack-info-frame', @processInfoStack);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.btnStartClick(Sender: TObject);
|
procedure TCEGdbWidget.btnStartClick(Sender: TObject);
|
||||||
|
|
|
@ -12,7 +12,7 @@ uses
|
||||||
ce_widget, ce_messages, ce_interfaces, ce_editor, ce_projinspect, ce_projconf,
|
ce_widget, ce_messages, ce_interfaces, ce_editor, ce_projinspect, ce_projconf,
|
||||||
ce_search, ce_miniexplorer, ce_libman, ce_libmaneditor, ce_todolist, ce_observer,
|
ce_search, ce_miniexplorer, ce_libman, ce_libmaneditor, ce_todolist, ce_observer,
|
||||||
ce_toolseditor, ce_procinput, ce_optionseditor, ce_symlist, ce_mru, ce_processes,
|
ce_toolseditor, ce_procinput, ce_optionseditor, ce_symlist, ce_mru, ce_processes,
|
||||||
ce_infos, ce_dubproject, ce_dialogs, ce_dubprojeditor, ce_gdb, ce_dfmt, ce_lcldragdrop;
|
ce_infos, ce_dubproject, ce_dialogs, ce_dubprojeditor, (*ce_gdb,*) ce_dfmt, ce_lcldragdrop;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
|
@ -241,7 +241,7 @@ type
|
||||||
fSymlWidg: TCESymbolListWidget;
|
fSymlWidg: TCESymbolListWidget;
|
||||||
fInfoWidg: TCEInfoWidget;
|
fInfoWidg: TCEInfoWidget;
|
||||||
fDubProjWidg: TCEDubProjectEditorWidget;
|
fDubProjWidg: TCEDubProjectEditorWidget;
|
||||||
fGdbWidg: TCEGdbWidget;
|
//fGdbWidg: TCEGdbWidget;
|
||||||
fDfmtWidg: TCEDfmtWidget;
|
fDfmtWidg: TCEDfmtWidget;
|
||||||
|
|
||||||
fRunProjAfterCompArg: boolean;
|
fRunProjAfterCompArg: boolean;
|
||||||
|
@ -894,7 +894,7 @@ begin
|
||||||
fSymlWidg := TCESymbolListWidget.create(self);
|
fSymlWidg := TCESymbolListWidget.create(self);
|
||||||
fInfoWidg := TCEInfoWidget.create(self);
|
fInfoWidg := TCEInfoWidget.create(self);
|
||||||
fDubProjWidg:= TCEDubProjectEditorWidget.create(self);
|
fDubProjWidg:= TCEDubProjectEditorWidget.create(self);
|
||||||
fGdbWidg := TCEGdbWidget.create(self);
|
//fGdbWidg := TCEGdbWidget.create(self);
|
||||||
fDfmtWidg := TCEDfmtWidget.create(self);
|
fDfmtWidg := TCEDfmtWidget.create(self);
|
||||||
|
|
||||||
getMessageDisplay(fMsgs);
|
getMessageDisplay(fMsgs);
|
||||||
|
@ -913,7 +913,7 @@ begin
|
||||||
fWidgList.addWidget(@fSymlWidg);
|
fWidgList.addWidget(@fSymlWidg);
|
||||||
fWidgList.addWidget(@fInfoWidg);
|
fWidgList.addWidget(@fInfoWidg);
|
||||||
fWidgList.addWidget(@fDubProjWidg);
|
fWidgList.addWidget(@fDubProjWidg);
|
||||||
fWidgList.addWidget(@fGdbWidg);
|
//fWidgList.addWidget(@fGdbWidg);
|
||||||
fWidgList.addWidget(@fDfmtWidg);
|
fWidgList.addWidget(@fDfmtWidg);
|
||||||
fWidgList.sort(@CompareWidgCaption);
|
fWidgList.sort(@CompareWidgCaption);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue