diff --git a/org.ntlab.reverseDebugger/.settings/CVS/Entries b/org.ntlab.reverseDebugger/.settings/CVS/Entries
new file mode 100644
index 0000000..3f96714
--- /dev/null
+++ b/org.ntlab.reverseDebugger/.settings/CVS/Entries
@@ -0,0 +1 @@
+/org.eclipse.jdt.core.prefs/1.2/Wed Dec 9 07:18:21 2015//
diff --git a/org.ntlab.reverseDebugger/.settings/CVS/Repository b/org.ntlab.reverseDebugger/.settings/CVS/Repository
new file mode 100644
index 0000000..f9ae7d0
--- /dev/null
+++ b/org.ntlab.reverseDebugger/.settings/CVS/Repository
@@ -0,0 +1 @@
+org.ntlab.debuggingControl/.settings
diff --git a/org.ntlab.reverseDebugger/.settings/CVS/Root b/org.ntlab.reverseDebugger/.settings/CVS/Root
new file mode 100644
index 0000000..6041112
--- /dev/null
+++ b/org.ntlab.reverseDebugger/.settings/CVS/Root
@@ -0,0 +1 @@
+:pserver:n-nitta@nitta-lab-www.is.konan-u.ac.jp:\CVSProject
diff --git a/org.ntlab.reverseDebugger/META-INF/CVS/Entries b/org.ntlab.reverseDebugger/META-INF/CVS/Entries
new file mode 100644
index 0000000..8b3db2a
--- /dev/null
+++ b/org.ntlab.reverseDebugger/META-INF/CVS/Entries
@@ -0,0 +1 @@
+/MANIFEST.MF/1.1/Wed Dec 9 07:11:31 2015//
diff --git a/org.ntlab.reverseDebugger/META-INF/CVS/Repository b/org.ntlab.reverseDebugger/META-INF/CVS/Repository
new file mode 100644
index 0000000..0ad0de2
--- /dev/null
+++ b/org.ntlab.reverseDebugger/META-INF/CVS/Repository
@@ -0,0 +1 @@
+org.ntlab.debuggingControl/META-INF
diff --git a/org.ntlab.reverseDebugger/META-INF/CVS/Root b/org.ntlab.reverseDebugger/META-INF/CVS/Root
new file mode 100644
index 0000000..6041112
--- /dev/null
+++ b/org.ntlab.reverseDebugger/META-INF/CVS/Root
@@ -0,0 +1 @@
+:pserver:n-nitta@nitta-lab-www.is.konan-u.ac.jp:\CVSProject
diff --git a/org.ntlab.reverseDebugger/plugin.xml b/org.ntlab.reverseDebugger/plugin.xml
index c7729d6..265e6ed 100644
--- a/org.ntlab.reverseDebugger/plugin.xml
+++ b/org.ntlab.reverseDebugger/plugin.xml
@@ -15,5 +15,19 @@
+
+
+
+
+
+
diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/DebuggingControlAction.java b/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/DebuggingControlAction.java
index 5db785d..46c7e28 100644
--- a/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/DebuggingControlAction.java
+++ b/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/DebuggingControlAction.java
@@ -60,7 +60,7 @@
import com.sun.jdi.VirtualMachine;
public class DebuggingControlAction implements IWorkbenchWindowActionDelegate {
-
+
@Override
public void run(IAction arg0) {
// TODO Auto-generated method stub
@@ -229,6 +229,7 @@
methodName = "size";
int aliasListsSize = ((IntegerValue)callInstanceMethod(vm, thread, methodName, (ObjectReference)aliasLists)).value();
for (int i = 0; i < aliasListsSize; i++) {
+ ArrayList aliasViewList = new ArrayList<>();
System.out.println("---------------------------------------------");
System.out.println("���X�g" + i);
methodName = "get";
@@ -244,6 +245,7 @@
methodName = "getMethodExecution";
Value aliasMethodExecution = callInstanceMethod(vm ,thread, methodName, (ObjectReference)alias);
openSrcFileOfMethodExecution(vm, thread, aliasMethodExecution);
+ aliasViewList.add(new MethodCaller(vm, thread, (ObjectReference)alias));
}
}
}
diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/MethodCaller.java b/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/MethodCaller.java
new file mode 100644
index 0000000..6174e1a
--- /dev/null
+++ b/org.ntlab.reverseDebugger/src/org/ntlab/debuggingControl/MethodCaller.java
@@ -0,0 +1,72 @@
+package org.ntlab.debuggingControl;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.sun.jdi.ClassNotLoadedException;
+import com.sun.jdi.ClassType;
+import com.sun.jdi.IncompatibleThreadStateException;
+import com.sun.jdi.InvalidTypeException;
+import com.sun.jdi.InvocationException;
+import com.sun.jdi.Method;
+import com.sun.jdi.ObjectReference;
+import com.sun.jdi.ReferenceType;
+import com.sun.jdi.ThreadReference;
+import com.sun.jdi.Value;
+import com.sun.jdi.VirtualMachine;
+
+public class MethodCaller {
+ private VirtualMachine vm;
+ private ThreadReference thread;
+ private ObjectReference obj;
+
+ public MethodCaller(VirtualMachine vm, ThreadReference thread) {
+ this.vm = vm;
+ this.thread = thread;
+ }
+
+ public MethodCaller(VirtualMachine vm, ThreadReference thread, ObjectReference obj) {
+ this(vm, thread);
+ this.obj = obj;
+ }
+
+ public ObjectReference getObj() {
+ return obj;
+ }
+
+ public MethodCaller setObj(ObjectReference obj) {
+ this.obj = obj;
+ return this;
+ }
+
+ /**
+ * �p�b�P�[�W���ƃN���X���ƃ��\�b�h���ƈ������w�肵�Ă��̃N���X���\�b�h���Ăяo��
+ * @param packageName �Ăт����������\�b�h������N���X�̃p�b�P�[�W��
+ * @param className �Ăяo���������\�b�h������N���X��
+ * @param methodName �Ăяo���������\�b�h�� (static)
+ * @param args �Ăяo���������\�b�h�ɓn������(Value �̃N���X�^�ʼnϒ�)
+ * @return �Ăяo�������\�b�h����̖߂�l(Value)
+ */
+ public Value callStaticMethod(String packageName, String className, String methodName, Value... args)
+ throws InvalidTypeException, ClassNotLoadedException, InvocationException, IncompatibleThreadStateException {
+ List classes = vm.classesByName(packageName + "." + className); // �N���X�� (���S���薼)
+ ClassType type = (ClassType)classes.get(0);
+ List methodsByName = type.methodsByName(methodName);
+ List argList = Arrays.asList(args); // ���\�b�h�ɓn�������̃��X�g
+ return type.invokeMethod(thread, methodsByName.get(0), argList, thread.INVOKE_SINGLE_THREADED); // �f�o�b�O���̃v���O�������̃��\�b�h���Ăяo��
+ }
+
+ /**
+ * ���\�b�h����ObjectReference�ƈ������w�肵�Ă��̃I�u�W�F�N�g�̃C���X�^���X���\�b�h���Ăяo��
+ * @param methodName �Ăяo���������\�b�h��
+ * @param args �Ăяo���������\�b�h�ɓn������(Value �̃N���X�^�ʼnϒ�)
+ * @return �Ăяo�������\�b�h����̖߂�l(Value)
+ */
+ public Value callInstanceMethod(String methodName, Value... args)
+ throws InvalidTypeException, ClassNotLoadedException, InvocationException, IncompatibleThreadStateException {
+ ClassType type = (ClassType)obj.type();
+ List methodsByName = type.methodsByName(methodName);
+ List argList = Arrays.asList(args); // ���\�b�h�ɓn�������̃��X�g
+ return obj.invokeMethod(thread, methodsByName.get(0), argList, thread.INVOKE_SINGLE_THREADED); // �f�o�b�O���̃v���O�������̃��\�b�h���Ăяo��
+ }
+}
diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/AliasLabelProvider.java b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/AliasLabelProvider.java
new file mode 100644
index 0000000..cf4b4eb
--- /dev/null
+++ b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/AliasLabelProvider.java
@@ -0,0 +1,56 @@
+package org.ntlab.reversedebugger;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.ntlab.debuggingControl.MethodCaller;
+
+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.ObjectReference;
+import com.sun.jdi.StringReference;
+import com.sun.jdi.Value;
+
+public class AliasLabelProvider extends LabelProvider implements ITableLabelProvider {
+
+ @Override
+ public String getColumnText(Object element, int columnIndex) {
+ if (element instanceof MethodCaller) {
+ MethodCaller mc = (MethodCaller)element;
+ try {
+ switch (columnIndex) {
+ case 0:
+ return ((StringReference)mc.callInstanceMethod("getObjectId")).value();
+ case 1:
+ return String.valueOf(((IntegerValue)mc.callInstanceMethod("getLineNo")).value());
+ case 2:
+ return ((StringReference)mc.callInstanceMethod("getStatementType")).value();
+ case 3:
+ return ((StringReference)mc.callInstanceMethod("getStatementSignature")).value();
+ case 4:
+ return String.format("%3d", (((IntegerValue)mc.callInstanceMethod("getOccurrenceExp")).value()));
+ case 5:
+ return ((StringReference)mc.callInstanceMethod("getClassName")).value();
+ }
+ } catch (InvalidTypeException | ClassNotLoadedException | InvocationException | IncompatibleThreadStateException e) {
+ e.printStackTrace();
+ }
+ }
+ return "�e�X�g�p�e�L�X�g" + columnIndex;
+ }
+
+ @Override
+ public Image getColumnImage(Object element, int columnIndex) {
+ return getImage(element);
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
+ }
+}
diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/AliasView.java b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/AliasView.java
new file mode 100644
index 0000000..0911408
--- /dev/null
+++ b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/AliasView.java
@@ -0,0 +1,90 @@
+package org.ntlab.reversedebugger;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.dialogs.ViewLabelProvider;
+import org.eclipse.ui.part.ViewPart;
+import org.ntlab.debuggingControl.DebuggingControlAction;
+import org.ntlab.debuggingControl.MethodCaller;
+
+public class AliasView extends ViewPart {
+ private TableViewer viewer;
+ private IAction updateAction;
+ private SeedAliases seedAliases = new SeedAliases();
+
+ public AliasView() {
+ // TODO Auto-generated constructor stub
+ System.out.println("AliasView�N���X���������ꂽ��!");
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ // TODO Auto-generated method stub
+ System.out.println("AliasView#createPartControl(Composite)���Ăꂽ��!");
+ viewer = new TableViewer(parent);
+ Table table = viewer.getTable();
+ table.setHeaderVisible(true);
+ table.setLinesVisible(true);
+
+ // �e�[�u���̃J�������쐬
+ String[] tableColumnTexts = {"objectID", "lineNo", "statementType", "statementSignature", "exp", "class"};
+ int[] tableColumnWidth = {150, 80, 180, 400, 80, 400};
+ TableColumn[] tableColumns = new TableColumn[tableColumnTexts.length];
+ for (int i = 0; i < tableColumns.length; i++) {
+ tableColumns[i] = new TableColumn(table, SWT.NULL);
+ tableColumns[i].setText(tableColumnTexts[i]);
+ tableColumns[i].setWidth(tableColumnWidth[i]);
+ }
+
+ viewer.setContentProvider(new ArrayContentProvider());
+ viewer.setLabelProvider(new AliasLabelProvider());
+ viewer.setInput(seedAliases.getSeedAliases());
+ createActions();
+ createToolBar();
+ createMenuBar();
+ }
+
+ @Override
+ public void setFocus() {
+ // TODO Auto-generated method stub
+ viewer.getControl().setFocus();
+ }
+
+ private void createActions() {
+ updateAction = new Action() {
+ @Override
+ public void run() {
+ seedAliases.reset();
+ viewer.setInput(seedAliases.getSeedAliases());
+ }
+ };
+ updateAction.setText("�e�L�X�g");
+ updateAction.setToolTipText("�c�[���`�b�v�e�L�X�g");
+ updateAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
+ }
+
+ private void createToolBar() {
+ IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager();
+ mgr.add(updateAction);
+ }
+
+ private void createMenuBar() {
+ IMenuManager mgr = getViewSite().getActionBars().getMenuManager();
+ mgr.add(updateAction);
+ }
+}
diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/SeedAliases.java b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/SeedAliases.java
new file mode 100644
index 0000000..f18e02a
--- /dev/null
+++ b/org.ntlab.reverseDebugger/src/org/ntlab/reversedebugger/SeedAliases.java
@@ -0,0 +1,115 @@
+package org.ntlab.reversedebugger;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.internal.core.LaunchManager;
+import org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.ntlab.debuggingControl.MethodCaller;
+
+import com.sun.jdi.ClassNotLoadedException;
+import com.sun.jdi.ClassType;
+import com.sun.jdi.IncompatibleThreadStateException;
+import com.sun.jdi.IntegerValue;
+import com.sun.jdi.InvalidTypeException;
+import com.sun.jdi.InvocationException;
+import com.sun.jdi.Location;
+import com.sun.jdi.LongValue;
+import com.sun.jdi.Method;
+import com.sun.jdi.ObjectReference;
+import com.sun.jdi.ReferenceType;
+import com.sun.jdi.StackFrame;
+import com.sun.jdi.StringReference;
+import com.sun.jdi.ThreadReference;
+import com.sun.jdi.Value;
+import com.sun.jdi.VirtualMachine;
+
+public class SeedAliases {
+ private List seedAliases = new ArrayList<>();
+ private final String TRACER = "org.ntlab.traceCollector.tracer.trace";
+
+ public SeedAliases() {
+ init();
+ }
+
+ public List getSeedAliases() {
+ return seedAliases;
+ }
+
+ public void reset() {
+ seedAliases.clear();
+ init();
+ }
+
+ private void init() {
+ // TODO Auto-generated method stub
+ LaunchManager lm = (LaunchManager)DebugPlugin.getDefault().getLaunchManager();
+
+ ILaunch[] launches = lm.getLaunches();
+ if (launches.length != 0) {
+ ILaunch debugLaunch = null;
+ for (int i = 0; i < launches.length; i++) {
+ System.out.print(launches[i].getLaunchConfiguration().getName() + ":");
+ System.out.print(launches[i].getDebugTarget());
+ if (launches[i].getDebugTarget() != null) {
+ debugLaunch = launches[i];
+ break;
+ }
+ }
+ if (debugLaunch != null) {
+ JDIDebugTarget debugTarget = ((JDIDebugTarget)debugLaunch.getDebugTarget());
+ VirtualMachine vm = debugTarget.getVM();
+ if (vm != null) {
+ // �f�o�b�O���s���̏ꍇ
+ List allThreads = vm.allThreads();
+ for (int i = 0; i < allThreads.size(); i++) {
+ ThreadReference thread = allThreads.get(i);
+ if (thread.isSuspended()) {
+ try {
+ setSeedAliasList(vm, thread);
+ } catch (InvalidTypeException
+ | ClassNotLoadedException
+ | InvocationException e) {
+ e.printStackTrace();
+ } catch (IncompatibleThreadStateException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * �I�����C����͒���, �I�u�W�F�N�g�t���[�̋N�_�ƂȂ�G�C���A�X(�V�[�h�G�C���A�X)�̈ꗗ��T���ăZ�b�g����
+ * @param vm
+ * @param thread
+ */
+ private void setSeedAliasList(VirtualMachine vm, ThreadReference thread) throws InvalidTypeException,
+ ClassNotLoadedException, InvocationException, IncompatibleThreadStateException {
+ MethodCaller mc = new MethodCaller(vm, thread);
+
+ // threadId�̎擾��StringReference�^�ւ̕ϊ�
+ Value threadIdValue = mc.setObj(thread).callInstanceMethod("getId");
+ StringReference threadId = vm.mirrorOf(String.valueOf(((LongValue)threadIdValue).value()));
+
+ // threadId�ɑΉ�����ThreadInstance���擾
+ ObjectReference threadInstance = (ObjectReference)mc.callStaticMethod(TRACER, "TraceJSON", "getThreadInstance", threadId);
+
+ // �f�o�b�K�Ŏ~�߂Ă���n�_�ɊY�����郁�\�b�h���s����, �X�^�[�g�ƂȂ���̃G�C���A�X�̃��X�g���擾���ĕ\������
+ Value methodExecution = mc.setObj(threadInstance).callInstanceMethod("getCurrentMethodExecution");
+ ObjectReference seedAliasList = (ObjectReference)mc.callStaticMethod(TRACER, "TraceJSON", "findAllStartAlias", methodExecution);
+ int seedAliasListSize = ((IntegerValue)mc.setObj(seedAliasList).callInstanceMethod("size")).value();
+ for (int i = 0; i < seedAliasListSize; i++) {
+ ObjectReference startAlias = (ObjectReference)mc.setObj(seedAliasList).callInstanceMethod("get", vm.mirrorOf(i));
+ seedAliases.add(new MethodCaller(vm, thread, startAlias));
+ }
+ }
+}