IDE, Debugger: Add real "Run-To"

git-svn-id: trunk@63303 -
This commit is contained in:
martin 2020-06-06 00:53:44 +00:00
parent de80bde641
commit 5bcddd28fb
13 changed files with 82 additions and 5 deletions

View File

@ -67,6 +67,7 @@ type
dcStepInto,
dcStepOut,
dcStepTo,
dcRunTo,
dcJumpto,
dcAttach,
dcDetach,
@ -1945,6 +1946,7 @@ type
procedure StepIntoInstr;
procedure StepOut;
procedure StepTo(const ASource: String; const ALine: Integer); // Executes til a certain point
procedure RunTo(const ASource: String; const ALine: Integer); // Executes til a certain point
procedure JumpTo(const ASource: String; const ALine: Integer); // No execute, only set exec point
procedure Attach(AProcessID: String);
procedure Detach;
@ -2069,11 +2071,11 @@ const
COMMANDMAP: array[TDBGState] of TDBGCommands = (
{dsNone } [],
{dsIdle } [dcEnvironment],
{dsStop } [dcRun, dcStepOver, dcStepInto, dcStepOverInstr, dcStepIntoInstr,
{dsStop } [dcRun, dcStepOver, dcStepInto, dcStepOverInstr, dcStepIntoInstr, dcRunTo,
dcAttach, dcBreak, dcWatch, dcEvaluate, dcEnvironment,
dcSendConsoleInput],
{dsPause} [dcRun, dcStop, dcStepOver, dcStepInto, dcStepOverInstr, dcStepIntoInstr,
dcStepOut, dcStepTo, dcJumpto, dcDetach, dcBreak, dcWatch, dcLocal, dcEvaluate, dcModify,
dcStepOut, dcStepTo, dcRunTo, dcJumpto, dcDetach, dcBreak, dcWatch, dcLocal, dcEvaluate, dcModify,
dcEnvironment, dcSetStackFrame, dcDisassemble, dcSendConsoleInput {, dcSendSignal}],
{dsInternalPause} // same as run, so not really used
[dcStop, dcBreak, dcWatch, dcEnvironment, dcSendConsoleInput{, dcSendSignal}],
@ -6239,6 +6241,11 @@ begin
ReqCmd(dcStepTo, [ASource, ALine]);
end;
procedure TDebuggerIntf.RunTo(const ASource: String; const ALine: Integer);
begin
ReqCmd(dcRunTo, [ASource, ALine]);
end;
procedure TDebuggerIntf.SetDebuggerEnvironment (const AValue: TStrings );
begin
FDebuggerEnvironment.Assign(AValue);

View File

@ -278,6 +278,8 @@ const
ecStopProgram = ecFirstLazarus + 415;
ecResetDebugger = ecFirstLazarus + 416;
ecRunParameters = ecFirstLazarus + 417;
ecRunToCursor = ecFirstLazarus + 418;
ecBuildFile = ecFirstLazarus + 431;
ecRunFile = ecFirstLazarus + 432;
ecConfigBuildFile = ecFirstLazarus + 433;
@ -1933,7 +1935,7 @@ begin
end;
const
IDEEditorCommandStrs: array[0..322] of TIdentMapEntry = (
IDEEditorCommandStrs: array[0..323] of TIdentMapEntry = (
// search
(Value: ecFind; Name: 'ecFind'),
(Value: ecFindAgain; Name: 'ecFindAgain'),
@ -2152,6 +2154,7 @@ const
(Value: ecStepInto; Name: 'ecStepInto'),
(Value: ecStepOver; Name: 'ecStepOver'),
(Value: ecStepToCursor; Name: 'ecStepToCursor'),
(Value: ecRunToCursor; Name: 'ecRunToCursor'),
(Value: ecStopProgram; Name: 'ecStopProgram'),
(Value: ecResetDebugger; Name: 'ecResetDebugger'),
(Value: ecRunParameters; Name: 'ecRunParameters'),

View File

@ -1735,6 +1735,7 @@ const
'StepInto',
'StepOut',
'StepTo',
'RunTo',
'Jumpto',
'Attach',
'Detach',

View File

@ -165,6 +165,7 @@ type
function DoStepIntoInstrProject: TModalResult; virtual; abstract;
function DoStepOverInstrProject: TModalResult; virtual; abstract;
function DoStepToCursor: TModalResult; virtual; abstract;
function DoRunToCursor: TModalResult; virtual; abstract;
function DoStopProject: TModalResult; virtual; abstract;
procedure DoToggleCallStack; virtual; abstract;
procedure DoSendConsoleInput(AText: String); virtual; abstract;

View File

@ -224,6 +224,7 @@ type
function DoStepOverInstrProject: TModalResult; override;
function DoStepOutProject: TModalResult; override;
function DoStepToCursor: TModalResult; override;
function DoRunToCursor: TModalResult; override;
function DoStopProject: TModalResult; override;
procedure DoToggleCallStack; override;
procedure DoSendConsoleInput(AText: String); override;
@ -2057,6 +2058,7 @@ procedure TDebugManager.SetupSourceMenuShortCuts;
begin
SrcEditMenuToggleBreakpoint.Command:=GetCommand(ecToggleBreakPoint);
SrcEditMenuStepToCursor.Command:=GetCommand(ecStepToCursor);
SrcEditMenuRunToCursor.Command:=GetCommand(ecRunToCursor);
SrcEditMenuEvaluateModify.Command:=GetCommand(ecEvaluate);
SrcEditMenuAddWatchAtCursor.Command:=GetCommand(ecAddWatch);
SrcEditMenuAddWatchPointAtCursor.Command:=GetCommand(ecAddBpDataWatch);
@ -2102,9 +2104,12 @@ begin
// Step out
itmRunMenuStepOut.Enabled := CanRun and DebuggerIsValid
and (dcStepOut in FDebugger.Commands) and (FDebugger.State = dsPause);
// Run to cursor
// Step to cursor
itmRunMenuStepToCursor.Enabled := CanRun and DebuggerIsValid
and (dcStepTo in FDebugger.Commands);
// Run to cursor
itmRunMenuRunToCursor.Enabled := CanRun and DebuggerIsValid
and (dcRunTo in FDebugger.Commands);
// Stop
itmRunMenuStop.Enabled := CanRun and DebuggerIsValid;
@ -2758,7 +2763,8 @@ begin
else DoStepOverProject;
end;
ecStepOut: DoStepOutProject;
ecStepToCursor: DoStepToCursor;
ecStepToCursor: DoStepToCursor;
ecRunToCursor: DoRunToCursor;
ecStopProgram: DoStopProject;
ecResetDebugger: ResetDebugger;
ecToggleCallStack: DoToggleCallStack;
@ -3078,6 +3084,47 @@ begin
Result := mrOK;
end;
function TDebugManager.DoRunToCursor: TModalResult;
var
ActiveSrcEdit: TSourceEditorInterface;
ActiveUnitInfo: TUnitInfo;
UnitFilename: string;
begin
if (FDebugger = nil) or not(dcRunTo in FDebugger.Commands)
then begin
Result := mrAbort;
Exit;
end;
if (MainIDE.DoInitProjectRun <> mrOK)
or (MainIDE.ToolStatus <> itDebugger)
or (FDebugger = nil) or Destroying
then begin
Result := mrAbort;
Exit;
end;
Result := mrCancel;
MainIDE.GetCurrentUnitInfo(ActiveSrcEdit,ActiveUnitInfo);
if (ActiveSrcEdit=nil) or (ActiveUnitInfo=nil)
then begin
IDEMessageDialog(lisRunToFailed, lisPleaseOpenAUnitBeforeRun, mtError,
[mbCancel]);
Result := mrCancel;
Exit;
end;
if not ActiveUnitInfo.Source.IsVirtual
then UnitFilename:=ActiveUnitInfo.Filename
else UnitFilename:=BuildBoss.GetTestUnitFilename(ActiveUnitInfo);
FDebugger.RunTo(ExtractFilename(UnitFilename),
TSourceEditor(ActiveSrcEdit).EditorComponent.CaretY);
Result := mrOK;
end;
function TDebugManager.GetState: TDBGState;
begin
if FDebugger = nil

View File

@ -705,6 +705,7 @@ begin
ecAttach : Result:= srkmecAttach;
ecDetach : Result:= srkmecDetach;
ecStepToCursor : Result:= lisMenuStepToCursor;
ecRunToCursor : Result:= lisMenuRunToCursor;
ecStopProgram : Result:= srkmecStopProgram;
ecResetDebugger : Result:= srkmecResetDebugger;
ecRunParameters : Result:= srkmecRunParameters;
@ -3169,6 +3170,7 @@ begin
AddDefault(C, 'Step over context', lisMenuStepOverContext, ecStepOverContext);
AddDefault(C, 'Step out', n(lisMenuStepOut), ecStepOut);
AddDefault(C, 'Step to cursor line', n(lisMenuStepToCursor), ecStepToCursor);
AddDefault(C, 'Run to cursor line', n(lisMenuRunToCursor), ecRunToCursor);
AddDefault(C, 'Stop program', lisKMStopProgram, ecStopProgram);
AddDefault(C, 'Reset debugger', lisMenuResetDebugger, ecResetDebugger);
AddDefault(C, 'Run parameters', dlgRunParameters, ecRunParameters);

View File

@ -1036,6 +1036,7 @@
<Filename Value="fpdoceditwindow.pas"/>
<IsPartOfProject Value="True"/>
<HasResources Value="True"/>
<UnitName Value="FPDocEditWindow"/>
</Unit167>
<Unit168>
<Filename Value="unitinfodlg.pp"/>
@ -1191,6 +1192,7 @@
<Unit197>
<Filename Value="codehelp.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="CodeHelp"/>
</Unit197>
<Unit198>
<Filename Value="diffdialog.pas"/>
@ -1234,6 +1236,7 @@
<ComponentName Value="IDEOptionsDialog"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="IDEOptionsDlg"/>
</Unit205>
<Unit206>
<Filename Value="findunitdlg.pas"/>

Binary file not shown.

View File

@ -530,6 +530,7 @@ resourcestring
lisMenuStepOverContext = 'Step Over (Context)';
lisMenuStepOut = 'Step O&ut';
lisMenuStepToCursor = 'Step over to &Cursor';
lisMenuRunToCursor = 'Run to Cursor';
lisKMStopProgram = 'Stop Program';
lisContinueAndDoNotAskAgain = 'Continue and do not ask again';
lisSuspiciousUnitPath = 'Suspicious unit path';

View File

@ -347,6 +347,7 @@ type
procedure mnuStepIntoInstrProjectClicked(Sender: TObject);
procedure mnuStepOverInstrProjectClicked(Sender: TObject);
procedure mnuStepOutProjectClicked(Sender: TObject);
procedure mnuRunToCursorProjectClicked(Sender: TObject);
procedure mnuStepToCursorProjectClicked(Sender: TObject);
procedure mnuStopProjectClicked(Sender: TObject);
procedure mnuAttachDebuggerClicked(Sender: TObject);
@ -3097,6 +3098,7 @@ begin
itmRunMenuStepInto.Command:=GetCommand(ecStepInto, @mnuStepIntoProjectClicked);
itmRunMenuStepOver.Command:=GetCommand(ecStepOver, @mnuStepOverProjectClicked);
itmRunMenuStepOut.Command:=GetCommand(ecStepOut, @mnuStepOutProjectClicked);
itmRunMenuRunToCursor.Command:=GetCommand(ecRunToCursor, @mnuRunToCursorProjectClicked);
itmRunMenuStepToCursor.Command:=GetCommand(ecStepToCursor, @mnuStepToCursorProjectClicked);
itmRunMenuStop.Command:=GetCommand(ecStopProgram, @mnuStopProjectClicked);
itmRunMenuAttach.Command:=GetCommand(ecAttach, @mnuAttachDebuggerClicked);
@ -4632,6 +4634,11 @@ begin
DebugBoss.DoStepOutProject;
end;
procedure TMainIDE.mnuRunToCursorProjectClicked(Sender: TObject);
begin
DebugBoss.DoRunToCursor;
end;
procedure TMainIDE.mnuStepToCursorProjectClicked(Sender: TObject);
begin
DebugBoss.DoStepToCursor;

View File

@ -298,6 +298,7 @@ type
itmRunMenuStepOver: TIDEMenuCommand;
itmRunMenuStepOut: TIDEMenuCommand;
itmRunMenuStepToCursor: TIDEMenuCommand;
itmRunMenuRunToCursor: TIDEMenuCommand;
itmRunMenuStop: TIDEMenuCommand;
itmRunMenuAttach: TIDEMenuCommand;
itmRunMenuDetach: TIDEMenuCommand;

View File

@ -1358,6 +1358,7 @@ begin
CreateMenuItem(ParentMI,itmRunMenuStepOver,'itmRunMenuStepOver',lisMenuStepOver,'menu_stepover');
CreateMenuItem(ParentMI,itmRunMenuStepOut,'itmRunMenuStepOut',lisMenuStepOut,'menu_stepout');
CreateMenuItem(ParentMI,itmRunMenuStepToCursor,'itmRunMenuStepToCursor',lisMenuStepToCursor,'menu_step_cursor');
CreateMenuItem(ParentMI,itmRunMenuRunToCursor,'itmRunMenuRunToCursor',lisMenuRunToCursor,'menu_run_cursor');
CreateMenuItem(ParentMI,itmRunMenuStop,'itmRunMenuStop',lisStop,'menu_stop', False);
CreateMenuItem(ParentMI,itmRunMenuAttach,'itmRunMenuAttach',srkmecAttach+' ...','', False);

View File

@ -1376,6 +1376,7 @@ var
// debugging
SrcEditMenuToggleBreakpoint: TIDEMenuCommand;
SrcEditMenuStepToCursor: TIDEMenuCommand;
SrcEditMenuRunToCursor: TIDEMenuCommand;
SrcEditMenuEvaluateModify: TIDEMenuCommand;
SrcEditMenuAddWatchAtCursor: TIDEMenuCommand;
SrcEditMenuAddWatchPointAtCursor: TIDEMenuCommand;
@ -1738,6 +1739,8 @@ begin
SrcEditMenuInspect.Enabled:=False;
SrcEditMenuStepToCursor:=RegisterIDEMenuCommand(AParent,
'Run to cursor', lisMenuStepToCursor, nil, nil, nil, 'menu_step_cursor');
SrcEditMenuRunToCursor:=RegisterIDEMenuCommand(AParent,
'Run to cursor', lisMenuRunToCursor, nil, nil, nil, 'menu_run_cursor');
SrcEditMenuViewCallStack:=RegisterIDEMenuCommand(AParent,
'View Call Stack', uemViewCallStack, nil, @ExecuteIdeMenuClick, nil, 'debugger_call_stack');
{%endregion}