diff --git a/org.ntlab.reverseDebugger/plugin.xml b/org.ntlab.reverseDebugger/plugin.xml index 124c048..fe25aa0 100644 --- a/org.ntlab.reverseDebugger/plugin.xml +++ b/org.ntlab.reverseDebugger/plugin.xml @@ -25,21 +25,21 @@ category="org.ntlab.reverseDebugger.category" class="org.ntlab.reversedebugger.SeedAliasView" id="org.ntlab.reverseDebugger.seedAliasView" - name="SeedAliasView" + name="Alias" restorable="true"> diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/DebuggingControlAction.java b/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/DebuggingControlAction.java index 24d1471..127dc87 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/DebuggingControlAction.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/DebuggingControlAction.java @@ -166,6 +166,10 @@ // �I�����C����͒���traceCollector��TraceJSON#getObjectFlow()���Ăяo�����̃R�[�h // printObjectFlow(vm, thread, threadInstance); + + // �X�s�[�h�v���Ɣ�r + SpeedTester st = new SpeedTester(); + st.countMethodExecutionTest(vm, thread); } /** diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/SpeedTester.java b/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/SpeedTester.java new file mode 100644 index 0000000..4c63c6b --- /dev/null +++ b/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/SpeedTester.java @@ -0,0 +1,108 @@ +package org.ntlab.debuggingControl; + +import com.sun.jdi.ClassNotLoadedException; +import com.sun.jdi.IncompatibleThreadStateException; +import com.sun.jdi.IntegerValue; +import com.sun.jdi.InvalidTypeException; +import com.sun.jdi.InvocationException; +import com.sun.jdi.LongValue; +import com.sun.jdi.ObjectReference; +import com.sun.jdi.StringReference; +import com.sun.jdi.ThreadReference; +import com.sun.jdi.Value; +import com.sun.jdi.VirtualMachine; + +public class SpeedTester { + private static final String TRACE = "org.ntlab.traceCollector.tracer.trace"; + + public void countMethodExecutionTest(VirtualMachine vm, ThreadReference thread) { + MethodCaller mc = new MethodCaller(vm, thread); + try { + StringReference threadId = mc.getVm().mirrorOf(String.valueOf(mc.getThreadId())); + ObjectReference threadInstance = (ObjectReference)mc.callStaticMethod(TRACE, "TraceJSON", "getThreadInstance", threadId); + ObjectReference roots = (ObjectReference)mc.setObj(threadInstance).callInstanceMethod("getRoot"); + ObjectReference currentMe = (ObjectReference)mc.callInstanceMethod("getCurrentMethodExecution"); + String targetSignature = ((StringReference)mc.setObj(currentMe).callInstanceMethod("getSignature")).value(); + System.out.println("targetSignature: " + targetSignature); + final int LOOP = 10; + + // �ꎟ��͂̒T��������, ReverseDebugger���ɍ쐬�����ꍇ�ł̏������Ԍv�� + System.out.println(); System.out.println("ReverseDebugger:"); + test(mc, roots, targetSignature, SpeedTestType.REVERSE_DEBUGGER, LOOP); + + // �ꎟ��͂̒T��������, �^�[�Q�b�g�v���O�����ɖ��ߍ���TraceCollector���ɍ쐬�����ꍇ�ł̏������Ԍv�� + System.out.println(); System.out.println("TraceCollector:"); + test(mc, roots, targetSignature, SpeedTestType.TRACE_COLLECTOR, LOOP); + } catch (InvalidTypeException | ClassNotLoadedException + | InvocationException | IncompatibleThreadStateException e) { + e.printStackTrace(); + } + } + + private void test(MethodCaller mc, ObjectReference roots, String targetSignature, SpeedTestType type, final int LOOP) + throws InvalidTypeException, ClassNotLoadedException, InvocationException, IncompatibleThreadStateException { + int count = 0; + long beforeTime = 0, afterTime = 0, executionTime, sumTime = 0, bestTime = -1, worstTime = -1; + for (int i = 0; i < LOOP; i++) { + mc.setObj(roots); + switch (type) { + case REVERSE_DEBUGGER: + beforeTime = System.nanoTime(); + count = countMethodExecutionInReverseDebugger(mc, targetSignature, 0, "--------"); + afterTime = System.nanoTime(); + break; + case TRACE_COLLECTOR: + beforeTime = System.nanoTime(); + count = countMethodExecutionInTraceCollector(mc, targetSignature, 0, "--------"); + afterTime = System.nanoTime(); + break; + } + executionTime = afterTime - beforeTime; + System.out.print("count: " + count + " "); + System.out.println(String.format("Time%-2d: %10d nsec", (i + 1), executionTime)); + sumTime += (executionTime); + bestTime = (bestTime < 0 || executionTime < bestTime) ? executionTime : bestTime; + worstTime = (worstTime < 0 || executionTime > worstTime) ? executionTime : worstTime; + } + System.out.println(String.format("%-12s: %10d nsec", "BestTime", bestTime)); + System.out.println(String.format("%-12s: %10d nsec", "WorstTime", worstTime)); + System.out.println(String.format("%-12s: %10d nsec", "AverageTime", (sumTime / LOOP))); + } + + private int countMethodExecutionInTraceCollector(MethodCaller mc, String targetSignture, int count, String indent) + throws InvalidTypeException, ClassNotLoadedException, InvocationException, IncompatibleThreadStateException { + VirtualMachine vm = mc.getVm(); + String methodName = "countMethodExecutionInTraceCollector"; + return ((IntegerValue)mc.callStaticMethod(TRACE, "TraceJSON", methodName, mc.getObj(), + vm.mirrorOf(targetSignture), vm.mirrorOf(count), vm.mirrorOf(indent))).value(); + } + + private int countMethodExecutionInReverseDebugger(MethodCaller mc, String targetSignature, int count, String indent) + throws InvalidTypeException, ClassNotLoadedException, InvocationException, IncompatibleThreadStateException { + VirtualMachine vm = mc.getVm(); + ObjectReference methodExecutions = mc.getObj(); + if (methodExecutions == null) { + return count; + } + int methodExecutionsSize = ((IntegerValue)mc.callInstanceMethod("size")).value(); + if (methodExecutionsSize == 0) { + return count; + } + for (int i = 0; i < methodExecutionsSize; i++) { + IntegerValue index = vm.mirrorOf(i); + ObjectReference methodExecution = (ObjectReference)mc.setObj(methodExecutions).callInstanceMethod("get", index); + String signature = ((StringReference)mc.setObj(methodExecution).callInstanceMethod("getSignature")).value(); +// System.out.println(indent + signature); + if (targetSignature.equals(signature)) { + count++; + } + ObjectReference children = (ObjectReference)mc.callInstanceMethod("getChildren"); + count = countMethodExecutionInReverseDebugger(mc.setObj(children), targetSignature, count, indent + "--------"); + } + return count; + } + + private enum SpeedTestType { + REVERSE_DEBUGGER, TRACE_COLLECTOR; + } +} diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/CallStackModel.java b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/CallStackModel.java index 86040d9..c5503b5 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/CallStackModel.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/CallStackModel.java @@ -14,25 +14,14 @@ import com.sun.jdi.VirtualMachine; public class CallStackModel { - private ObjectReference methodExecution; -// private ObjectReference childMethodExecution; private MethodCaller methodExecutionMc; private int callLineNo; -// public CallStackModel(VirtualMachine vm, ThreadReference thread, ObjectReference methodExecution, ObjectReference childMethodExecution) { -// methodExecutionMc = new MethodCaller(vm, thread, methodExecution); -// this.methodExecution = methodExecution; -// this.childMethodExecution = childMethodExecution; -// } - public CallStackModel(VirtualMachine vm, ThreadReference thread, ObjectReference methodExecution, int callLineNo) { methodExecutionMc = new MethodCaller(vm, thread, methodExecution); - this.methodExecution = methodExecution; this.callLineNo = callLineNo; -// this.childMethodExecution = childMethodExecution; } - public VirtualMachine getVm() { return methodExecutionMc.getVm(); } @@ -49,22 +38,6 @@ return callLineNo; } -// public int getCallLineNo() { -// if (childMethodExecution == null) { -// return -1; -// } -// int callLineNo = -1; -// try { -// ObjectReference callStatement = (ObjectReference)methodExecutionMc.callInstanceMethod("getMethodInvocation", childMethodExecution); -// MethodCaller callStatementMc = new MethodCaller(methodExecutionMc.getVm(), methodExecutionMc.getThread(), callStatement); -// callLineNo = ((IntegerValue)callStatementMc.callInstanceMethod("getLineNo")).value(); -// } catch (InvalidTypeException | ClassNotLoadedException -// | InvocationException | IncompatibleThreadStateException e) { -// e.printStackTrace(); -// } -// return callLineNo; -// } - public String getSignature() { String signature = ""; try { diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/CallStackView.java b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/CallStackView.java index 2c2ee60..ce7e090 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/CallStackView.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/CallStackView.java @@ -35,6 +35,7 @@ viewer = new TreeViewer(parent); viewer.setContentProvider(new TreeNodeContentProvider()); viewer.setLabelProvider(new CallStackLabelProvider()); + viewer.expandAll(); // �I�������J�����ɑΉ����郁�\�b�h���s�̃\�[�X�t�@�C�����J�����郊�X�i�[��o�^���� viewer.addSelectionChangedListener(new ISelectionChangedListener() { @@ -46,6 +47,8 @@ Object value = ((TreeNode)element).getValue(); if (value instanceof CallStackModel) { MethodCaller methodExecution = ((CallStackModel)value).getMethodCaller(); + SeedAliasView.createSeedAliasesByMethodExecution(methodExecution); + SeedAliasView.refresh(); javaEditorOperator.openSrcFileOfMethodExecution(methodExecution); } } @@ -97,7 +100,8 @@ if (nodes == null || nodes[0] == null) { return; } - viewer.setInput(callStackModels.getCallStackModelsTreeNodes()); + viewer.setInput(nodes); + viewer.expandAll(); } public static void reset() { diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/ObjectFlowAliasView.java b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/ObjectFlowAliasView.java index e836290..6dcbfcc 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/ObjectFlowAliasView.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/ObjectFlowAliasView.java @@ -101,7 +101,6 @@ public void setFocus() { // TODO Auto-generated method stub viewer.getControl().setFocus(); -// viewer.setInput(objectFlowAliases.getObjectFlowSingleList(true)); } private void createActions() { @@ -156,7 +155,7 @@ } private void findSeedAliases() { - SeedAliasView.createSeedAliases(selectObjectFlowAlias); + SeedAliasView.createSeedAliasesByAlias(selectObjectFlowAlias); SeedAliasView.refresh(); CallStackView.updateByAlias(selectObjectFlowAlias); CallStackView.refresh(); diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/SeedAliasView.java b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/SeedAliasView.java index 6c6c043..75d92d0 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/SeedAliasView.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/SeedAliasView.java @@ -32,7 +32,7 @@ private static SeedAliases seedAliases = new SeedAliases(); private static JavaEditorOperator javaEditorOperator = new JavaEditorOperator(); public static final String ID = "org.ntlab.reverseDebugger.seedAliasView"; - + public SeedAliasView() { // TODO Auto-generated constructor stub System.out.println("SeedAliasView�N���X���������ꂽ��!"); @@ -60,21 +60,8 @@ viewer.setLabelProvider(new SeedAliasLabelProvider()); viewer.setInput(seedAliases.getSeedAliases()); CallStackView.refresh(); - - // �I�������J�����ɑΉ�����V�[�h�G�C���A�X���N�_�ɃI�u�W�F�N�g�t���[�����s�����郊�X�i�[��o�^ -// viewer.addSelectionChangedListener(new ISelectionChangedListener() { -// @Override -// public void selectionChanged(SelectionChangedEvent event) { -// IStructuredSelection sel = (IStructuredSelection)event.getSelection(); -// Object element = sel.getFirstElement(); -// if (element instanceof MethodCaller) { -// MethodCaller seedAlias = (MethodCaller)element; -// ObjectFlowAliasView.createObjectFlow(seedAlias); -// ObjectFlowAliasView.refresh(); -// } -// } -// }); + // �I�������J�����ɑΉ�����V�[�h�G�C���A�X���t�B�[���h�ɋL�^���Ă������X�i�[��o�^ (�I��������ɉE�N���b�N�ŃI�u�W�F�N�g�t���[�����s������ۂɕK�v) viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { @@ -97,7 +84,6 @@ public void setFocus() { // TODO Auto-generated method stub viewer.getControl().setFocus(); -// viewer.refresh(); } private void createActions() { @@ -163,8 +149,12 @@ return seedAliases.getDebuggerStopMethodExecution(); } - public static void createSeedAliases(MethodCaller alias) { - seedAliases.createSeedAliases(alias); + public static void createSeedAliasesByAlias(MethodCaller alias) { + seedAliases.createSeedAliasesByAlias(alias); + } + + public static void createSeedAliasesByMethodExecution(MethodCaller methodExecution) { + seedAliases.createSeedAliasesByMethodExecution(methodExecution); } public static void refresh() { @@ -174,7 +164,6 @@ CallStackView.reset(); } viewer.refresh(); - CallStackView.refresh(); } private void reset() { diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/SeedAliases.java b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/SeedAliases.java index e295db3..e67a6ec 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/SeedAliases.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/SeedAliases.java @@ -106,17 +106,31 @@ } /** - * �n���ꂽ�G�C���A�X������郁�\�b�h���s���̑S�V�[�h�G�C���A�X�̈ꗗ���Z�b�g���� + * �n���ꂽ�G�C���A�X�������Ă��郁�\�b�h���s���̑S�V�[�h�G�C���A�X�̈ꗗ���Z�b�g���� * @param alias */ - public void createSeedAliases(MethodCaller alias) { + public void createSeedAliasesByAlias(MethodCaller alias) { VirtualMachine vm = alias.getVm(); ThreadReference thread = alias.getThread(); MethodCaller mc = new MethodCaller(vm, thread); try { Value methodExecution = alias.callInstanceMethod("getMethodExecution"); findAllSeedAlias(vm, thread, methodExecution); - } catch (InvalidTypeException | ClassNotLoadedException | InvocationException | IncompatibleThreadStateException e) { + } catch (InvalidTypeException | ClassNotLoadedException + | InvocationException | IncompatibleThreadStateException e) { + e.printStackTrace(); + } + } + + /** + * �n���ꂽ���\�b�h���s���̑S�V�[�h�G�C���A�X�̈ꗗ���Z�b�g���� + * @param methodExecution + */ + public void createSeedAliasesByMethodExecution(MethodCaller methodExecution) { + try { + findAllSeedAlias(methodExecution.getVm(), methodExecution.getThread(), methodExecution.getObj()); + } catch (InvalidTypeException | ClassNotLoadedException + | InvocationException | IncompatibleThreadStateException e) { e.printStackTrace(); } }