Browse Source

* bug with Toggle Break fixed, hopefully
+ search for local vars in parent procs avoiding
wrong results (see test.pas source)

pierre 25 years ago
parent
commit
919bed76f0
1 changed files with 72 additions and 14 deletions
  1. 72 14
      ide/text/fpdebug.pas

+ 72 - 14
ide/text/fpdebug.pas

@@ -877,9 +877,8 @@ begin
   { 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 }
-  FileName:=NewStr(GDBFileName(NameAndExtOf(AFile)));
+    AFile:=Copy(AFile,3,255);        }
+  FileName:=NewStr(GDBFileName(AFile));
   Name:=nil;
   Line:=ALine;
   IgnoreCount:=0;
@@ -1091,7 +1090,8 @@ procedure TBreakpointCollection.ShowBreakpoints(W : PSourceWindow);
 
   procedure SetInSource(P : PBreakpoint);{$ifndef FPC}far;{$endif}
   begin
-    If assigned(P^.FileName) and (P^.FileName^=NameAndExtOf(W^.Editor^.FileName)) then
+    If assigned(P^.FileName) and
+      (GDBFileName(FExpand(P^.FileName^))=GDBFileName(FExpand(W^.Editor^.FileName))) then
       W^.Editor^.SetLineBreakState(P^.Line,P^.state=bs_enabled);
   end;
 
@@ -1844,23 +1844,74 @@ procedure TWatch.rename(s : string);
   end;
 
 procedure TWatch.Get_new_value;
-  var p,q : pchar;
-      i : longint;
-      last_removed : boolean;
+  var p, q : pchar;
+      i, j, curframe, startframe : longint;
+      error : integer;
+      c : char;
+      s,s2 : string;
+      loop_higher, found, last_removed : boolean;
+
+    function GetValue(var s : string) : boolean;
+      begin
+        Debugger^.command('p '+s);
+        if not Debugger^.Error then
+          begin
+            s:=StrPas(Debugger^.GetOutput);
+            GetValue:=true;
+          end
+        else
+          begin
+            s:=StrPas(Debugger^.GetError);
+            GetValue:=false;
+            { do not open a messagebox for such errors }
+            Debugger^.got_error:=false;
+          end;
+      end;
+
   begin
     If not assigned(Debugger) then
       exit;
     if assigned(last_value) then
       strdispose(last_value);
     last_value:=current_value;
-    Debugger^.Command('p '+GetStr(expr));
-    if Debugger^.Error then
-      p:=StrNew(Debugger^.GetError)
+    s:=GetStr(expr);
+    found:=GetValue(s);
+    Debugger^.got_error:=false;
+    loop_higher:=not found;
+    curframe:=Debugger^.get_current_frame;
+    startframe:=curframe;
+    while loop_higher do
+      begin
+         s:='parent_ebp';
+         if GetValue(s) then
+           begin
+             repeat
+               inc(curframe);
+               if not Debugger^.set_current_frame(curframe) then
+                 loop_higher:=false;
+               s2:='/x $ebp';
+               getValue(s2);
+               j:=pos('=',s2);
+               if j>0 then
+                 s2:=copy(s2,j+1,length(s2));
+               while s2[1] in [' ',TAB] do
+                 delete(s2,1,1);
+               if pos(s2,s)>0 then
+                 loop_higher :=false;
+             until not loop_higher;
+             { try again at that level }
+             s:=GetStr(expr);
+             loop_higher:=not GetValue(s);
+           end
+         else
+           loop_higher:=false;
+      end;
+    s:=GetStr(expr);
+    if GetValue(s) then
+      p:=StrNew(Debugger^.GetOutput)
     else
-      p:=StrNew(Debugger^.GetOutput);
-    { do not open a messagebox for such errors }
+      p:=StrNew(Debugger^.GetError);
     Debugger^.got_error:=false;
-
     { We should try here to find the expr in parent
       procedure if there are
       I will implement this as I added a
@@ -1869,6 +1920,8 @@ procedure TWatch.Get_new_value;
     { But there are some pitfalls like
       locals redefined in other sublocals that call the function }
 
+    Debugger^.set_current_frame(startframe);
+
     q:=nil;
     if assigned(p) and (p[0]='$') then
       q:=StrPos(p,'=');
@@ -3145,7 +3198,12 @@ end.
 
 {
   $Log$
-  Revision 1.49  2000-02-04 23:18:05  pierre
+  Revision 1.50  2000-02-05 01:27:58  pierre
+    * bug with Toggle Break fixed, hopefully
+    + search for local vars in parent procs avoiding
+      wrong results (see test.pas source)
+
+  Revision 1.49  2000/02/04 23:18:05  pierre
    * no pushstatus in DoneDebugger because its called after App.done
 
   Revision 1.48  2000/02/04 14:34:46  pierre