/** * The test checks ClassType.SetValues command for field of Debuggee class with value which has * other referenceType than field to set. The test expects the field should not be set. */ public void testSetValues002() { String thisTestName = "testSetValues002"; logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START..."); synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY); CommandPacket classesBySignatureCommand = new CommandPacket( JDWPCommands.VirtualMachineCommandSet.CommandSetID, JDWPCommands.VirtualMachineCommandSet.ClassesBySignatureCommand); classesBySignatureCommand.setNextValueAsString(debuggeeSignature); ReplyPacket classesBySignatureReply = debuggeeWrapper.vmMirror.performCommand(classesBySignatureCommand); classesBySignatureCommand = null; checkReplyPacket(classesBySignatureReply, "VirtualMachine::ClassesBySignature command"); classesBySignatureReply.getNextValueAsInt(); // Number of returned reference types - is NOt used here classesBySignatureReply.getNextValueAsByte(); // refTypeTag of class - is NOt used here long refTypeID = classesBySignatureReply.getNextValueAsReferenceTypeID(); classesBySignatureReply = null; logWriter.println("=> Debuggee class = " + getDebuggeeClassName()); logWriter.println("=> referenceTypeID for Debuggee class = " + refTypeID); String checkedFieldNames[] = { "SetValues002DebuggeeObject", "objectField", }; long checkedFieldIDs[] = checkFields(refTypeID, checkedFieldNames); int checkedFieldsNumber = checkedFieldNames.length; logWriter.println( "=> Send ReferenceType::GetValues command and get ObjectID for value to set..."); CommandPacket getValuesCommand = new CommandPacket( JDWPCommands.ReferenceTypeCommandSet.CommandSetID, JDWPCommands.ReferenceTypeCommandSet.GetValuesCommand); getValuesCommand.setNextValueAsReferenceTypeID(refTypeID); getValuesCommand.setNextValueAsInt(1); getValuesCommand.setNextValueAsFieldID(checkedFieldIDs[0]); ReplyPacket getValuesReply = debuggeeWrapper.vmMirror.performCommand(getValuesCommand); getValuesCommand = null; checkReplyPacket(getValuesReply, "ReferenceType::GetValues command"); int returnedValuesNumber = getValuesReply.getNextValueAsInt(); logWriter.println("=> Returned values number = " + returnedValuesNumber); assertEquals( "ReferenceType::GetValues returned invalid values number,", 1, returnedValuesNumber); Value objectFieldValueToSet = getValuesReply.getNextValueAsValue(); byte objectFieldValueToSetTag = objectFieldValueToSet.getTag(); logWriter.println( "=> Returned field value tag for checked object= " + objectFieldValueToSetTag + "(" + JDWPConstants.Tag.getName(objectFieldValueToSetTag) + ")"); assertEquals( "ReferenceType::GetValues returned invalid value tag,", JDWPConstants.Tag.OBJECT_TAG, objectFieldValueToSetTag, JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG), JDWPConstants.Tag.getName(objectFieldValueToSetTag)); long objectFieldID = objectFieldValueToSet.getLongValue(); logWriter.println("=> Returned ObjectID = " + objectFieldID); logWriter.println( "=> CHECK: send " + thisCommandName + " for Debuggee class with value which has other referenceType than field to set..."); CommandPacket checkedCommand = new CommandPacket( JDWPCommands.ClassTypeCommandSet.CommandSetID, JDWPCommands.ClassTypeCommandSet.SetValuesCommand); checkedCommand.setNextValueAsClassID(refTypeID); checkedCommand.setNextValueAsInt(checkedFieldsNumber - 1); int fieldIndex = 1; for (; fieldIndex < checkedFieldsNumber; fieldIndex++) { checkedCommand.setNextValueAsFieldID(checkedFieldIDs[fieldIndex]); switch (fieldIndex) { case 1: // objectField checkedCommand.setNextValueAsObjectID(objectFieldID); break; } } ReplyPacket checkedReply = debuggeeWrapper.vmMirror.performCommand(checkedCommand); checkedCommand = null; short errorCode = checkedReply.getErrorCode(); if (errorCode == JDWPConstants.Error.NONE) { logWriter.println("=> " + thisCommandName + " run without any ERROR!"); } else { logWriter.println( "=> " + thisCommandName + " returns ERROR = " + errorCode + "(" + JDWPConstants.Error.getName(errorCode) + ")"); } logWriter.println("=> Wait for Debuggee's status about check for set field..."); synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); boolean debuggeeStatus = synchronizer.receiveMessage("PASSED"); if (!debuggeeStatus) { logWriter.println("## " + thisTestName + ": Debuggee returned status FAILED"); fail("Debuggee returned status FAILED"); } else { logWriter.println("=> " + thisTestName + ": Debuggee returned status PASSED"); } logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": OK"); }
/** * This testcase exercises ThreadReference.SuspendCount command. <br> * At first the test starts SuspendCountDebuggee which starts and runs some tested threads. <br> * After the tested threads starts, the test suspends every tested thread in debuggee some times * and check that ThreadReference.SuspendCount command returns expected number of times thread was * suspended. <br> * Then the test suspends all debuggee by VirtualMachine.Suspend command and check that * ThreadReference.SuspendCount command returns 1 value for all tested threads and main thread. * <br> * Then the test resumes all debuggee by VirtualMachine.Resume command and check that * ThreadReference.SuspendCount command returns 0 value for all tested threads and main thread. */ public void testSuspendCount001() { logWriter.println("==> testSuspendCount001: START..."); String debuggeeMessage = synchronizer.receiveMessage(); int testedThreadsNumber = 0; try { testedThreadsNumber = Integer.valueOf(debuggeeMessage).intValue(); } catch (NumberFormatException exception) { logWriter.println( "## FAILURE: Exception while getting number of started threads from debuggee = " + exception); synchronizer.sendMessage("FINISH"); printErrorAndFail("Can NOT get number of started threads from debuggee! "); } if (testedThreadsNumber == 0) { logWriter.println( "==> There are no started threads in debuggee to test" + " - testSuspendCount001 finishes!"); synchronizer.sendMessage("FINISH"); return; } logWriter.println( "==> Number of started threads in debuggee to test = " + testedThreadsNumber); String[] testedThreadsNames = new String[testedThreadsNumber + 1]; // +1 is for main debuggee thread long[] testedThreadsIDs = new long[testedThreadsNumber + 1]; for (int i = 0; i < testedThreadsNumber; i++) { testedThreadsNames[i] = SuspendCountDebuggee.THREAD_NAME_PATTERN + i; testedThreadsIDs[i] = 0; } // getting ID of the tested thread ReplyPacket allThreadIDReply = null; try { allThreadIDReply = debuggeeWrapper.vmMirror.getAllThreadID(); } catch (ReplyErrorCodeException exception) { logWriter.println("## FAILURE: Exception in vmMirror.getAllThreadID() = " + exception); synchronizer.sendMessage("FINISH"); printErrorAndFail("Can NOT get all ThreadID in debuggee! "); } int threads = allThreadIDReply.getNextValueAsInt(); logWriter.println("==> Number of all threads in debuggee = " + threads); String[] allThreadsNames = new String[threads]; long[] allThreadsIDs = new long[threads]; boolean suspendCommandFailed = false; boolean suspendCountCommandFailed = false; boolean resumeCommandFailed = false; int suspendNumber = 0; for (int i = 0; i < threads; i++) { long threadID = allThreadIDReply.getNextValueAsThreadID(); allThreadsIDs[i] = threadID; String threadName = null; try { threadName = debuggeeWrapper.vmMirror.getThreadName(threadID); } catch (ReplyErrorCodeException exception) { logWriter.println("==> WARNING: Can NOT get thread name for threadID = " + threadID); continue; } allThreadsNames[i] = threadName; int k = 0; for (; k < testedThreadsNumber; k++) { if (threadName.equals(testedThreadsNames[k])) { testedThreadsIDs[k] = threadID; break; } } if (k == testedThreadsNumber) { // it is not thread to test continue; } logWriter.println( "\n==> Check for Thread: threadID = " + threadID + "; threadName = " + threadName); logWriter.println("==> Send ThreadReference.SuspendCount command..."); CommandPacket packet = new CommandPacket( JDWPCommands.ThreadReferenceCommandSet.CommandSetID, JDWPCommands.ThreadReferenceCommandSet.SuspendCountCommand); packet.setNextValueAsThreadID(threadID); ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet); if (!checkReplyPacketWithoutFail(reply, "ThreadReference.SuspendCount command")) { suspendCountCommandFailed = true; } else { int suspendCount = reply.getNextValueAsInt(); logWriter.println( "==> ThreadReference.SuspendCount command returns suspendCount = " + suspendCount); if (suspendCount != 0) { logWriter.println("## FAILURE: Unexpected suspendCount for thread = " + threadName); logWriter.println("## Expected suspendCount = 0"); suspendCountCommandFailed = true; } } suspendNumber++; logWriter.println( "==> Send ThreadReference.Suspend command number of times = " + suspendNumber + "..."); int j = 0; for (; j < suspendNumber; j++) { packet = new CommandPacket( JDWPCommands.ThreadReferenceCommandSet.CommandSetID, JDWPCommands.ThreadReferenceCommandSet.SuspendCommand); packet.setNextValueAsThreadID(threadID); reply = debuggeeWrapper.vmMirror.performCommand(packet); if (!checkReplyPacketWithoutFail(reply, "ThreadReference.Suspend command")) { break; } } if (j < suspendNumber) { suspendCommandFailed = true; continue; } logWriter.println("==> Send ThreadReference.SuspendCount command..."); packet = new CommandPacket( JDWPCommands.ThreadReferenceCommandSet.CommandSetID, JDWPCommands.ThreadReferenceCommandSet.SuspendCountCommand); packet.setNextValueAsThreadID(threadID); reply = debuggeeWrapper.vmMirror.performCommand(packet); if (!checkReplyPacketWithoutFail(reply, "ThreadReference.SuspendCount command")) { suspendCountCommandFailed = true; } else { int suspendCount = reply.getNextValueAsInt(); logWriter.println( "==> ThreadReference.SuspendCount command returns suspendCount = " + suspendCount); if (suspendCount != suspendNumber) { logWriter.println("## FAILURE: Unexpected suspendCount for thread = " + threadName); logWriter.println("## Expected suspendCount = " + suspendNumber); suspendCountCommandFailed = true; } } logWriter.println("==> Send ThreadReference.Resume command..."); packet = new CommandPacket( JDWPCommands.ThreadReferenceCommandSet.CommandSetID, JDWPCommands.ThreadReferenceCommandSet.ResumeCommand); packet.setNextValueAsThreadID(threadID); reply = debuggeeWrapper.vmMirror.performCommand(packet); if (!checkReplyPacketWithoutFail(reply, "ThreadReference.Resume command")) { resumeCommandFailed = true; } logWriter.println("==> Send ThreadReference.SuspendCount command..."); packet = new CommandPacket( JDWPCommands.ThreadReferenceCommandSet.CommandSetID, JDWPCommands.ThreadReferenceCommandSet.SuspendCountCommand); packet.setNextValueAsThreadID(threadID); reply = debuggeeWrapper.vmMirror.performCommand(packet); if (!checkReplyPacketWithoutFail(reply, "ThreadReference.SuspendCount command")) { suspendCountCommandFailed = true; } else { int suspendCount = reply.getNextValueAsInt(); logWriter.println( "==> ThreadReference.SuspendCount command returns suspendCount = " + suspendCount); if (suspendCount != (suspendNumber - 1)) { logWriter.println("## FAILURE: Unexpected suspendCount for thread = " + threadName); logWriter.println("## Expected suspendCount = " + (suspendNumber - 1)); suspendCountCommandFailed = true; } } if (suspendNumber == 1) { continue; } logWriter.println( "==> Send ThreadReference.Resume command number of times = " + (suspendNumber - 1) + "..."); j = 0; for (; j < (suspendNumber - 1); j++) { packet = new CommandPacket( JDWPCommands.ThreadReferenceCommandSet.CommandSetID, JDWPCommands.ThreadReferenceCommandSet.ResumeCommand); packet.setNextValueAsThreadID(threadID); reply = debuggeeWrapper.vmMirror.performCommand(packet); if (!checkReplyPacketWithoutFail(reply, "ThreadReference.Resume command")) { break; } } if (j < (suspendNumber - 1)) { resumeCommandFailed = true; continue; } logWriter.println("==> Send ThreadReference.SuspendCount command..."); packet = new CommandPacket( JDWPCommands.ThreadReferenceCommandSet.CommandSetID, JDWPCommands.ThreadReferenceCommandSet.SuspendCountCommand); packet.setNextValueAsThreadID(threadID); reply = debuggeeWrapper.vmMirror.performCommand(packet); if (!checkReplyPacketWithoutFail(reply, "ThreadReference.SuspendCount command")) { suspendCountCommandFailed = true; continue; } int suspendCount = reply.getNextValueAsInt(); logWriter.println( "==> ThreadReference.SuspendCount command returns suspendCount = " + suspendCount); if (suspendCount != 0) { logWriter.println("## FAILURE: Unexpected suspendCount for thread = " + threadName); logWriter.println("## Expected suspendCount = 0"); suspendCountCommandFailed = true; } } String errorMessage = ""; if (suspendCountCommandFailed) { errorMessage = errorMessage + "## Error found out while ThreadReference.SuspendCount command performing!\n"; } if (suspendCommandFailed) { errorMessage = errorMessage + "## Error found out while ThreadReference.Suspend command performing!\n"; } if (resumeCommandFailed) { errorMessage = errorMessage + "## Error found out while ThreadReference.Resume command performing!\n"; } boolean testedThreadNotFound = false; for (int i = 0; i < testedThreadsNumber; i++) { if (testedThreadsIDs[i] == 0) { logWriter.println("## FAILURE: Tested thread is not found out among debuggee threads!"); logWriter.println("## Thread name = " + testedThreadsNames[i]); testedThreadNotFound = true; } } if (testedThreadNotFound) { errorMessage = errorMessage + "## Some of tested threads are not found!\n"; } if (!errorMessage.equals("")) { synchronizer.sendMessage("FINISH"); printErrorAndFail("\ntestSuspendCount001 FAILED:\n" + errorMessage); } synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); logWriter.println( "\n==> Check ThreadReference.SuspendCount command when all debuggee is suspended..."); testedThreadsNames[testedThreadsNumber] = synchronizer.receiveMessage(); // debuggee main thread name testedThreadsIDs[testedThreadsNumber] = 0; // debuggee main thread ID for (int i = 0; i < threads; i++) { if (testedThreadsNames[testedThreadsNumber].equals(allThreadsNames[i])) { testedThreadsIDs[testedThreadsNumber] = allThreadsIDs[i]; break; } } if (testedThreadsIDs[testedThreadsNumber] == 0) { setStaticIntField(debuggeeSignature, SuspendCountDebuggee.TO_FINISH_DEBUGGEE_FIELD_NAME, 99); logWriter.println( "## FAILURE: Debuggee main thread is not found out among debuggee threads!"); logWriter.println("## Thread name = " + testedThreadsNames[testedThreadsNumber]); printErrorAndFail("\nCan NOT found out debuggee main thread!"); } logWriter.println("\n==> Send VirtualMachine.Suspend command..."); CommandPacket packet = new CommandPacket( JDWPCommands.VirtualMachineCommandSet.CommandSetID, JDWPCommands.VirtualMachineCommandSet.SuspendCommand); ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet); int errorCode = reply.getErrorCode(); if (errorCode != JDWPConstants.Error.NONE) { setStaticIntField(debuggeeSignature, SuspendCountDebuggee.TO_FINISH_DEBUGGEE_FIELD_NAME, 99); logWriter.println( "## FAILURE: VirtualMachine.Suspend command returns error = " + errorCode + "(" + JDWPConstants.Error.getName(errorCode) + ")"); printErrorAndFail("\nVirtualMachine.Suspend command FAILED!"); } for (int i = 0; i < (testedThreadsNumber + 1); i++) { logWriter.println( "==> Send ThreadReference.SuspendCount command for thread = " + testedThreadsNames[i] + " ..."); packet = new CommandPacket( JDWPCommands.ThreadReferenceCommandSet.CommandSetID, JDWPCommands.ThreadReferenceCommandSet.SuspendCountCommand); packet.setNextValueAsThreadID(testedThreadsIDs[i]); reply = debuggeeWrapper.vmMirror.performCommand(packet); if (!checkReplyPacketWithoutFail(reply, "ThreadReference.SuspendCount command")) { suspendCountCommandFailed = true; continue; } int suspendCount = reply.getNextValueAsInt(); logWriter.println( "==> ThreadReference.SuspendCount command returns suspendCount = " + suspendCount); if (suspendCount != 1) { logWriter.println( "## FAILURE: Unexpected suspendCount for thread = " + testedThreadsNames[i]); logWriter.println("## Expected suspendCount = 1"); suspendCountCommandFailed = true; } } logWriter.println("\n==> Send VirtualMachine.Resume command ..."); packet = new CommandPacket( JDWPCommands.VirtualMachineCommandSet.CommandSetID, JDWPCommands.VirtualMachineCommandSet.ResumeCommand); reply = debuggeeWrapper.vmMirror.performCommand(packet); if (!checkReplyPacketWithoutFail(reply, "VirtualMachine.Resume command")) { resumeCommandFailed = true; } else { logWriter.println( "\n==> Check ThreadReference.SuspendCount command after debuggee is resumed..."); for (int i = 0; i < (testedThreadsNumber + 1); i++) { logWriter.println( "==> Send ThreadReference.SuspendCount command for thread = " + testedThreadsNames[i] + " ..."); packet = new CommandPacket( JDWPCommands.ThreadReferenceCommandSet.CommandSetID, JDWPCommands.ThreadReferenceCommandSet.SuspendCountCommand); packet.setNextValueAsThreadID(testedThreadsIDs[i]); reply = debuggeeWrapper.vmMirror.performCommand(packet); if (!checkReplyPacketWithoutFail(reply, "ThreadReference.SuspendCount command")) { suspendCountCommandFailed = true; continue; } int suspendCount = reply.getNextValueAsInt(); logWriter.println( "==> ThreadReference.SuspendCount command returns suspendCount = " + suspendCount); if (suspendCount != 0) { logWriter.println( "## FAILURE: Unexpected suspendCount for thread = " + testedThreadsNames[i]); logWriter.println("## Expected suspendCount = 0"); suspendCountCommandFailed = true; } } } setStaticIntField(debuggeeSignature, SuspendCountDebuggee.TO_FINISH_DEBUGGEE_FIELD_NAME, 99); if (suspendCountCommandFailed) { errorMessage = "## Error found out while ThreadReference.SuspendCount command performing!\n"; } if (resumeCommandFailed) { errorMessage = "## Error found out while VirtualMachine.Resume command performing!\n"; } if (!errorMessage.equals("")) { printErrorAndFail("\ntestSuspendCount001 FAILED:\n" + errorMessage); } logWriter.println("\n==> testSuspendCount001 - OK!"); }
/** * This testcase exercises StackFrame.PopFrames command when thread is not suspended. <br> * The test starts PopFramesDebuggee class, sets a breakpoint in 'nestledMethod4', stops at * breakpoint and prints stack. <br> * Then the test performs ClassType.InvokeMethodCommand without waiting reply, and waits to ensure * that method was started. <br> * During working of method the test performs StackFrame.PopFrames command. Then the test checks * that StackFrame.PopFrames command returns error: THREAD_NOT_SUSPENDED or INVALID_FRAMEID. <br> * Next, the test receives reply from invoked method and resumes debuggee.. */ public void testPopFramesWithInvokeMethods() { logWriter.println("==> testPopFramesWithInvokeMethods started"); // check capability, relevant for this test logWriter.println("=> Check capability: canPopFrames"); debuggeeWrapper.vmMirror.capabilities(); boolean isCapability = debuggeeWrapper.vmMirror.targetVMCapabilities.canPopFrames; if (!isCapability) { logWriter.println("##WARNING: this VM doesn't possess capability: canPopFrames"); return; } synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY); // find checked method long refTypeID = getClassIDBySignature(debuggeeSignature); logWriter.println("=> Debuggee class = " + getDebuggeeClassName()); logWriter.println("=> Set breakpoint at the beginning of " + breakpointMethodName); long requestID = debuggeeWrapper.vmMirror.setBreakpointAtMethodBegin(refTypeID, breakpointMethodName); // release debuggee synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); // receive event logWriter.println("=> Wait for breakpoint in " + breakpointMethodName); long breakpointThreadID = debuggeeWrapper.vmMirror.waitForBreakpoint(requestID); logWriter.println("=> breakpointThreadID = " + breakpointThreadID); // print stack frames logWriter.println(""); logWriter.println("=> Get frames before PopFrames command, thread = " + breakpointThreadID); FrameInfo[] frameInfos = jdwpGetFrames(breakpointThreadID, 0, -1); printStackFrame(frameInfos.length, frameInfos); logWriter.println("=> Number of frames before command: " + frameInfos.length); // find frameID to pop logWriter.println(""); logWriter.println("=> Find frameID of method = " + methodToPop + " for PopFrames command"); long frameID = 0; long methodID = getMethodID(refTypeID, methodToPop); boolean isMethodFound = false; for (int j = 0; j < frameInfos.length; j++) { if (frameInfos[j].location.methodID == methodID) { frameID = frameInfos[j].getFrameID(); isMethodFound = true; break; } } if (!isMethodFound) { logWriter.println("##FAILURE: there is no frame for checked method"); fail("There is no frame for checked method"); } logWriter.println("=> frameID for PopFrames command = " + frameID); // create JDWP command for MethodInvoke with a long running method long debuggeeRefTypeID = debuggeeWrapper.vmMirror.getClassID(debuggeeSignature); logWriter.println( "=> Find toInvokeMethodID for method: " + PopFramesDebuggee.METHOD_TO_INVOKE_NAME); long toInvokeMethodID = debuggeeWrapper.vmMirror.getMethodID( debuggeeRefTypeID, PopFramesDebuggee.METHOD_TO_INVOKE_NAME); if (toInvokeMethodID == -1) { logWriter.println( "## FAILURE: Can NOT get toInvokeMethodID for method: " + PopFramesDebuggee.METHOD_TO_INVOKE_NAME); fail("## Can NOT get toInvokeMethodID"); } logWriter.println("=> toInvokeMethodID = " + toInvokeMethodID); int invokeCommandID = 0; CommandPacket invokeCommand = new CommandPacket( JDWPCommands.ClassTypeCommandSet.CommandSetID, JDWPCommands.ClassTypeCommandSet.InvokeMethodCommand); invokeCommand.setNextValueAsClassID(debuggeeRefTypeID); invokeCommand.setNextValueAsThreadID(breakpointThreadID); invokeCommand.setNextValueAsMethodID(toInvokeMethodID); invokeCommand.setNextValueAsInt(1); // args number invokeCommand.setNextValueAsValue(new Value(timeOfMethodInvocation)); invokeCommand.setNextValueAsInt(JDWPConstants.InvokeOptions.INVOKE_SINGLE_THREADED); // send MethodInvoke command, but not wait for reply try { logWriter.println( "=> Send InvokeMethod command for method: " + PopFramesDebuggee.METHOD_TO_INVOKE_NAME); invokeCommandID = debuggeeWrapper.vmMirror.sendCommand(invokeCommand); } catch (Exception e) { logWriter.println("Exception during invokeCommand: " + e); throw new TestErrorException(e); } // wait to ensure that method invocation started logWriter.println("=> Wait " + timeoutToWait + " mls to ensure that method invocation started"); Object waitObj = new Object(); synchronized (waitObj) { try { waitObj.wait(timeoutToWait); } catch (InterruptedException e) { logWriter.println("##Exception while waiting on object: " + e); throw new TestErrorException(e); } } // perform PopFrame command logWriter.println( "=> Perform PopFrames command for method = " + methodToPop + " with frameID = " + frameID + " and expect errors"); CommandPacket popFramesCommand = new CommandPacket( JDWPCommands.StackFrameCommandSet.CommandSetID, JDWPCommands.StackFrameCommandSet.PopFramesCommand); popFramesCommand.setNextValueAsThreadID(breakpointThreadID); popFramesCommand.setNextValueAsFrameID(frameID); ReplyPacket popFrameReply = debuggeeWrapper.vmMirror.performCommand(popFramesCommand); int res = popFrameReply.getErrorCode(); logWriter.println( "=> Returned error code: " + res + " (" + JDWPConstants.Error.getName(res) + ")"); // check that PopFrames returns error, because thread is resumed by // InvokeMethod if (res == JDWPConstants.Error.NONE) { logWriter.println("##PopFrames command returned no error for thread resumed by InvokeMethod"); fail("##PopFrames command returned no error for thread resumed by InvokeMethod"); } logWriter.println( "=> Receive reply of invoked method: " + PopFramesDebuggee.METHOD_TO_INVOKE_NAME); try { ReplyPacket reply = debuggeeWrapper.vmMirror.receiveReply(invokeCommandID); checkReplyPacket(reply, "ClassType::InvokeMethod command"); } catch (Exception e) { logWriter.println("##Exception while receiving reply for invoke command: " + e); throw new TestErrorException(e); } logWriter.println("=> Resume debuggee"); debuggeeWrapper.vmMirror.resume(); synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY); synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); logWriter.println("==> TEST testPopFramesWithInvokeMethods PASSED"); }