You are viewing a plain text version of this content. The canonical link for it is here.
Posted to kato-commits@incubator.apache.org by mo...@apache.org on 2009/09/18 16:02:26 UTC

svn commit: r816691 - in /incubator/kato/trunk/org.apache.kato/kato.jdi/src/main/java/org/apache/kato/tools/jdi: JDIController.java KatoReader.java

Author: monteith
Date: Fri Sep 18 16:02:26 2009
New Revision: 816691

URL: http://svn.apache.org/viewvc?rev=816691&view=rev
Log:
Commit changes from KATO-11 submitted by Paul Sobek.

Modified:
    incubator/kato/trunk/org.apache.kato/kato.jdi/src/main/java/org/apache/kato/tools/jdi/JDIController.java
    incubator/kato/trunk/org.apache.kato/kato.jdi/src/main/java/org/apache/kato/tools/jdi/KatoReader.java

Modified: incubator/kato/trunk/org.apache.kato/kato.jdi/src/main/java/org/apache/kato/tools/jdi/JDIController.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/org.apache.kato/kato.jdi/src/main/java/org/apache/kato/tools/jdi/JDIController.java?rev=816691&r1=816690&r2=816691&view=diff
==============================================================================
--- incubator/kato/trunk/org.apache.kato/kato.jdi/src/main/java/org/apache/kato/tools/jdi/JDIController.java (original)
+++ incubator/kato/trunk/org.apache.kato/kato.jdi/src/main/java/org/apache/kato/tools/jdi/JDIController.java Fri Sep 18 16:02:26 2009
@@ -12,8 +12,16 @@
  * limitations under the License.
  ******************************************************************************/
 package org.apache.kato.tools.jdi;
-public class JDIController {
+import java.util.concurrent.CountDownLatch;
 
+public class JDIController {
+	
+	private static CountDownLatch readyToGo;
+	
+	public static void jdbLaunch(String args[], CountDownLatch readyToGo){
+		JDIController.readyToGo = readyToGo;
+		JDIController.main(args);
+	}
 
 	public static void main(String args[]){
 		long baselineMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
@@ -94,6 +102,7 @@
 		JDWPServer svr = null;
 		try{
 			svr = new JDWPServer(JDILogger.logger, port);
+			if (readyToGo!=null)svr.setTerminateLastClient(true);
 		}catch(Exception exxy){
 			System.err.println("Unrecoverable error:"); //$NON-NLS-1$
 			exxy.printStackTrace();
@@ -154,6 +163,10 @@
 		
 		memory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
 		chsr.commit();
+		// Notify jdb connector if it is listening...
+		if (readyToGo != null){
+			readyToGo.countDown();
+		}
 		logr.log(JDILogger.LEVEL_VERBOSE, "Goodbye! (Uptime: " + (System.currentTimeMillis() - time) + "ms) (" + (memory - baselineMemory) + "B used)"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		try{Thread.sleep(5000);}catch(Exception exxy){}
 	}

Modified: incubator/kato/trunk/org.apache.kato/kato.jdi/src/main/java/org/apache/kato/tools/jdi/KatoReader.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/org.apache.kato/kato.jdi/src/main/java/org/apache/kato/tools/jdi/KatoReader.java?rev=816691&r1=816690&r2=816691&view=diff
==============================================================================
--- incubator/kato/trunk/org.apache.kato/kato.jdi/src/main/java/org/apache/kato/tools/jdi/KatoReader.java (original)
+++ incubator/kato/trunk/org.apache.kato/kato.jdi/src/main/java/org/apache/kato/tools/jdi/KatoReader.java Fri Sep 18 16:02:26 2009
@@ -100,6 +100,7 @@
 	private JDILogger logr;
 	public static final int ERROR_NONE = 0;
 	public static final int ERROR_INVALID_OBJECT = 20;
+	public static final int ERROR_INVALID_CLASS = 21;
 	public static final int ERROR_INVALID_THREAD = 10;
 	public static final int ERROR_INVALID_SLOT = 35;
 	public static final int ERROR_NOT_IMPLEMENTED = 99;
@@ -376,6 +377,8 @@
 					return eventRequest(cpckt);
 				case COMMANDSET_STACK_FRAME:
 					return stackFrame(cpckt);
+				case COMMANDSET_CLASS_LOADER_REFERENCE:
+					return classLoaderRef(cpckt);
 				// Added for jdb
 				case COMMANDSET_THREAD_GROUP_REFERENCE:
 					return threadGroupReference(cpckt);
@@ -1862,27 +1865,27 @@
 											int highest = findHighestLineRef(refType, methodID) + 1;
 											logr.log(JDILogger.LEVEL_VERYVERBOSE, "  (L)" + jClass.getName() + "." + jMethod.getName() + ":" + lowest + "<" + line + ">" + highest); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
 											
-											//Code index start
-											addLongToVector(vctr, lowest);
-											//Code index end
-											addLongToVector(vctr, highest);
-											//Number of lines
-											addIntToVector(vctr, highest - lowest);
-											for(int i = lowest; i <= highest; i++){
-												addLongToVector(vctr, i);
-												addIntToVector(vctr, i);
-											}
-											
 //											//Code index start
-//											addLongToVector(vctr, 0);
+//											addLongToVector(vctr, lowest);
 //											//Code index end
-//											addLongToVector(vctr, 99999999); // TODO go through local variable tables looking for highest reference?
+//											addLongToVector(vctr, highest);
 //											//Number of lines
-//											addIntToVector(vctr, 1);
-//											//for(int i = lowest; i <= highest; i++){
-//												addLongToVector(vctr, jLocation.getAddress().getAddress()-1);
-//												addIntToVector(vctr, jLocation.getLineNumber());
-//											//}
+//											addIntToVector(vctr, highest - lowest);
+//											for(int i = lowest; i <= highest; i++){
+//												addLongToVector(vctr, i);
+//												addIntToVector(vctr, i);
+//											}
+											
+											//Code index start
+											addLongToVector(vctr, 0);
+											//Code index end
+											addLongToVector(vctr, 99999999); // TODO go through local variable tables looking for highest reference?
+											//Number of lines
+											addIntToVector(vctr, 1);
+											//for(int i = lowest; i <= highest; i++){
+												addLongToVector(vctr, jLocation.getAddress().getAddress()-1);
+												addIntToVector(vctr, jLocation.getLineNumber());
+											//}
 											
 											
 										}else{
@@ -1964,6 +1967,7 @@
 										
 										for (Object nextVar : vars) {
 											if (nextVar instanceof CorruptData) {
+												logr.log(JDILogger.LEVEL_VERYVERBOSE, "Corrupt local variable data");
 												continue;
 											}
 
@@ -2376,6 +2380,7 @@
 				if (objectMap.containsKey(object)){
 					logr.log(JDILogger.LEVEL_VERYVERBOSE, "  O:" + fieldID); //$NON-NLS-1$
 					if (!getFieldFromObject(vctr, object, fieldID)){
+						logr.log(JDILogger.LEVEL_VERYVERBOSE, "  O:" + fieldID+" Invalid Object/Field"); //$NON-NLS-1$
 						ReplyPacket rpckt = new ReplyPacket(cpckt.getSequence(), FLAG_REPLY_PACKET, ERROR_INVALID_OBJECT);
 						return rpckt;
 
@@ -2384,6 +2389,7 @@
 				}else{
 					logr.log(JDILogger.LEVEL_VERYVERBOSE, "  C:" + fieldID); //$NON-NLS-1$
 					if (!getFieldFromClass(vctr, object, fieldID)){
+						logr.log(JDILogger.LEVEL_VERYVERBOSE, "  O:" + fieldID+" Invalid Object/Field"); //$NON-NLS-1$
 						ReplyPacket rpckt = new ReplyPacket(cpckt.getSequence(), FLAG_REPLY_PACKET, ERROR_INVALID_OBJECT);
 						return rpckt;
 					}
@@ -3211,6 +3217,7 @@
 			logr.log(JDILogger.LEVEL_VERYVERBOSE, "Set("+eventKind+","+suspendPolicy+","+modifiers+", ...)"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 			for (int i = 0; i < modifiers; i++){
 				int modKind = inData[6 + (6*i)];
+				logr.log(JDILogger.LEVEL_VERYVERBOSE, "Set(Modkind"+modKind+")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 				if (modKind == 5){
 					String classPattern = getStringFromBytes(inData, 6 + (6*i) + 1);
 					logr.log(JDILogger.LEVEL_VERYVERBOSE, "ClassMatch(\"" + classPattern + "\")"); //$NON-NLS-1$ //$NON-NLS-2$
@@ -3220,7 +3227,14 @@
 
 
 			}
-			ReplyPacket rpckt = new ReplyPacket(cpckt.getSequence(), FLAG_REPLY_PACKET, ERROR_NONE);
+			ReplyPacket rpckt;
+			if (eventKind == 8){
+				rpckt = new ReplyPacket(cpckt.getSequence(), FLAG_REPLY_PACKET, ERROR_INVALID_CLASS);
+				return rpckt;
+			}else{
+				
+			}
+			rpckt = new ReplyPacket(cpckt.getSequence(), FLAG_REPLY_PACKET, ERROR_NONE);
 			Vector<Byte> vctr = new Vector<Byte>();
 			addIntToVector(vctr, LAST_ID++);
 			rpckt.setData(vectorToByte(vctr));
@@ -3315,7 +3329,7 @@
 													addCharToVector(vctr, charVal);
 													break;
 												case TAG_OBJECT:
-													long objectAddress = -1L;
+													long objectAddress = 0L;
 													byte typeTag = (byte)TAG_OBJECT;
 													
 													if (value instanceof JavaObject) {
@@ -3466,7 +3480,7 @@
 											} else {
 												Object value = jFrame.getVariable(0);
 												long objectAddress = 0;
-												if (value instanceof JavaObject) {
+												if (value != null  && value instanceof JavaObject) {
 													JavaObject obj = (JavaObject) value;														
 													objectAddress = obj.getID().getAddress();																																															
 												}
@@ -3494,6 +3508,61 @@
 		return rpckt;
 
 	}
+	
+	private byte getRefTypeTag(JavaClass jcl){
+		byte refTypeTag = 1;
+		try {
+			if (jcl.isArray()){
+				refTypeTag = 3;
+			}else if(isInterface(jcl.getID().getAddress())){
+				refTypeTag = 2;
+			}
+		} catch (CorruptDataException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return refTypeTag;
+	}
+	
+	private ReplyPacket classLoaderRef(CommandPacket cpckt) throws Exception{
+		if (cpckt.getCommand() == 1){
+			byte []inData = cpckt.getByteData();
+			long classLoaderID = createLongFromBytes(inData, 0, 8);
+			logr.log(JDILogger.LEVEL_VERBOSE, "VisibleClasses(" + classLoaderID + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			int count = 0;
+			Vector<Byte> vctr = new Vector<Byte>();
+			Vector<JavaClassLoader> jcls = new Vector<JavaClassLoader>();
+			for (JavaClass jc: classes.values()){
+				JavaObject obj;
+				if ((obj = jc.getClassLoader().getObject()) != null){
+					if (obj.getID().getAddress() == classLoaderID){
+						jcls.add(jc.getClassLoader());
+						jc = jc.getClassLoader().getObject().getJavaClass();
+						while (jc.getClassLoader()!= null){
+							jcls.add(jc.getClassLoader());
+							jc = jc.getClassLoader().getObject().getJavaClass();
+						}
+						break;
+					}
+				}
+			}
+			
+			for (JavaClass jc: classes.values()){
+				for (JavaClassLoader jcl : jcls){
+					if (jc.getClassLoader() == jcl){
+						vctr.add(getRefTypeTag(jc));
+						addLongToVector(vctr, jc.getID().getAddress());
+						count++;
+					}
+				}
+			}
+			addIntToVectorFront(vctr, count);
+			ReplyPacket rpckt = new ReplyPacket(cpckt.getSequence(), FLAG_REPLY_PACKET, ERROR_NONE);
+			rpckt.setData(vectorToByte(vctr));
+			return rpckt;
+		}
+		return null;
+	}
 
 	private ReplyPacket threadGroupReference(CommandPacket cpckt) throws Exception{