mirror of https://gitlab.com/basile.b/dexed.git
#42, support for core.exceptions throw by onXXX func, support for live brkp from editors
This commit is contained in:
parent
bc7169d1d8
commit
12f9600810
|
@ -14,7 +14,7 @@ type
|
||||||
TCpuRegs = (eax);
|
TCpuRegs = (eax);
|
||||||
|
|
||||||
{ TCEGdbWidget }
|
{ TCEGdbWidget }
|
||||||
TCEGdbWidget = class(TCEWidget, ICEProjectObserver)
|
TCEGdbWidget = class(TCEWidget, ICEProjectObserver, ICEMultiDocObserver)
|
||||||
btnSendCom: TBitBtn;
|
btnSendCom: TBitBtn;
|
||||||
btnStop: TBitBtn;
|
btnStop: TBitBtn;
|
||||||
btnStart: TBitBtn;
|
btnStart: TBitBtn;
|
||||||
|
@ -42,6 +42,7 @@ type
|
||||||
procedure startDebugging;
|
procedure startDebugging;
|
||||||
procedure killGdb;
|
procedure killGdb;
|
||||||
procedure updateFileLineBrks;
|
procedure updateFileLineBrks;
|
||||||
|
procedure editorModBrk(sender: TCESynMemo; line: integer; removed: boolean);
|
||||||
// GDB output processors
|
// GDB output processors
|
||||||
procedure processInfoRegs(sender: TObject);
|
procedure processInfoRegs(sender: TObject);
|
||||||
procedure processInfoStack(sender: TObject);
|
procedure processInfoStack(sender: TObject);
|
||||||
|
@ -58,6 +59,11 @@ type
|
||||||
procedure projClosing(aProject: ICECommonProject);
|
procedure projClosing(aProject: ICECommonProject);
|
||||||
procedure projFocused(aProject: ICECommonProject);
|
procedure projFocused(aProject: ICECommonProject);
|
||||||
procedure projCompiling(aProject: ICECommonProject);
|
procedure projCompiling(aProject: ICECommonProject);
|
||||||
|
//
|
||||||
|
procedure docNew(aDoc: TCESynMemo);
|
||||||
|
procedure docFocused(aDoc: TCESynMemo);
|
||||||
|
procedure docChanged(aDoc: TCESynMemo);
|
||||||
|
procedure docClosing(aDoc: TCESynMemo);
|
||||||
public
|
public
|
||||||
constructor create(aOwner: TComponent); override;
|
constructor create(aOwner: TComponent); override;
|
||||||
destructor destroy; override;
|
destructor destroy; override;
|
||||||
|
@ -119,6 +125,28 @@ begin
|
||||||
end;
|
end;
|
||||||
{$ENDREGION}
|
{$ENDREGION}
|
||||||
|
|
||||||
|
{$REGION ICEMultiDocObserver ---------------------------------------------------}
|
||||||
|
procedure TCEGdbWidget.docNew(aDoc: TCESynMemo);
|
||||||
|
begin
|
||||||
|
if aDoc.isDSource then
|
||||||
|
aDoc.onBreakpointModify := @editorModBrk;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCEGdbWidget.docFocused(aDoc: TCESynMemo);
|
||||||
|
begin
|
||||||
|
if aDoc.isDSource then
|
||||||
|
aDoc.onBreakpointModify := @editorModBrk;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCEGdbWidget.docChanged(aDoc: TCESynMemo);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCEGdbWidget.docClosing(aDoc: TCESynMemo);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
{$ENDREGION}
|
||||||
|
|
||||||
{$REGION Unsorted Debugging things ---------------------------------------------}
|
{$REGION Unsorted Debugging things ---------------------------------------------}
|
||||||
procedure TCEGdbWidget.killGdb;
|
procedure TCEGdbWidget.killGdb;
|
||||||
begin
|
begin
|
||||||
|
@ -153,6 +181,27 @@ begin
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCEGdbWidget.editorModBrk(sender: TCESynMemo; line: integer; removed: boolean);
|
||||||
|
var
|
||||||
|
str: string;
|
||||||
|
nme: string;
|
||||||
|
const
|
||||||
|
cmd: array[boolean] of string = ('break ', 'clear ');
|
||||||
|
begin
|
||||||
|
// set only breakpoint in live, while debugging
|
||||||
|
// note: only works if execution is paused (breakpoint)
|
||||||
|
// and not inside a loop (for ex. with sleep).
|
||||||
|
if fGdb = nil then exit;
|
||||||
|
if not fGdb.Running then exit;
|
||||||
|
nme := sender.fileName;
|
||||||
|
if not FileExists(nme) then exit;
|
||||||
|
//
|
||||||
|
str := cmd[removed] + nme + ':' + intToStr(line);
|
||||||
|
fGdb.Suspend;
|
||||||
|
gdbCommand(str);
|
||||||
|
fGdb.Resume;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.startDebugging;
|
procedure TCEGdbWidget.startDebugging;
|
||||||
var
|
var
|
||||||
str: string;
|
str: string;
|
||||||
|
@ -176,9 +225,23 @@ begin
|
||||||
updateFileLineBrks;
|
updateFileLineBrks;
|
||||||
for i:= 0 to fFileLineBrks.Count-1 do
|
for i:= 0 to fFileLineBrks.Count-1 do
|
||||||
begin
|
begin
|
||||||
str := 'b ' + fFileLineBrks.Strings[i] + ':' + intToStr(PtrUInt(fFileLineBrks.Objects[i])) + #10;
|
str := 'break ' + fFileLineBrks.Strings[i] + ':' + intToStr(PtrUInt(fFileLineBrks.Objects[i])) + #10;
|
||||||
fGdb.Input.Write(str[1], length(str));
|
fGdb.Input.Write(str[1], length(str));
|
||||||
end;
|
end;
|
||||||
|
// break on druntime exceptions, does not work with 'throw new ...'
|
||||||
|
gdbCommand('break onAssertError');
|
||||||
|
gdbCommand('break onAssertErrorMsg');
|
||||||
|
gdbCommand('break onUnittestErrorMsg');
|
||||||
|
gdbCommand('break onRangeError');
|
||||||
|
gdbCommand('break onFinalizeError');
|
||||||
|
gdbCommand('break onHiddenFuncError');
|
||||||
|
gdbCommand('break onOutOfMemoryError');
|
||||||
|
gdbCommand('break onInvalidMemoryOperationError');
|
||||||
|
gdbCommand('break onSwitchError');
|
||||||
|
gdbCommand('break onUnicodeError');
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
// launch
|
// launch
|
||||||
gdbCommand('run');
|
gdbCommand('run');
|
||||||
end;
|
end;
|
||||||
|
@ -256,7 +319,7 @@ end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.btnStopClick(Sender: TObject);
|
procedure TCEGdbWidget.btnStopClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
gdbCommand('stop');
|
gdbCommand('kill');
|
||||||
killGdb;
|
killGdb;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue