Browse Source

* RestDebugger or multiple running of debugged program now works
+ added DoContToCursor(F4)
* Breakpoints are now inserted correctly (was mainlyy a problem
of directories)

pierre 26 years ago
parent
commit
c99810d589
3 changed files with 149 additions and 28 deletions
  1. 83 11
      ide/text/fpdebug.pas
  2. 13 4
      ide/text/fpide.pas
  3. 53 13
      ide/text/fpmrun.inc

+ 83 - 11
ide/text/fpdebug.pas

@@ -25,6 +25,7 @@ type
      InvalidSourceLine : boolean;
      LastFileName : string;
      LastSource   : PView; {PsourceWindow !! }
+     HiddenStepsCount : longint;
     constructor Init(const exefn:string);
     destructor  Done;
     procedure DoSelectSourceline(const fn:string;line:longint);virtual;
@@ -36,6 +37,9 @@ type
     procedure RemoveBreakpoints;
     procedure DoDebuggerScreen;virtual;
     procedure DoUserScreen;virtual;
+    procedure Reset;virtual;
+    procedure Run;virtual;
+    procedure Continue;virtual;
   end;
 
   BreakpointType = (bt_function,bt_file_line,bt_watch,bt_awatch,bt_rwatch,bt_invalid);
@@ -56,7 +60,7 @@ type
      GDBIndex : longint;
      GDBState : BreakpointState;
      constructor Init_function(Const AFunc : String);
-     constructor Init_file_line(Const AFile : String; ALine : longint);
+     constructor Init_file_line(AFile : String; ALine : longint);
      constructor Init_type(atyp : BreakpointType;Const AFunc : String);
      procedure  Insert;
      procedure  Remove;
@@ -68,6 +72,7 @@ type
   TBreakpointCollection=object(TCollection)
       function  At(Index: Integer): PBreakpoint;
       function  ToggleFileLine(Const FileName: String;LineNr : Longint) : boolean;
+      procedure Update;
       procedure FreeItem(Item: Pointer); virtual;
     end;
 
@@ -83,8 +88,8 @@ implementation
 uses
   Dos,Mouse,Video,
   App,Strings,
-  FPViews,FPVars,FPUtils,FPIntf,
-  FPCompile,FPIde;
+  FPViews,FPVars,FPUtils,FPConst,
+  FPIntf,FPCompile,FPIde;
 
 
 {****************************************************************************
@@ -97,6 +102,8 @@ begin
   inherited Init;
   f := exefn;
   LoadFile(f);
+  SetArgs(GetRunParameters);
+  Debugger:=@self;
   InsertBreakpoints;
 end;
 
@@ -128,6 +135,30 @@ begin
   inherited Done;
 end;
 
+procedure TDebugController.Run;
+begin
+  inherited Run;
+  MyApp.SetCmdState([cmResetDebugger],true);
+end;
+
+procedure TDebugController.Continue;
+begin
+  if not debugger_started then
+    Run;
+  inherited Continue;
+end;
+
+procedure TDebugController.Reset;
+var
+  W : PSourceWindow;
+begin
+  inherited Reset;
+  MyApp.SetCmdState([cmResetDebugger],false);
+  W:=PSourceWindow(LastSource);
+  if assigned(W) then
+     W^.Editor^.SetHighlightRow(-1);
+end;
+
 procedure TDebugController.AnnotateError;
 var errornb : longint;
 begin
@@ -201,8 +232,23 @@ begin
 end;
 
 procedure TDebugController.DoEndSession(code:longint);
+var P :Array[1..2] of longint;
+    W : PSourceWindow;
 begin
-   InformationBox(#3'Program exited with '#13#3'exitcode = %d',@code);
+   MyApp.SetCmdState([cmResetDebugger],false);
+   W:=PSourceWindow(LastSource);
+   if assigned(W) then
+     W^.Editor^.SetHighlightRow(-1);
+   If HiddenStepsCount=0 then
+     InformationBox(#3'Program exited with '#13#3'exitcode = %d',@code)
+   else
+     begin
+        P[1]:=code;
+        P[2]:=HiddenStepsCount;
+        WarningBox(#3'Program exited with '#13+
+                   #3'exitcode = %d'#13+
+                   #3'hidden steps = %d',@P);
+     end;
 end;
 
 
@@ -244,11 +290,17 @@ begin
   Conditions:=nil;
 end;
 
-constructor TBreakpoint.Init_file_line(Const AFile : String; ALine : longint);
+constructor TBreakpoint.Init_file_line(AFile : String; ALine : longint);
 begin
   typ:=bt_file_line;
   state:=bs_enabled;
   GDBState:=bs_deleted;
+  AFile:=NameAndExtOf(AFile);
+  { d:test.pas:12 does not work !! }
+  { I do not know how to solve this if
+  if (Length(AFile)>1) and (AFile[2]=':') then
+    AFile:=Copy(AFile,3,255);
+    Only use base name for now !! PM }
   Name:=NewStr(AFile);
   Line:=ALine;
   IgnoreCount:=0;
@@ -259,7 +311,7 @@ end;
 procedure TBreakpoint.Insert;
 begin
   If not assigned(Debugger) then Exit;
-  
+  Remove;
   Debugger^.last_breakpoint_number:=0;
   if (GDBState=bs_deleted) and (state=bs_enabled) then
     begin
@@ -324,6 +376,7 @@ end;
 
 destructor TBreakpoint.Done;
 begin
+  Remove;
   if assigned(Name) then
     DisposeStr(Name);
   if assigned(Conditions) then
@@ -344,7 +397,17 @@ end;
 
 procedure TBreakpointCollection.FreeItem(Item: Pointer);
 begin
-  if Item<>nil then Dispose(PBreakpoint(Item),Done);
+  if Item<>nil then
+    Dispose(PBreakpoint(Item),Done);
+end;
+
+procedure TBreakpointCollection.Update;
+begin
+  if assigned(Debugger) then
+    begin
+      Debugger^.RemoveBreakpoints;
+      Debugger^.InsertBreakpoints;
+    end;
 end;
 
 function TBreakpointCollection.ToggleFileLine(Const FileName: String;LineNr : Longint) : boolean;
@@ -375,8 +438,10 @@ begin
             ToggleFileLine:=true;
           End;
       end;
+    Update;
 end;
 
+
 {****************************************************************************
                                  Initialize
 ****************************************************************************}
@@ -406,9 +471,10 @@ procedure DoneDebugger;
 begin
   if assigned(Debugger) then
    dispose(Debugger,Done);
-   If Use_gdb_file then
-     Close(GDB_file);
-   Use_gdb_file:=false;
+  Debugger:=nil;
+  If Use_gdb_file then
+    Close(GDB_file);
+  Use_gdb_file:=false;
 end;
 
 begin
@@ -417,7 +483,13 @@ end.
 
 {
   $Log$
-  Revision 1.8  1999-02-05 17:21:52  pierre
+  Revision 1.9  1999-02-08 17:43:43  pierre
+    * RestDebugger or multiple running of debugged program now works
+    + added DoContToCursor(F4)
+    * Breakpoints are now inserted correctly (was mainlyy a problem
+      of directories)
+
+  Revision 1.8  1999/02/05 17:21:52  pierre
     Invalid_line renamed InvalidSourceLine
 
   Revision 1.7  1999/02/05 13:08:41  pierre

+ 13 - 4
ide/text/fpide.pas

@@ -51,6 +51,7 @@ type
       procedure DoTraceInto;
       procedure DoRun;
       procedure DoResetDebugger;
+      procedure DoContToCursor;
       procedure Target;
       procedure PrimaryFile_;
       procedure ClearPrimary;
@@ -184,9 +185,10 @@ begin
       NewItem('~R~un','Ctrl+F9', kbCtrlF9, cmRun, hcRun,
       NewItem('~S~tep over','F8', kbF8, cmStepOver, hcRun,
       NewItem('~T~race into','F7', kbF7, cmTraceInto, hcRun,
+      NewItem('~G~oto Cursor','F4', kbF4, cmContToCursor, hcContToCursor,
       NewItem('P~a~rameters...','', kbNoKey, cmParameters, hcParameters,
       NewItem('~P~rogram reset','Ctrl+F2', kbCtrlF2, cmResetDebugger, hcResetDebugger,
-      nil)))))),
+      nil))))))),
     NewSubMenu('~C~ompile',hcCompileMenu, NewMenu(
       NewItem('~C~ompile','Alt+F9', kbAltF9, cmCompile, hcCompile,
       NewItem('~M~ake','F9', kbF9, cmMake, hcMake,
@@ -338,7 +340,7 @@ begin
              cmTraceInto     : DoTraceInto;
              cmRun           : DoRun;
              cmResetDebugger : DoResetDebugger;
-
+             cmContToCursor  : DoContToCursor;
            { -- Compile menu -- }
              cmCompile       : DoCompile(cCompile);
              cmBuild         : DoCompile(cBuild);
@@ -451,7 +453,7 @@ begin
     WriteShellMsg;
 
   SwapVectors;
-  Exec(GetEnv('COMSPEC'),'/C '+ProgramPath+' '+Params);
+  Dos.Exec(GetEnv('COMSPEC'),'/C '+ProgramPath+' '+Params);
   SwapVectors;
 
   ShowIDEScreen;
@@ -463,6 +465,7 @@ begin
   SetCmdState([cmSaveAll],IsThereAnyEditor);
   SetCmdState([cmCloseAll,cmTile,cmCascade,cmWindowList],IsThereAnyWindow);
   SetCmdState([cmFindProcedure,cmObjects,cmModules,cmGlobals{,cmInformation}],IsSymbolInfoAvailable);
+  SetCmdState([cmResetDebugger],assigned(debugger) and debugger^.debugger_started);
   UpdatePrimaryFile;
   UpdateINIFile;
   Message(MenuBar,evBroadcast,cmUpdate,nil);
@@ -644,7 +647,13 @@ end;
 END.
 {
   $Log$
-  Revision 1.11  1999-02-08 10:37:44  peter
+  Revision 1.12  1999-02-08 17:43:44  pierre
+    * RestDebugger or multiple running of debugged program now works
+    + added DoContToCursor(F4)
+    * Breakpoints are now inserted correctly (was mainlyy a problem
+      of directories)
+
+  Revision 1.11  1999/02/08 10:37:44  peter
     + html helpviewer
 
   Revision 1.7  1999/02/04 13:32:03  pierre

+ 53 - 13
ide/text/fpmrun.inc

@@ -22,14 +22,18 @@ begin
      InitDebugger;
      if not assigned(Debugger) then
       exit;
-     Debugger^.StartTrace;
-   end
+   end;
+  if not debugger^.debugger_started then
+    Debugger^.StartTrace
   else
-   Debugger^.TraceNext;
+    Debugger^.TraceNext;
   While (Debugger^.InvalidSourceLine and
-    Debugger^.Debugger_started and
-    not Debugger^.error) do
-   Debugger^.TraceNext;
+         Debugger^.Debugger_started and
+         not Debugger^.error) do
+    begin
+      Inc(Debugger^.HiddenStepsCount);
+      Debugger^.TraceNext;
+    end;
   Debugger^.AnnotateError;
 end;
 
@@ -40,17 +44,21 @@ begin
    begin
      InitDebugger;
      if not assigned(Debugger) then
-      exit;
-     Debugger^.StartTrace;
-   end
+       exit;
+   end;
+  if not debugger^.debugger_started then
+    Debugger^.StartTrace
   else
    Debugger^.TraceStep;
   { I think we should not try to go deeper !
     if the source is not found PM }
   While (Debugger^.InvalidSourceLine and
-        Debugger^.Debugger_started and
-        not Debugger^.error) do
-   Debugger^.TraceStep;
+         Debugger^.Debugger_started and
+         not Debugger^.error) do
+    begin
+      Inc(Debugger^.HiddenStepsCount);
+      Debugger^.TraceNext;
+    end;
   Debugger^.AnnotateError;
 end;
 
@@ -113,6 +121,32 @@ procedure TIDEApp.DoResetDebugger;
 begin
   if assigned(Debugger) then
      DoneDebugger;
+  UpdateScreen(true);
+end;
+
+procedure TIDEApp.DoContToCursor;
+var
+  W : PSourceWindow;
+  FileName : string;
+  LineNr : longint;
+begin
+  if not assigned(DeskTop^.First) or
+     (TypeOf(DeskTop^.First^)<>TypeOf(TSourceWindow)) then
+    Begin
+       ErrorBox('Impossible to reach current cursor',nil);
+       Exit;
+    End;
+    
+  W:=PSourceWindow(DeskTop^.First);
+  If assigned(W) then
+    begin
+      FileName:=W^.Editor^.FileName;
+      LineNr:=W^.Editor^.CurPos.Y+1;
+      If not assigned(Debugger) then
+        InitDebugger;
+      Debugger^.Command('tbreak '+NameAndExtOf(FileName)+':'+IntToStr(LineNr));
+      Debugger^.Continue;
+    end;
 end;
 
 procedure TIDEApp.DoToggleBreak;
@@ -149,7 +183,13 @@ end;
 
 {
   $Log$
-  Revision 1.9  1999-02-05 17:21:53  pierre
+  Revision 1.10  1999-02-08 17:43:45  pierre
+    * RestDebugger or multiple running of debugged program now works
+    + added DoContToCursor(F4)
+    * Breakpoints are now inserted correctly (was mainlyy a problem
+      of directories)
+
+  Revision 1.9  1999/02/05 17:21:53  pierre
     Invalid_line renamed InvalidSourceLine
 
   Revision 1.8  1999/02/04 17:56:17  pierre