Contributors:
IBM Corporation - Initial implementation
Vicente Fernando - www.alfersoft.com.ar
+ Christian Perkonig - remote debug
**********************************************************************/
package net.sourceforge.phpdt.internal.debug.core;
import java.io.OutputStream;
import java.net.Socket;
import java.net.ServerSocket;
+import java.net.SocketTimeoutException;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IBreakpoint;
private PHPThread PHPMainThread;
private PHPDBGProxy thisProxy= null;
private int port;
+ private boolean remote;
+ private IPath remoteSourcePath;
public PHPDBGProxy() {
thisProxy= this;
}
+ public PHPDBGProxy(boolean remote,String remoteSourcePath) {
+ thisProxy= this;
+ this.remote=remote;
+ this.remoteSourcePath= new Path(remoteSourcePath);
+ }
+
public void start() {
createServerSocket();
this.startPHPLoop();
public void stop() {
phpLoop.setShouldStop();
if(DBGInt != null) DBGInt.setShouldStop();
- try {
- getDebugTarget().getProcess().terminate();
- } catch (DebugException e) {
- e.printStackTrace();
+ if (!remote) {
+ try {
+ getDebugTarget().getProcess().terminate();
+ } catch (DebugException e) {
+ e.printStackTrace();
+ }
}
phpLoop.notifyWait();
}
}
protected void createServerSocket() {
- port = SocketUtil.findUnusedLocalPort("localhost", 10001, 10101);
+// port = SocketUtil.findUnusedLocalPort("localhost", 10001, 10101);
+ port = 10001;
if (port == -1) {
PHPDebugCorePlugin.log(5, "Cannot find free port!!!!");
return;
}
return reader;
}
+
+ public BufferedReader getReader(Socket socket) throws IOException {
+ if (socket != null)
+ return new BufferedReader(new InputStreamReader(socket.getInputStream(), "ISO8859_1"));
+ else
+ return null;
+ }
public OutputStream getOutputStream() throws IOException {
return this.getSocket().getOutputStream();
try {
PHPLineBreakpoint phpLBP;
if(breakpoint.getModelIdentifier() == PHPDebugCorePlugin.getDefault().getDescriptor().getUniqueIdentifier()) {
+ IPath filename;
phpLBP= (PHPLineBreakpoint)breakpoint;
- bpNo= DBGInt.addBreakpoint(phpLBP.getMarker().getResource().getLocation().toOSString(), phpLBP.getLineNumber());
+ // bpNo= DBGInt.addBreakpoint(phpLBP.getMarker().getResource().getLocation().toOSString(), phpLBP.getLineNumber());
+ if (remote)
+ filename=remoteSourcePath.append(phpLBP.getMarker().getResource().getProjectRelativePath());
+ else
+ filename=phpLBP.getMarker().getResource().getLocation();
+ bpNo= DBGInt.addBreakpoint(filename.toOSString(), phpLBP.getLineNumber());
phpLBP.setDBGBpNo(bpNo);
}
} catch (IOException e) {
PHPLineBreakpoint phpLBP;
if(breakpoint.getModelIdentifier() == PHPDebugCorePlugin.getDefault().getDescriptor().getUniqueIdentifier()) {
phpLBP= (PHPLineBreakpoint)breakpoint;
- DBGInt.removeBreakpoint(phpLBP.getMarker().getResource().getLocation().toOSString(), phpLBP.getLineNumber(), phpLBP.getDBGBpNo());
+ IPath filename;
+ if (remote)
+ filename=remoteSourcePath.append(phpLBP.getMarker().getResource().getProjectRelativePath());
+ else
+ filename=phpLBP.getMarker().getResource().getLocation();
+// bpNo= DBGInt.addBreakpoint(filename.toOSString(), phpLBP.getLineNumber());
+ DBGInt.removeBreakpoint(filename.toOSString(), phpLBP.getLineNumber(), phpLBP.getDBGBpNo());
}
} catch (IOException e) {
PHPDebugCorePlugin.log(e);
stop();
}
}
+
+ public void phpLoopNotify (){
+ phpLoop.notifyWait();
+ }
public void startPHPLoop() {
phpLoop = new PHPLoop();
try {
char[] buf= new char[16];
int i, pos, timeout;
- long interval= 1000*20;
+ long interval= 200; // 200ms
String line;
PHPStackFrame[] StackList;
+ boolean endFile=false;
+ boolean newconnect=false;
+ Socket newSocket=null;
+ PHPDBGInterface newDBGInt;
+ int sid=-1;
- //System.out.println("Waiting for breakpoints.");
- try{
- socket = server.accept();
- //System.out.println("Accepted! : " + socket.toString());
- } catch (IOException e) {
- PHPDebugCorePlugin.log(e);
- return;
- }
+// synchronized (this) {
+// wait();
+// }
- PHPMainThread= new PHPThread(getDebugTarget(), getPort());
+ PHPMainThread = new PHPThread(getDebugTarget(), getPort());
PHPMainThread.setName("Thread [main]");
- timeout= 0;
- while((getDebugTarget() == null) && (timeout < 100)) {
- sleep(100);
- timeout++;
- }
+ timeout = 0;
+
+// while ((getDebugTarget() == null) && (timeout < 100)) {
+// sleep(100);
+// timeout++;
+// }
// Be sure debug target is set
- PHPMainThread.setDebugTarget(getDebugTarget());
+// PHPMainThread.setDebugTarget(getDebugTarget());
getDebugTarget().addThread(PHPMainThread);
- setDBGInterface(new PHPDBGInterface(getReader(), getOutputStream(), thisProxy));
-
- DBGInt.waitResponse(1000);
- DBGInt.flushAllPackets();
-
- // Check version and session ID
- setBreakPoints();
- DBGInt.continueExecution();
-
- while (!shouldStop) {
- DBGInt.waitResponse(interval);
- DBGInt.flushAllPackets();
-
- if (DBGInt.BPUnderHit != 0) {
- StackList= DBGInt.getStackList();
- if(StackList.length > 0) {
- for(i=0; i < StackList.length; i++) {
- StackList[i].setThread(PHPMainThread);
- if(DBGInt.getModByNo(StackList[i].getModNo()).equals("")) {
- DBGInt.getSourceTree();
- }
- StackList[i].setFile(DBGInt.getModByNo(StackList[i].getModNo()));
+
+ //System.out.println("Waiting for breakpoints.");
+ while (!shouldStop)
+ {
+ newconnect=true;
+ try {
+ newSocket = server.accept();
+ //System.out.println("Accepted! : " + socket.toString());
+ } catch (SocketTimeoutException e) {
+ // no one wants to connect
+ newconnect=false;
+ } catch (IOException e) {
+ PHPDebugCorePlugin.log(e);
+ return;
+ }
+
+ if (newconnect)
+ {
+ if (DBGInt==null)
+ server.setSoTimeout(1);
+ newDBGInt= new PHPDBGInterface(getReader(newSocket), newSocket.getOutputStream(), thisProxy);
+ newDBGInt.waitResponse(1000);
+ newDBGInt.flushAllPackets();
+ // Check version and session ID
+ if ((DBGInt==null) || (DBGInt.getSID()==newDBGInt.getSID()))
+ {
+ DBGInt=newDBGInt;
+ try {
+ closeSocket();
+ } catch (IOException e) {
+ PHPDebugCorePlugin.log(e);
+ shouldStop=true;
}
- PHPMainThread.setStackFrames(StackList);
- }
- // Fire debug event
- PHPMainThread.suspend();
-
- synchronized(this) {
- wait();
- }
- }
- if(PHPMainThread.isTerminated() || getDebugTarget().getProcess().isTerminated()) break;
+ socket=newSocket;
+ setBreakPoints();
+ DBGInt.continueExecution();
+ } else
+ {
+ newDBGInt.continueExecution();
+ newSocket.close();
+ }
+ }
+
+ if(DBGInt.waitResponse(interval))
+ {
+
+ DBGInt.flushAllPackets();
+
+ if (DBGInt.BPUnderHit != 0) {
+ StackList = DBGInt.getStackList();
+ if (StackList.length > 0) {
+ for (i = 0; i < StackList.length; i++) {
+ StackList[i].setThread(PHPMainThread);
+ if (DBGInt.getModByNo(StackList[i].getModNo()).equals("")) {
+ DBGInt.getSourceTree();
+ }
+ StackList[i].setFile(
+ DBGInt.getModByNo(StackList[i].getModNo()));
+ }
+ PHPMainThread.setStackFrames(StackList);
+ }
+ // Fire debug event
+ PHPMainThread.suspend();
+
+ synchronized (this) {
+ wait();
+ }
+ }
+ }
+ if (remote) {
+ if (PHPMainThread.isTerminated())
+ {
+ shouldStop=true;
+ break;
+ }
+ } else {
+ if (PHPMainThread.isTerminated() || getDebugTarget().getProcess().isTerminated())
+ {
+ shouldStop=true;
+ break;
+ }
+ }
}
- } catch (Exception ex) {
- PHPDebugCorePlugin.log(ex);
- System.out.println(ex);
- } finally {
- try {
- getDebugTarget().terminate();
- closeSocket();
- closeServerSocket();
- } catch (IOException e) {
- PHPDebugCorePlugin.log(e);
- return;
- }
- //System.out.println("Socket loop finished.");
- }
+ }
+ catch (Exception ex) {
+ PHPDebugCorePlugin.log(ex);
+ System.out.println(ex);
+ }
+ finally {
+ try {
+ getDebugTarget().terminate();
+ closeSocket();
+ closeServerSocket();
+ }
+ catch (IOException e) {
+ PHPDebugCorePlugin.log(e);
+ return;
+ }
+ //System.out.println("Socket loop finished.");
+ }
}
}
}