mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-19 19:09:28 +01:00
IDE, Debugger: Add real "Run-To"
git-svn-id: trunk@63303 -
This commit is contained in:
parent
de80bde641
commit
5bcddd28fb
@ -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);
|
||||
|
||||
@ -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'),
|
||||
|
||||
@ -1735,6 +1735,7 @@ const
|
||||
'StepInto',
|
||||
'StepOut',
|
||||
'StepTo',
|
||||
'RunTo',
|
||||
'Jumpto',
|
||||
'Attach',
|
||||
'Detach',
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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"/>
|
||||
|
||||
BIN
ide/lazarus.res
BIN
ide/lazarus.res
Binary file not shown.
@ -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';
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -298,6 +298,7 @@ type
|
||||
itmRunMenuStepOver: TIDEMenuCommand;
|
||||
itmRunMenuStepOut: TIDEMenuCommand;
|
||||
itmRunMenuStepToCursor: TIDEMenuCommand;
|
||||
itmRunMenuRunToCursor: TIDEMenuCommand;
|
||||
itmRunMenuStop: TIDEMenuCommand;
|
||||
itmRunMenuAttach: TIDEMenuCommand;
|
||||
itmRunMenuDetach: TIDEMenuCommand;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user