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();
}
}