#42, support for core.exceptions throw by onXXX func, support for live brkp from editors

This commit is contained in:
Basile Burg 2015-10-02 05:38:33 +02:00
parent bc7169d1d8
commit 12f9600810
1 changed files with 66 additions and 3 deletions

View File

@ -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;