ide, debugger: implement *step out* debugger action by Flávio Etrusco (issue #0015760)

git-svn-id: trunk@23717 -
This commit is contained in:
paul 2010-02-16 13:02:30 +00:00
parent b9871028b6
commit f5fa216d8b
14 changed files with 100 additions and 4 deletions

1
.gitattributes vendored
View File

@ -3955,6 +3955,7 @@ images/menu/menu_search_previous_bookmark.png -text
images/menu/menu_search_replace.png -text svneol=unset#image/png
images/menu/menu_select_all.png -text svneol=unset#image/png
images/menu/menu_stepinto.png -text svneol=unset#image/png
images/menu/menu_stepout.png -text svneol=unset#image/png
images/menu/menu_stepover.png -text svneol=unset#image/png
images/menu/menu_stop.png -text svneol=unset#image/png
images/menu/menu_tool_check_lfm.png -text svneol=unset#image/png

View File

@ -57,6 +57,7 @@ type
dcStop,
dcStepOver,
dcStepInto,
dcStepOut,
dcRunTo,
dcJumpto,
dcBreak,
@ -1323,6 +1324,7 @@ type
procedure Stop; // quit debugging
procedure StepOver;
procedure StepInto;
procedure StepOut;
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
function Evaluate(const AExpression: String; var AResult: String;
@ -1370,6 +1372,7 @@ const
'Stop',
'StepOver',
'StepInto',
'StepOut',
'RunTo',
'Jumpto',
'Break',
@ -1415,9 +1418,9 @@ const
COMMANDMAP: array[TDBGState] of TDBGCommands = (
{dsNone } [],
{dsIdle } [dcEnvironment],
{dsStop } [dcRun, dcStepOver, dcStepInto, dcRunTo, dcJumpto, dcBreak, dcWatch,
{dsStop } [dcRun, dcStepOver, dcStepInto, dcStepOut, dcRunTo, dcJumpto, dcBreak, dcWatch,
dcEvaluate, dcEnvironment],
{dsPause} [dcRun, dcStop, dcStepOver, dcStepInto, dcRunTo, dcJumpto, dcBreak,
{dsPause} [dcRun, dcStop, dcStepOver, dcStepInto, dcStepOut, dcRunTo, dcJumpto, dcBreak,
dcWatch, dcLocal, dcEvaluate, dcModify, dcEnvironment, dcSetStackFrame,
dcDisassemble],
{dsInit } [],
@ -1894,6 +1897,12 @@ begin
DebugLn('TDebugger.StepInto Class=',ClassName,' failed.');
end;
procedure TDebugger.StepOut;
begin
if ReqCmd(dcStepOut, []) then exit;
DebugLn('TDebugger.StepOut Class=', ClassName, ' failed.');
end;
procedure TDebugger.StepOver;
begin
if ReqCmd(dcStepOver, []) then exit;

View File

@ -143,6 +143,7 @@ type
function GDBStop: Boolean;
function GDBStepOver: Boolean;
function GDBStepInto: Boolean;
function GDBStepOut: Boolean;
function GDBRunTo(const ASource: String; const ALine: Integer): Boolean;
function GDBJumpTo(const ASource: String; const ALine: Integer): Boolean;
function GDBDisassemble(AAddr: TDbgPtr; ABackward: Boolean; out ANextAddr: TDbgPtr;
@ -2791,6 +2792,22 @@ begin
end;
end;
function TGDBMIDebugger.GDBStepOut: Boolean;
begin
Result := False;
case State of
dsStop: begin
Result := StartDebugging('');
end;
dsPause: begin
Result := ExecuteCommand('-exec-finish', [cfExternal]);
end;
dsIdle: begin
DebugLn('[WARNING] Debugger: Unable to step out in idle state');
end;
end;
end;
function TGDBMIDebugger.GDBStepOver: Boolean;
begin
Result := False;
@ -3068,7 +3085,7 @@ end;
function TGDBMIDebugger.GetSupportedCommands: TDBGCommands;
begin
Result := [dcRun, dcPause, dcStop, dcStepOver, dcStepInto, dcRunTo, dcJumpto,
Result := [dcRun, dcPause, dcStop, dcStepOver, dcStepInto, dcStepOut, dcRunTo, dcJumpto,
dcBreak, dcWatch, dcLocal, dcEvaluate, dcModify, dcEnvironment,
dcSetStackFrame, dcDisassemble];
end;
@ -3782,6 +3799,7 @@ begin
dcStop: Result := GDBStop;
dcStepOver: Result := GDBStepOver;
dcStepInto: Result := GDBStepInto;
dcStepOut: Result := GDBStepOut;
dcRunTo: Result := GDBRunTo(String(AParams[0].VAnsiString), AParams[1].VInteger);
dcJumpto: Result := GDBJumpTo(String(AParams[0].VAnsiString), AParams[1].VInteger);
dcEvaluate: Result := GDBEvaluate(String(AParams[0].VAnsiString), String(AParams[1].VPointer^),TGDBType(AParams[2].VPointer^));

View File

@ -105,6 +105,7 @@ type
function DoShowExecutionPoint: TModalResult; virtual; abstract;
function DoStepIntoProject: TModalResult; virtual; abstract;
function DoStepOverProject: TModalResult; virtual; abstract;
function DoStepOutProject: TModalResult; virtual; abstract;
function DoRunToCursor: TModalResult; virtual; abstract;
function DoStopProject: TModalResult; virtual; abstract;
procedure DoToggleCallStack; virtual; abstract;

View File

@ -163,6 +163,7 @@ type
function DoShowExecutionPoint: TModalResult; override;
function DoStepIntoProject: TModalResult; override;
function DoStepOverProject: TModalResult; override;
function DoStepOutProject: TModalResult; override;
function DoRunToCursor: TModalResult; override;
function DoStopProject: TModalResult; override;
procedure DoToggleCallStack; override;
@ -1986,6 +1987,9 @@ begin
StepOverSpeedButton.Enabled := DebuggerInvalid or
(dcStepOver in FDebugger.Commands) or (FDebugger.State = dsIdle);
itmRunMenuStepOver.Enabled := StepOverSpeedButton.Enabled;
StepOutSpeedButton.Enabled := DebuggerInvalid or
(dcStepOut in FDebugger.Commands) or (FDebugger.State = dsIdle);
itmRunMenuStepOut.Enabled := StepOutSpeedButton.Enabled;
itmRunMenuRunToCursor.Enabled := DebuggerInvalid
or (dcRunTo in FDebugger.Commands);
@ -2347,6 +2351,20 @@ begin
Result := mrOk;
end;
function TDebugManager.DoStepOutProject: TModalResult;
begin
if (MainIDE.DoInitProjectRun <> mrOK)
or (MainIDE.ToolStatus <> itDebugger)
or (FDebugger = nil) or Destroying
then begin
Result := mrAbort;
Exit;
end;
FDebugger.StepOut;
Result := mrOk;
end;
function TDebugManager.DoStopProject: TModalResult;
begin
Result := mrCancel;
@ -2375,6 +2393,7 @@ begin
ecPause: DoPauseProject;
ecStepInto: DoStepIntoProject;
ecStepOver: DoStepOverProject;
ecStepOut: DoStepOutProject;
ecRunToCursor: DoRunToCursor;
ecStopProgram: DoStopProject;
ecResetDebugger: ResetDebugger;

View File

@ -538,6 +538,7 @@ begin
ecShowExecutionPoint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]);
ecStepInto: SetResult(VK_F7,[],VK_UNKNOWN,[]);
ecStepOver: SetResult(VK_F8,[],VK_UNKNOWN,[]);
ecStepOut: SetResult(VK_F8,[ssShift],VK_UNKNOWN,[]);
ecRunToCursor: SetResult(VK_F4,[],VK_UNKNOWN,[]);
ecStopProgram: SetResult(VK_F2,[SSCtrl],VK_UNKNOWN,[]);
ecRemoveBreakPoint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]);
@ -959,6 +960,7 @@ begin
ecShowExecutionPoint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]);
ecStepInto: SetResult(VK_F7,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]);
ecStepOver: SetResult(VK_F8,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]);
ecStepOut: SetResult(VK_F8,[ssShift],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]);
ecRunToCursor: SetResult(VK_F4,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]);
ecStopProgram: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]);
ecRemoveBreakPoint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]);
@ -1562,6 +1564,7 @@ begin
ecShowExecutionPoint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]);
ecStepInto: SetResult(VK_R,[ssMeta,ssAlt],VK_UNKNOWN,[]);
ecStepOver: SetResult(VK_R,[ssMeta,ssShift],VK_UNKNOWN,[]);
ecStepOut: SetResult(VK_T,[ssMeta,ssShift],VK_UNKNOWN,[]);
ecRunToCursor: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]);
ecStopProgram: SetResult(VK_RETURN,[ssShift,ssMeta],VK_UNKNOWN,[]);
ecRemoveBreakPoint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]);
@ -1725,6 +1728,7 @@ begin
ecShowExecutionPoint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]);
ecStepInto: SetResult(VK_F7,[],VK_F7,[ssMeta]);
ecStepOver: SetResult(VK_F8,[],VK_F8,[ssMeta]);
ecStepOut: SetResult(VK_F8,[],VK_F8,[ssShift,ssMeta]);
ecRunToCursor: SetResult(VK_F4,[],VK_F4,[ssMeta]);
ecStopProgram: SetResult(VK_F2,[ssCtrl],VK_F2,[ssCtrl,ssMeta]);
ecRemoveBreakPoint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]);
@ -2078,6 +2082,7 @@ begin
ecShowExecutionPoint : Result:= srkmecShowExecutionPoint;
ecStepInto : Result:= lisMenuStepInto;
ecStepOver : Result:= lisMenuStepOver;
ecStepOut : Result:= lisMenuStepOut;
ecRunToCursor : Result:= lisMenuRunToCursor;
ecStopProgram : Result:= srkmecStopProgram;
ecResetDebugger : Result:= srkmecResetDebugger;
@ -2769,6 +2774,7 @@ begin
AddDefault(C, 'Show execution point', lisMenuShowExecutionPoint, ecShowExecutionPoint);
AddDefault(C, 'Step into', lisMenuStepInto, ecStepInto);
AddDefault(C, 'Step over', lisMenuStepOver, ecStepOver);
AddDefault(C, 'Step out', lisMenuStepOut, ecStepOut);
AddDefault(C, 'Run to cursor', lisMenuRunToCursor, ecRunToCursor);
AddDefault(C, 'Stop program', lisKMStopProgram, ecStopProgram);
AddDefault(C, 'Reset debugger', lisMenuResetDebugger, ecResetDebugger);

View File

@ -334,6 +334,7 @@ resourcestring
lisMenuShowExecutionPoint = 'Show execution point';
lisMenuStepInto = 'Step into';
lisMenuStepOver = 'Step over';
lisMenuStepOut = 'Step out';
lisMenuRunToCursor = 'Run to cursor';
lisKMStopProgram = 'Stop program';
lisMenuStop = 'Stop';
@ -815,7 +816,8 @@ resourcestring
lisHintStop = 'Stop';
lisHintStepInto = 'Step Into';
lisHintStepOver = 'Step Over';
lisHintStepOut = 'Run until function returns';
lisGPLNotice =
'<description>'
+'%s'

View File

@ -296,6 +296,7 @@ type
procedure mnuShowExecutionPointClicked(Sender: TObject);
procedure mnuStepIntoProjectClicked(Sender: TObject);
procedure mnuStepOverProjectClicked(Sender: TObject);
procedure mnuStepOutProjectClicked(Sender: TObject);
procedure mnuRunToCursorProjectClicked(Sender: TObject);
procedure mnuStopProjectClicked(Sender: TObject);
procedure mnuRunParametersClicked(Sender: TObject);
@ -1757,6 +1758,7 @@ begin
MainIDEBar.StopSpeedButton := CreateButton(MainIDEBar.tbViewDebug, 'StopSpeedButton' , 'menu_stop' , @mnuStopProjectClicked, lisHintStop);
MainIDEBar.StepIntoSpeedButton := CreateButton(MainIDEBar.tbViewDebug, 'StepIntoSpeedButton', 'menu_stepinto' , @mnuStepIntoProjectClicked, lisHintStepInto);
MainIDEBar.StepOverSpeedButton := CreateButton(MainIDEBar.tbViewDebug, 'StepOverpeedButton' , 'menu_stepover' , @mnuStepOverProjectClicked, lisHintStepOver);
MainIDEBar.StepOutSpeedButton := CreateButton(MainIDEBar.tbViewDebug, 'StepOutSpeedButton' , 'menu_stepout' , @mnuStepOutProjectClicked, lisHintStepOut);
MainIDEBar.CreatePopupMenus(OwningComponent);
@ -2418,6 +2420,7 @@ begin
itmRunMenuShowExecutionPoint.OnClick := @mnuShowExecutionPointClicked;
itmRunMenuStepInto.OnClick := @mnuStepIntoProjectClicked;
itmRunMenuStepOver.OnClick := @mnuStepOverProjectClicked;
itmRunMenuStepOut.OnClick := @mnuStepOutProjectClicked;
itmRunMenuRunToCursor.OnClick := @mnuRunToCursorProjectClicked;
itmRunMenuStop.Enabled := False;
itmRunMenuStop.OnClick := @mnuStopProjectClicked;
@ -3862,6 +3865,11 @@ begin
DebugBoss.DoStepOverProject;
end;
procedure TMainIDE.mnuStepOutProjectClicked(Sender: TObject);
begin
DebugBoss.DoStepOutProject;
end;
Procedure TMainIDE.mnuRunToCursorProjectClicked(Sender: TObject);
begin
DebugBoss.DoRunToCursor;

View File

@ -71,6 +71,7 @@ type
StopSpeedButton : TToolButton;
StepIntoSpeedButton : TToolButton;
StepOverSpeedButton : TToolButton;
StepOutSpeedButton : TToolButton;
NewUnitFormPopupMenu : TPopupMenu;
NewUFSetDefaultMenuItem: TMenuItem;
@ -255,6 +256,7 @@ type
itmRunMenuShowExecutionPoint: TIDEMenuCommand;
itmRunMenuStepInto: TIDEMenuCommand;
itmRunMenuStepOver: TIDEMenuCommand;
itmRunMenuStepOut: TIDEMenuCommand;
itmRunMenuRunToCursor: TIDEMenuCommand;
itmRunMenuStop: TIDEMenuCommand;
itmRunMenuRunParameters: TIDEMenuCommand;

View File

@ -655,6 +655,7 @@ begin
CreateMenuItem(ParentMI,itmRunMenuShowExecutionPoint,'itmRunMenuShowExecutionPoint',lisMenuShowExecutionPoint,'debugger_show_execution_point');
CreateMenuItem(ParentMI,itmRunMenuStepInto,'itmRunMenuStepInto',lisMenuStepInto,'menu_stepinto');
CreateMenuItem(ParentMI,itmRunMenuStepOver,'itmRunMenuStepOver',lisMenuStepOver,'menu_stepover');
CreateMenuItem(ParentMI,itmRunMenuStepOut,'itmRunMenuStepOut',lisMenuStepOut,'menu_stepout');
CreateMenuItem(ParentMI,itmRunMenuRunToCursor,'itmRunMenuRunToCursor',lisMenuRunToCursor,'menu_run_cursor');
CreateMenuItem(ParentMI,itmRunMenuStop,'itmRunMenuStop',lisMenuStop,'menu_stop');
CreateMenuItem(ParentMI,itmRunMenuRunParameters,'itmRunMenuRunParameters',lisMenuRunParameters, 'menu_run_parameters');
@ -952,6 +953,7 @@ begin
itmRunMenuPause.Command:=GetCommand(ecPause);
itmRunMenuStepInto.Command:=GetCommand(ecStepInto);
itmRunMenuStepOver.Command:=GetCommand(ecStepOver);
itmRunMenuStepOut.Command:=GetCommand(ecStepOut);
itmRunMenuRunToCursor.Command:=GetCommand(ecRunToCursor);
itmRunMenuStop.Command:=GetCommand(ecStopProgram);
itmRunMenuResetDebugger.Command:=GetCommand(ecResetDebugger);

View File

@ -232,6 +232,7 @@ const
ecEvaluate = ecFirstLazarus + 416;
ecAddWatch = ecFirstLazarus + 417;
ecShowExecutionPoint = ecFirstLazarus + 418;
ecStepOut = ecFirstLazarus + 419;
// project menu
ecNewProject = ecFirstLazarus + 500;

View File

@ -7607,6 +7607,32 @@ LazarusResources.Add('menu_stepover','PNG',[
+#174'<'#155#254#141#177'&0E'#184'l'#157#227#249#233'$'#166#167#167#30#221#198
+#255#229#235'7>oE;>'#0#0#0#0'IEND'#174'B`'#130
]);
LazarusResources.Add('menu_stepout','PNG',[
#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#16#0#0#0#16#8#6#0#0#0#31#243#255'a'
+#0#0#0#1'sRGB'#0#174#206#28#233#0#0#0#6'bKGD'#0#255#0#255#0#255#160#189#167
+#147#0#0#0#9'pHYs'#0#0#11#19#0#0#11#19#1#0#154#156#24#0#0#0#7'tIME'#7#218#2
+#14#2#6#28#164#177#158#29#0#0#1#242'IDAT8'#203#149#147';kTA'#24#134#159#153
+'9'#231#236'& (QBP'#17#193'FD'#237#21#4#181#176#20'b%$'#193#206#31#144#248#11
+#20'1^~ED'#172#20','#188#20#137#196#152'tZx!'#130#149'A'#13'F'#179#168'dwg'
+#231#246'Yl'#142#187'k'#18#209#23#6'f'#134#247'}x?'#134'Qtiaa^'#248'Oe'#221
+#135#166'mr'#234#228#233#127#14#207'<'#157'F'#1#188'Xz">8'#154#173':>:B'#240
+#248#232'8s'#232#194#150#225#162#168#240#232#241#195'v'#3#235#26#248#224#177
+#174'A'#136#30#31#28'>:*'#213#190'M'#195#141#250#26#0#214#218#18#208'$'#4'G'
+#237'm'#193#185#225#243#0#196#24'i'#212'/n'#10'0'#198#252#9'h'#16#130#195#218
+'b'#131#233'o'#218#208'@$'#239'1L'#221#158'"'#198'H'#140#177#231'~lt'#140#162
+#168't'#0'-'#215#192'G'#135#170'V'#19' '#128#1#24#29#25#237#9#139#8'"'#130
+#214#186#183#193'rm'#233#139'Rz0W'#9#17#137'J)'#211'=J'#25','#149'R{'#223'j'
+#173#3'V'#127','#15#250#232#25#192#136#136'$!E'#173#140#185'~c'#18#17#217'0'
+#194#196#248#165#222#6#223#215'jT'#242#10'?'#243#207'jv'#241'^'#182#189#127
+#167':'#186#239'DZ7*'#239#189'*['#136#200#239#6#214'Z'#244#200#173'#'#226#130
+#197'G'#143'Ku='#255#238'A6'#253#250#174'>{e'#143'&'#165#148#146'x'#165'4'
+#229#210'Z#'#146':'#13'B'#240#4#237#240':'#195#232#12#163#29'3/'#239'3wg'#215
+'''}u['#14#244#1#9#168#150'#|]Y'#233#0#150'V'#222#179#127#232' &:B'#204#152
+'{5'#195#179'I'#251#205'^n'#237#136'!d)I'#17'B'#160'{'#4#163'U'#7'0'#127#211
+#15#28#159#200#223#28#216'}xh'#241#195'sf'#175'5k'#198#152#162#191#175#31'h'
+#255#149#238#23'('#165#148#194'Z'#219'6'#0#28#27#207'd'#239#199#225'Ukm'#21
+#200#215#127#170'*!['#233#23'Jg/'#196'4'#4#9#139#0#0#0#0'IEND'#174'B`'#130
]);
LazarusResources.Add('menu_stop','PNG',[
#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#16#0#0#0#16#8#6#0#0#0#31#243#255'a'
+#0#0#0#245'IDATx^'#197#147'AJ'#196'P'#16'D'#171#131'x'#7'='#134''''#152#149

View File

@ -90,6 +90,7 @@ menu/menu_search_replace.png
menu/menu_select_all.png
menu/menu_stepinto.png
menu/menu_stepover.png
menu/menu_stepout.png
menu/menu_stop.png
menu/menu_tool_check_lfm.png
menu/menu_tool_dfm_to_lfm.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 626 B