Index: src/main/java/org/apache/kato/tools/jdi/KatoReader.java =================================================================== --- src/main/java/org/apache/kato/tools/jdi/KatoReader.java (revision 813366) +++ src/main/java/org/apache/kato/tools/jdi/KatoReader.java (working copy) @@ -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,28 +1865,28 @@ 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{ logr.log(JDILogger.LEVEL_VERYVERBOSE, " (N)" + jClass.getName() + "." + jMethod.getName() + ":" + line); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ @@ -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 vctr = new Vector(); 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 vctr = new Vector(); + Vector jcls = new Vector(); + 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{ Index: src/main/java/org/apache/kato/tools/jdi/JDIController.java =================================================================== --- src/main/java/org/apache/kato/tools/jdi/JDIController.java (revision 813366) +++ src/main/java/org/apache/kato/tools/jdi/JDIController.java (working copy) @@ -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){} }