diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/JavaEditorOperator.java b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/JavaEditorOperator.java index 2c45d96..55780c9 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/JavaEditorOperator.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/JavaEditorOperator.java @@ -105,7 +105,12 @@ ClassNotLoadedException, InvocationException, IncompatibleThreadStateException { String declaringClassName = ((StringReference)meCaller.callInstanceMethod("getDeclaringClassName")).value(); declaringClassName = declaringClassName.replace(".", ""); - String projectPath = getLoaderPath(meCaller, meCaller.getVm().mirrorOf(declaringClassName)); + return findIType(meCaller, declaringClassName); + } + + public IType findIType(JDIInstanceMethodCaller mc, String declaringClassName) throws InvalidTypeException, + ClassNotLoadedException, InvocationException, IncompatibleThreadStateException{ + String projectPath = getLoaderPath(mc, mc.getVm().mirrorOf(declaringClassName)); IType type = null; if (projectPath != null) { IJavaProject javaProject = findJavaProject(projectPath); @@ -117,7 +122,7 @@ } } } - return type; + return type; } private String getLoaderPath(JDIInstanceMethodCaller meCaller, StringReference declaringClassName) @@ -125,7 +130,7 @@ ObjectReference getInstance = (ObjectReference)meCaller.callStaticMethod(TRACE, "TraceJSON", "getInstance"); JDIInstanceMethodCaller traceInstanceCaller = new JDIInstanceMethodCaller(meCaller.getVm(), meCaller.getThread(), getInstance); ObjectReference classInfo = (ObjectReference)traceInstanceCaller.callInstanceMethod("getClassInfo", declaringClassName); - if (classInfo == null) { + if (classInfo == null && meCaller.getReceiver() != null) { declaringClassName = (StringReference)meCaller.callInstanceMethod("getThisClassName"); classInfo = (ObjectReference)traceInstanceCaller.callInstanceMethod("getClassInfo", declaringClassName); } diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/Variables.java b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/Variables.java index b8f14b2..c7776de 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/Variables.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/Variables.java @@ -4,6 +4,8 @@ import java.util.Arrays; import java.util.List; +import org.eclipse.jdt.core.Flags; +import org.eclipse.jdt.core.IField; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; @@ -126,28 +128,33 @@ private void getFieldsState(VirtualMachine vm, ThreadReference thread, VariableData thisObjData, Value tp, String indent) throws InvalidTypeException, ClassNotLoadedException, InvocationException, IncompatibleThreadStateException { // �t�B�[���h��ID��Type���擾���ĕ\�� - List classes = vm.classesByName(thisObjData.getClassName()); - ClassType type = (ClassType)classes.get(0); JDIInstanceMethodCaller mc = new JDIInstanceMethodCaller(vm, thread, null); ObjectReference trace = (ObjectReference)mc.callStaticMethod(TRACER, "TraceJSON", "getInstance"); - for (Field field : type.allFields()) { - if (field.isStatic()) continue; // static�t�B�[���h�͔�΂� (��낤�Ƃ��Ă��AID��Type�����Ȃ�) - String fieldName = field.declaringType().name() + "." + field.name(); // ���S����N���X�� - - // ���̃t�B�[���h�ɂ‚��Ă̍ŐV�̍X�V�����擾(FieldUpdate) - mc.changeReceiver(trace); - ObjectReference fieldUpdate = (ObjectReference)mc.callInstanceMethod("getRecentlyFieldUpdate", vm.mirrorOf(thisObjData.getId()), vm.mirrorOf(fieldName), tp); - if (fieldUpdate == null) continue; - - // �t�B�[���h��ID��Type���擾(String) - mc.changeReceiver(fieldUpdate); - String fieldObjId = ((StringReference)mc.callInstanceMethod("getValueObjId")).value(); - String fieldType = ((StringReference)mc.callInstanceMethod("getValueClassName")).value(); - VariableData fieldData = new VariableData(fieldName, fieldType, fieldObjId); - thisObjData.addChild(fieldData); + JavaEditorOperator javaEditorOperator = new JavaEditorOperator(); + String declaringClassName = thisObjData.getClassName(); + IType type = javaEditorOperator.findIType(new JDIInstanceMethodCaller(vm, thread, null), declaringClassName); + try { + for (IField field : type.getFields()) { + if (Flags.isStatic(field.getFlags())) continue; + String fieldName = field.getDeclaringType().getElementName() + "." + field.getElementName(); // ���S����N���X�� - // �擾�����t�B�[���h���I�u�W�F�N�g��z��̏ꍇ�ɁA���̃I�u�W�F�N�g��z�񂪎��ƒt�B�[���h�ɂ‚��Ă̏������s�� - callDeepHierarchyFieldState(vm, thread, fieldData, tp, (indent + " ")); + // ���̃t�B�[���h�ɂ‚��Ă̍ŐV�̍X�V�����擾(FieldUpdate) + mc.changeReceiver(trace); + ObjectReference fieldUpdate = (ObjectReference)mc.callInstanceMethod("getRecentlyFieldUpdate", vm.mirrorOf(thisObjData.getId()), vm.mirrorOf(fieldName), tp); + if (fieldUpdate == null) continue; + + // �t�B�[���h��ID��Type���擾(String) + mc.changeReceiver(fieldUpdate); + String fieldObjId = ((StringReference)mc.callInstanceMethod("getValueObjId")).value(); + String fieldType = ((StringReference)mc.callInstanceMethod("getValueClassName")).value(); + VariableData fieldData = new VariableData(fieldName, fieldType, fieldObjId); + thisObjData.addChild(fieldData); + + // �擾�����t�B�[���h���I�u�W�F�N�g��z��̏ꍇ�ɁA���̃I�u�W�F�N�g��z�񂪎��ƒt�B�[���h�ɂ‚��Ă̏������s�� + callDeepHierarchyFieldState(vm, thread, fieldData, tp, (indent + " ")); + } + } catch (JavaModelException e) { + e.printStackTrace(); } }