*
*/
public class PHPDBGInterface {
-
public boolean sessionEnded = false;
public int sessType = -1;
public int BPUnderHit = 0;
/**
*
- * @param mod_name The module (source file) to which we add the breakpoint.
- * @param line The line where the breakpoint is set.
- * @return Breakpoint ID ???.
+ * @param mod_name The module (source file) to which we add the breakpoint.
+ * @param line The line where the breakpoint is set.
+ * @param hitCount The number of hit counts before suspend.
+ * @param condition The break condition
+ * @return Breakpoint ID ???.
*/
- public int addBreakpoint (String mod_name, int line) throws IOException {
- return setBreakpoint (mod_name, "", line, PHPDBGBase.BPS_ENABLED + PHPDBGBase.BPS_UNRESOLVED, 0, 0, 0, 0, 0);
+ public int addBreakpoint (String mod_name, int line, int hitCount, String condition) throws IOException {
+ return setBreakpoint (mod_name, condition, line, PHPDBGBase.BPS_ENABLED + PHPDBGBase.BPS_UNRESOLVED, 0, hitCount, 0, 0, 0);
}
/**
PHPDBGPacket DBGPacket;
PHPDBGFrame DBGFrame1;
PHPDBGFrame DBGFrame2;
+ PHPDBGFrame DBGFrame3;
int modNo;
-
+
DBGPacket = new PHPDBGPacket (PHPDBGBase.DBGA_REQUEST);
DBGFrame1 = new PHPDBGFrame (PHPDBGBase.FRAME_BPS);
DBGFrame2 = new PHPDBGFrame (PHPDBGBase.FRAME_RAWDATA);
+ DBGFrame3 = new PHPDBGFrame (PHPDBGBase.FRAME_RAWDATA);
modNo = getModByName (mod_name); // Get the module ID by name
DBGFrame1.addInt (rawCounter); // ID of FRAME_RAWDATA to send file name
}
- DBGFrame1.addInt (state); // state BPS_*
- DBGFrame1.addInt (istemp); // istep
- DBGFrame1.addInt (hitcount); // hit count
- DBGFrame1.addInt (skiphits); // skip hits
- DBGFrame1.addInt (0); // ID of condition
- DBGFrame1.addInt (bpno); // breakpoint number
- DBGFrame1.addInt (isunderhit); // is under hit
-
if (modNo < 0) { // Did we find a module ID for the module name?
DBGFrame2.addInt (rawCounter); // FRAME_RAWDATA ID
DBGFrame2.addInt (mod_name.length() + 1); // length of rawdata (+ null char)
DBGPacket.addFrame (DBGFrame2); // First add file name data
}
+ DBGFrame1.addInt (state); // state BPS_*
+ DBGFrame1.addInt (istemp); // istemp
+ DBGFrame1.addInt (0); // hit count; this is not supported as one might think
+ DBGFrame1.addInt (hitcount); // skip hits is what we think is hit count.
+
+ if (!condition.equals ("")) { // Do we have a condition for breakpoint
+ rawCounter++; // Set to new ID
+ DBGFrame1.addInt (rawCounter); // ID of condition
+
+ DBGFrame3.addInt (rawCounter); // FRAME_RAWDATA ID
+ DBGFrame3.addInt (condition.length() + 1); // length of rawdata (+ null char)
+ DBGFrame3.addString (condition); // The break condition
+ DBGFrame3.addChar ('\0'); // null char
+
+ DBGPacket.addFrame (DBGFrame3); // First add break condition
+ }
+ else {
+ DBGFrame1.addInt (0); // ID of condition is 0, because there is no condition
+ }
+
+
+ DBGFrame1.addInt (bpno); // breakpoint number
+ DBGFrame1.addInt (isunderhit); // is under hit
+
DBGPacket.addFrame (DBGFrame1); // Second add command data
if (proxy.getSocket ().isClosed ()) { // Can we communiate with DBG?
toRead = PHPDBGBase.Char4ToInt (framesInfo, nextFrame + 4); // The size of the string
+ if ((int) framesInfo[nextFrame + 8 + toRead - 1] == 0) { // Is there a string termination at the end?
+ return String.copyValueOf (framesInfo, nextFrame + 8, toRead - 1); // Then copy frame content to String without the \0 and return
+ }
+
return String.copyValueOf (framesInfo, nextFrame + 8, toRead); // Copy frame content to String and return
}
break;
for (n = 0; n < stackListOld.size (); n++) { // For all StackFrames in the StackFrame list
stackFrameOld = (PHPStackFrame) stackListOld.get (n); //
- if (stackFrameNew.getDescription ().equals (stackFrameOld.getDescription ())) { // Did we find the sent stackframe within the list of old stackframes?
+ if (stackFrameNew.getDescription ().equals (stackFrameOld.getDescription ()) &&
+ stackFrameNew.getLineNumber() == stackFrameOld.getLineNumber()) {// Did we find the sent stackframe within the list of old stackframes?
stackFrameOld.setLineNumber (stackFrameNew.getLineNumber ());
stackFrameOld.setIndex (stackFrameNew.getIndex ());
for (i = 0; i < stackList.size (); i++) { // For all stackList entries
stackFrameNew = (PHPStackFrame) stackList.get (i);
- if (stackFrameNew.getDescription ().equals (stackFrameOld.getDescription ())) { // Did we find the sent stackframe within the list of old stackframes?
+ if (stackFrameNew.getDescription ().equals (stackFrameOld.getDescription ()) &&
+ stackFrameNew.getLineNumber() == stackFrameOld.getLineNumber()) {// Did we find the sent stackframe within the list of old stackframes?
break; // Yes, then break;
}
}
return 0; // We did not read enough bytes, error
}
}
-
+
nextFrame = 0; // Start with the first frame
while (nextFrame < bytesToRead) { // As long as we have something within this block
fileName = new String (getRawFrameData (entirePack, dbg_src_tree_tmp[3])); // Get the filename
- if (fileName.length () > 0) { // If we have a filename
- fileName = fileName.substring (0, fileName.length () - 1); // Remove '\0' char
- }
-
if (dbg_src_tree_tmp[2] != 0) { // If there is a module number
PHPDBGMod modNew;
error += ": ";
error += new String (getRawFrameData (entirePack, dbg_error_tmp[1])); // Add the error string for this error message ID
-
- if (error.length () > 0) { // If we have a error message
- error = error.substring (0, error.length () - 1); // Remove '\0' char
- }
-
error += "\n"; // Append a CR
PHPDebugCorePlugin.log (new DebugException (new Status (IStatus.WARNING,
fileName = new String (getRawFrameData (entirePack, dbg_bpl_new[2]));
- if (fileName.length () > 0) { // If we have filename
- fileName = fileName.substring (0, fileName.length () - 1); // Remove '\0' char
- }
-
if (dbg_bpl_new[0] != 0) {
PHPDBGMod modNew;