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