2
0
Эх сурвалжийг харах

SUPPORT_REMOTE improvement

git-svn-id: trunk@28920 -
pierre 10 жил өмнө
parent
commit
e73341550b
1 өөрчлөгдсөн 128 нэмэгдсэн , 21 устгасан
  1. 128 21
      ide/fpdebug.pas

+ 128 - 21
ide/fpdebug.pas

@@ -54,7 +54,10 @@ type
      TBreakNumber : longint;
      FPCBreakErrorNumber : longint;
 {$ifdef SUPPORT_REMOTE}
-     isRemoteDebugging:boolean;
+     isRemoteDebugging,
+     isFirstRemote,
+     isConnectedToRemote,
+     usessh :boolean;
 {$endif SUPPORT_REMOTE}
     constructor Init;
     procedure SetExe(const exefn:string);
@@ -330,6 +333,9 @@ procedure RegisterFPDebugViews;
 
 procedure UpdateDebugViews;
 
+{$ifdef SUPPORT_REMOTE}
+function TransformRemoteString(st : string) : string;
+{$endif SUPPORT_REMOTE}
 
 implementation
 
@@ -339,7 +345,7 @@ uses
 {$ifdef DOS}
   fpusrscr,
 {$endif DOS}
-
+  fpredir,
   App,Strings,
   FVConsts,
   MsgBox,
@@ -350,7 +356,7 @@ uses
   termio,
 {$endif Unix}
   Systems,Globals,
-  FPRegs,
+  FPRegs,FPTools,
   FPVars,FPUtils,FPConst,FPSwitch,
   FPIntf,FPCompil,FPIde,FPHelp,
   Validate,WUtils,Wconsts;
@@ -615,7 +621,8 @@ procedure UpdateDebugViews;
 
   begin
 {$ifdef SUPPORT_REMOTE}
-     if isRemoteDebugging then
+     if assigned(Debugger) and
+        Debugger^.isRemoteDebugging then
        PushStatus(msg_getting_info_on+RemoteMachine);
 {$endif SUPPORT_REMOTE}
      DeskTop^.Lock;
@@ -633,7 +640,8 @@ procedure UpdateDebugViews;
        VectorWindow^.Update;
      DeskTop^.UnLock;
 {$ifdef SUPPORT_REMOTE}
-     if isRemoteDebugging then
+     if assigned(Debugger) and
+        Debugger^.isRemoteDebugging then
        PopStatus;
 {$endif SUPPORT_REMOTE}
   end;
@@ -652,6 +660,9 @@ begin
   switch_to_user:=true;
   GetDir(0,OrigPwd);
   Command('set print object off');
+{$ifdef SUPPORT_REMOTE}
+  isFirstRemote:=true;
+{$endif SUPPORT_REMOTE}
 end;
 
 procedure TDebugController.SetExe(const exefn:string);
@@ -815,18 +826,22 @@ const
   TargetProtocol = 'palmos';
 {$else}
 const
-  TargetProtocol = 'remote';
+  TargetProtocol = 'extended-remote';
 {$endif PALMOSGDB}
 
 {$ifdef SUPPORT_REMOTE}
 var
   S,ErrorStr : string;
+  ErrorVal : longint;
 {$endif SUPPORT_REMOTE}
 begin
   ResetBreakpointsValues;
 {$ifdef SUPPORT_REMOTE}
   NoSwitch:=true;
   isRemoteDebugging:=false;
+  if TargetProtocol<>'extended-remote' then
+    isConnectedToRemote:=false;
+  usessh:=true;
 {$ifndef CROSSGDB}
   If (RemoteMachine<>'') and (RemotePort<>'') then
 {$else CROSSGDB}
@@ -834,7 +849,38 @@ begin
 {$endif CROSSGDB}
     begin
       isRemoteDebugging:=true;
-      S:=RemoteMachine;
+      if UseSsh and not isConnectedToRemote then
+        begin
+          s:=TransformRemoteString(RemoteSshExecCommand);
+          PushStatus(S);
+{$ifdef Unix}
+          error:=0;
+          { return without waiting for the function to end }
+          s:= s+' &';
+          If fpsystem(s)=-1 Then
+           ErrorVal:=fpgeterrno;
+{$else}
+          IDEApp.DoExecute(GetEnv('COMSPEC'),'/C '+s,'','ssh__.out','ssh___.err',exNormal);
+          ErrorVal:=DosError;
+{$endif}
+          PopStatus;
+          // if errorval <> 0 then
+          // AdvMessageBoxRect(var R: TRect; const Msg: String; Params: Pointer; AOptions: longint): Word;
+          AddToolMessage('',#3'Start'#13#3+s+#13#3'returned '+
+            IntToStr(Errorval),0,0);
+
+        end
+      else if not UseSsh then
+        begin
+          s:=TransformRemoteString(RemoteExecCommand);
+          MessageBox(#3'Start in remote'#13#3+s,nil,mfOKbutton);
+        end;
+      if usessh then
+        { we use ssh port redirection }
+        S:='localhost'
+        //S:=TransformRemoteString('$REMOTEMACHINE')
+      else
+        S:=RemoteMachine;
       If pos('@',S)>0 then
         S:=copy(S,pos('@',S)+1,High(S));
       If RemotePort<>'' then
@@ -845,16 +891,19 @@ begin
         S:='localhost:2000';
 {$endif PALMOSGDB}
       PushStatus(msg_connectingto+S);
-      Command('target '+TargetProtocol+' '+S);
+      AddToolMessage('',msg_connectingto+S,0,0);
+      UpdateToolMessages;
+      if not isConnectedToRemote then
+        Command('target '+TargetProtocol+' '+S);
       if Error then
         begin
            ErrorStr:=strpas(GetError);
            ErrorBox(#3'Error in "target '+TargetProtocol+'"'#13#3+ErrorStr,nil);
            PopStatus;
            exit;
-        end;
-      s:=IDEApp.GetRemoteExecString;
-      MessageBox(#3'Start in remote'#13#3+s,nil,mfOKbutton);
+        end
+      else
+        isConnectedToRemote:=true;
       PopStatus;
     end
   else
@@ -910,17 +959,24 @@ begin
     GDBWindow^.Editor^.Lock;
 {$ifdef SUPPORT_REMOTE}
   if isRemoteDebugging then
-  begin
-    inc(init_count);
-    { pass the stop in start code }
-    Command('continue');
-  end else
+    begin
+      inc(init_count);
+      { pass the stop in start code }
+      if isFirstRemote then
+        Command('continue')
+      else
+        Command ('start');
+      isFirstRemote:=false;
+    end
+  else
 {$endif SUPPORT_REMOTE}
-  { Set cwd for debuggee }
-  SetDir(GetRunDir);
-  inherited Run;
-  { Restore cwd for IDE }
-  SetDir(StartupDir);
+    begin
+      { Set cwd for debuggee }
+      SetDir(GetRunDir);
+      inherited Run;
+      { Restore cwd for IDE }
+      SetDir(StartupDir);
+    end;
   DebuggerScreen;
   If assigned(GDBWindow) then
     GDBWindow^.Editor^.UnLock;
@@ -1093,6 +1149,15 @@ procedure TDebugController.Reset;
 var
   old_reset : boolean;
 begin
+{$ifdef SUPPORT_REMOTE}
+  if isConnectedToRemote then
+    begin
+      Command('monitor exit');
+      Command('disconnect');
+      isConnectedToRemote:=false;
+      isFirstRemote:=true;
+    end;
+{$endif SUPPORT_REMOTE}
   inherited Reset;
   { we need to free the executable
     if we want to recompile it }
@@ -3618,6 +3683,48 @@ end;
       inherited done;
     end;
 
+
+
+{$ifdef SUPPORT_REMOTE}
+{****************************************************************************
+                         TransformRemoteString
+****************************************************************************}
+function TransformRemoteString(st : string) : string;
+begin
+  If RemoteConfig<>'' then
+    ReplaceStrI(St,'$CONFIG','-F '+RemoteConfig)
+  else
+    ReplaceStrI(St,'$CONFIG','');
+  If RemoteIdent<>'' then
+    ReplaceStrI(St,'$IDENT','-i '+RemoteIdent)
+  else
+    ReplaceStrI(St,'$IDENT','');
+  If RemotePuttySession<>'' then
+    ReplaceStrI(St,'$PUTTYSESSION','-load '+RemotePuttySession)
+  else
+    ReplaceStrI(St,'$PUTTYSESSION','');
+  ReplaceStrI(St,'$LOCALFILENAME',NameAndExtOf(ExeFile));
+  ReplaceStrI(St,'$LOCALFILE',ExeFile);
+  ReplaceStrI(St,'$REMOTEDIR',RemoteDir);
+  ReplaceStrI(St,'$REMOTEPORT',RemotePort);
+  ReplaceStrI(St,'$REMOTEMACHINE',RemoteMachine);
+  ReplaceStrI(St,'$REMOTEGDBSERVER',maybequoted(remotegdbserver));
+  ReplaceStrI(St,'$REMOTECOPY',maybequoted(RemoteCopy));
+  ReplaceStrI(St,'$REMOTESHELL',maybequoted(RemoteShell));
+  { avoid infinite recursion here !!! }
+  if Pos('$REMOTEEXECCOMMAND',UpcaseSTr(St))>0 then
+    ReplaceStrI(St,'$REMOTEEXECCOMMAND',TransformRemoteString(RemoteExecCommand));
+{$ifdef WINDOWS}
+  ReplaceStrI(St,'$START','start "Shell to remote"');
+  ReplaceStrI(St,'$DOITINBACKGROUND','');
+{$else}
+  ReplaceStrI(St,'$START','');
+  ReplaceStrI(St,'$DOITINBACKGROUND',' &');
+{$endif}
+  TransformRemoteString:=st;
+end;
+{$endif SUPPORT_REMOTE}
+
 {****************************************************************************
                          Init/Final
 ****************************************************************************}