From 5bcddd28fbb51aa34cfbb07fc5a3a281a9b16b2e Mon Sep 17 00:00:00 2001 From: martin Date: Sat, 6 Jun 2020 00:53:44 +0000 Subject: [PATCH] IDE, Debugger: Add real "Run-To" git-svn-id: trunk@63303 - --- .../debuggerintf/dbgintfdebuggerbase.pp | 11 +++- components/ideintf/idecommands.pas | 5 +- debugger/debugger.pp | 1 + ide/basedebugmanager.pas | 1 + ide/debugmanager.pas | 51 +++++++++++++++++- ide/keymapping.pp | 2 + ide/lazarus.lpi | 3 ++ ide/lazarus.res | Bin 139096 -> 139140 bytes ide/lazarusidestrconsts.pas | 1 + ide/main.pp | 7 +++ ide/mainbar.pas | 1 + ide/mainbase.pas | 1 + ide/sourceeditor.pp | 3 ++ 13 files changed, 82 insertions(+), 5 deletions(-) diff --git a/components/debuggerintf/dbgintfdebuggerbase.pp b/components/debuggerintf/dbgintfdebuggerbase.pp index 3a4eaad90f..15cc590488 100644 --- a/components/debuggerintf/dbgintfdebuggerbase.pp +++ b/components/debuggerintf/dbgintfdebuggerbase.pp @@ -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); diff --git a/components/ideintf/idecommands.pas b/components/ideintf/idecommands.pas index cf53f677a0..8b6b6fffa8 100644 --- a/components/ideintf/idecommands.pas +++ b/components/ideintf/idecommands.pas @@ -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'), diff --git a/debugger/debugger.pp b/debugger/debugger.pp index 797af6bcd9..9f905f7367 100644 --- a/debugger/debugger.pp +++ b/debugger/debugger.pp @@ -1735,6 +1735,7 @@ const 'StepInto', 'StepOut', 'StepTo', + 'RunTo', 'Jumpto', 'Attach', 'Detach', diff --git a/ide/basedebugmanager.pas b/ide/basedebugmanager.pas index e52ad0a28a..889a31cf66 100644 --- a/ide/basedebugmanager.pas +++ b/ide/basedebugmanager.pas @@ -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; diff --git a/ide/debugmanager.pas b/ide/debugmanager.pas index 9f8352a715..c8b923b751 100644 --- a/ide/debugmanager.pas +++ b/ide/debugmanager.pas @@ -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 diff --git a/ide/keymapping.pp b/ide/keymapping.pp index 89d59d1e29..5f6bebf29c 100644 --- a/ide/keymapping.pp +++ b/ide/keymapping.pp @@ -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); diff --git a/ide/lazarus.lpi b/ide/lazarus.lpi index a92d4044ad..b5b2e5b6a6 100644 --- a/ide/lazarus.lpi +++ b/ide/lazarus.lpi @@ -1036,6 +1036,7 @@ + @@ -1191,6 +1192,7 @@ + @@ -1234,6 +1236,7 @@ + diff --git a/ide/lazarus.res b/ide/lazarus.res index daf660f5e490de1f2ab0fc2c35be1890d6532185..853e17f0619dba7658a42b2aab3041e60cbfefec 100644 GIT binary patch delta 68 zcmcbykE3Nj#{>n&2OAZqvZ*N8<`k#e=%WZuUc=_r{DrOk N3mfD1FKkRH5&)5U8ZQ6< delta 34 qcmZqK&v9cP#{>n&O&b-bvQ2)%X2Zn5(5%4TuE5T?U4fk`MFIfW2?{Cz diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index 66aa7b6cfa..7ed5c4ffa3 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -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'; diff --git a/ide/main.pp b/ide/main.pp index 357ca7af0b..73ff9f310e 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -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; diff --git a/ide/mainbar.pas b/ide/mainbar.pas index a3e5c04da0..e21fb857c7 100644 --- a/ide/mainbar.pas +++ b/ide/mainbar.pas @@ -298,6 +298,7 @@ type itmRunMenuStepOver: TIDEMenuCommand; itmRunMenuStepOut: TIDEMenuCommand; itmRunMenuStepToCursor: TIDEMenuCommand; + itmRunMenuRunToCursor: TIDEMenuCommand; itmRunMenuStop: TIDEMenuCommand; itmRunMenuAttach: TIDEMenuCommand; itmRunMenuDetach: TIDEMenuCommand; diff --git a/ide/mainbase.pas b/ide/mainbase.pas index f0fb77dd1a..310e3c4301 100644 --- a/ide/mainbase.pas +++ b/ide/mainbase.pas @@ -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); diff --git a/ide/sourceeditor.pp b/ide/sourceeditor.pp index 1e6b2be77d..c9b26b928d 100644 --- a/ide/sourceeditor.pp +++ b/ide/sourceeditor.pp @@ -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}