diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/Alias.java b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/Alias.java index 86c9192..a7472cb 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/Alias.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/Alias.java @@ -188,22 +188,31 @@ } return String.valueOf(occurrenceExp); } + + public boolean isStatementCallingConstructor() { + Statement statement = occurrencePoint.getStatement(); + if (statement instanceof MethodInvocation) { + MethodExecution calledMethodExecution = ((MethodInvocation)statement).getCalledMethodExecution(); + return calledMethodExecution.isConstructor(); + } + return false; + } -// @Override -// public String toString() { -// Statement statement = occurrencePoint.getStatement(); -// String className = getClassName(); -// String methodSignature = getMethodSignature(); -// String statementType = getStatementType(); -// String statementSigunarure = getStatementSignature(); -// String indent = " "; -// StringBuilder str = new StringBuilder(); -// str.append("objId: " + objectId + " (class = " + className + ")" + "\n"); -// str.append("tp: " + occurrencePoint + "\n"); -// str.append(indent + "signature: " + methodSignature + "\n"); -// str.append(indent + "lineNo: " + statement.getLineNo() + "\n"); -// str.append(indent + "statementType: " + statementType + " -> " + statementSigunarure + "\n"); -// str.append("occurrenceExp: " + occurrenceExp + "\n"); -// return str.toString(); -// } + @Override + public String toString() { + Statement statement = occurrencePoint.getStatement(); + String className = getClassName(); + String methodSignature = getMethodSignature(); + String statementType = getStatementType(); + String statementSigunarure = getStatementSignature(); + String indent = " "; + StringBuilder str = new StringBuilder(); + str.append("objId: " + objectId + " (class = " + className + ")" + "\n"); + str.append("tp: " + occurrencePoint + "\n"); + str.append(indent + "signature: " + methodSignature + "\n"); + str.append(indent + "lineNo: " + statement.getLineNo() + "\n"); + str.append(indent + "statementType: " + statementType + " -> " + statementSigunarure + "\n"); + str.append("occurrenceExp: " + occurrenceExp + "\n"); + return str.toString(); + } } diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/ReverseDebuggerAnalyzer.java b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/ReverseDebuggerAnalyzer.java index 7939fc9..dfd2923 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/ReverseDebuggerAnalyzer.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/ReverseDebuggerAnalyzer.java @@ -123,7 +123,10 @@ // for (int i = 0; i < resultLists.size(); i++) { // ArrayList resultList = resultLists.get(i); // System.out.println("---------------------------------------------------------"); // �m�F�p -// for (Alias alias : resultList) System.out.println(alias); // �m�F�p +// for (Alias alias : resultList) { +// System.out.println(alias); // �m�F�p +// System.out.println(); +// } // int lastAliasOccurrenceEXP = resultList.get(resultList.size() - 1).getOccurrenceExp(); // if (lastAliasOccurrenceEXP != Alias.OCCURRENCE_EXP_RETURN) { // resultLists.remove(resultList); // �����̃G�C���A�X���z�񐶐���R���X�g���N�^�Ăяo���ł͂Ȃ����X�g���폜���� @@ -132,6 +135,111 @@ return resultLists; } +// private static ArrayList> getObjectFlow(ArrayList> aliasLists, +// String objId, TracePoint tp, int side) { +// +// +// if (!tp.isValid()) { +// return aliasLists; // ����ȏチ�\�b�h���s��k��Ȃ��ꍇ(main���\�b�h�̂���ɑO�Ȃ�)�͂��̎��_�ŏI�� +// } +// // --- ���̎��_�� tracePoint�� �Ăяo�������w���Ă��� (���O�܂ők���Ă������\�b�h���s�ɂ‚��Ẵ��\�b�h�Ăяo�����w���Ă���) --- +// MethodExecution calledMethodExecution = ((MethodInvocation)tp.getStatement()).getCalledMethodExecution(); +// ArrayList args = calledMethodExecution.getArguments(); +// boolean isExistingInArgs = false; +// for (int i = 0; i < args.size(); i++) { +// if (args.get(i).getId().equals(objId)) { +// // ���\�b�h�Ăяo���̎������ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ +// aliasList.add(new Alias(objId, tp.duplicate(), (i + Alias.OCCURRENCE_EXP_FIRST_ARG))); +// isExistingInArgs = true; +// if (side == 0) { +// // �T���J�n���\�b�h���s�܂��̓t�B�[���h��z��v�f�̍ŏI�X�V�T���Ŕ�񂾐�̃��\�b�h���s����, �X�^�b�N�g���[�X�ł��ǂ��S���\�b�h���s�̏ꍇ +// TracePoint previousTp = tp.duplicate(); +// previousTp.stepBackOver(); +// aliasLists = getObjectFlow(aliasLists, objId, previousTp, 0); // �Ăяo�����̃��\�b�h���s�ɖ߂� +// } +// } +// } +// if (!isExistingInArgs) { +// System.out.println(); +// System.out.println(aliasLists); +// System.out.println(); +// System.out.println("remove: " + aliasLists.get(aliasLists.size() - 1)); +// System.out.println(); +// aliasLists.remove(aliasLists.size() - 1); // �����ɃG�C���A�X���Ȃ������ꍇ�͂��̉�̒ǐՃG�C���A�X���X�g���폜���� +// } +// return aliasLists; +// } +// + +// private static boolean getObjectFlowSub(ArrayList> aliasLists, +// String objId, TracePoint tp, int side) { +// ArrayList aliasList = aliasLists.get(aliasLists.size() - 1); // ����getObjectFlow���\�b�h���s���Ō��‚������G�C���A�X�����Ă������X�g +// do { +// Statement statement = tp.getStatement(); +// if (statement instanceof FieldAccess) { +// // �t�B�[���h�Q�Ƃ̏ꍇ +// FieldAccess fa = (FieldAccess)statement; +// if (fa.getValueObjId().equals(objId)) { +// // ���Y�n�_�ł̃G�C���A�X�����X�g�ɒlj��������, �t�B�[���h�ŏI�X�V�ɔ�ԃp�^�[���Ƃ��̂܂ܑk��p�^�[���Ƃŕ��� +// aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_FIELD)); +// aliasList = new ArrayList<>(aliasList); // ���X�g���̂��f�B�[�v�R�s�[���Ă���(�t�B�[���h�ŏI�X�V�ɔ�ԍċA�����I�����, ���̂܂ܑk��p�^�[���ŗp����) +// TracePoint fieldUpdateTp = getRecentlyFieldUpdate(tp); +// aliasLists = getObjectFlow(aliasLists, objId, fieldUpdateTp, 0); +// aliasLists.add(aliasList); // �ċA�����ɓ���O�Ƀf�B�[�v�R�s�[���Ă������X�g���Ō���ɒlj� (�ȍ~�̑k��ɂ���Č��‚����G�C���A�X�͂��̃��X�g�ɓ������) +// } +// } else if (statement instanceof ArrayAccess) { +// // �z��v�f�Q�Ƃ̏ꍇ +// ArrayAccess aa = (ArrayAccess)statement; +// if (aa.getValueObjectId().equals(objId)) { +// aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_ARRAY)); +// aliasList = new ArrayList<>(aliasList); +// TracePoint arrayUpdateTp = getRecentlyArrayUpdate(tp); +// aliasLists = getObjectFlow(aliasLists, objId, arrayUpdateTp, 0); +// aliasLists.add(aliasList); +// } +// } else if (statement instanceof ArrayCreate) { +// // �z�񐶐��̏ꍇ +// ArrayCreate ac = (ArrayCreate)statement; +// if (ac.getArrayObjectId().equals(objId)) { +// aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_RETURN)); // �z�񐶐��� new �^��[] �̖߂�l +// return true; +//// return aliasLists; // �z�񐶐��ӏ��̓G�C���A�X�̋N���Ȃ̂ł���ȑO�ɂ͂����Ȃ��͂� +// } +// } else if (statement instanceof MethodInvocation) { +// // ���\�b�h�Ăяo���̏ꍇ +// MethodExecution calledMethodExecution = ((MethodInvocation)statement).getCalledMethodExecution(); +// ObjectReference returnValue = calledMethodExecution.getReturnValue(); +// if (returnValue.getId().equals(objId)) { +// // �߂�l�ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ +// aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_RETURN)); +// if (calledMethodExecution.isConstructor()) { +// System.out.println("�R���X�g���N�^���B"); +// return true; +//// return aliasLists; // �R���X�g���N�^�Ăяo���ӏ��̓G�C���A�X�̋N���Ȃ̂ł���ȑO�ɂ͂����Ȃ��͂� +// } +// TracePoint exitTp = calledMethodExecution.getExitPoint(); // �Ăяo�����\�b�h���s�̍ŏI�X�e�[�g�����g���w��tp���擾 +// aliasLists = getObjectFlow(aliasLists, objId, exitTp, side + 1); // �Ăяo����̃��\�b�h���s�ɐ��� +// aliasList = aliasLists.get(aliasLists.size() - 1); +//// System.out.println(aliasList.get(aliasList.size() - 1)); +//// System.out.println(aliasList.get(aliasList.size() - 1).isStatementCallingConstructor()); +// if (aliasList.get(aliasList.size() - 1).isStatementCallingConstructor()) { +// System.out.println("�T���ł��؂�"); +//// return aliasLists; // �Ăяo����̃��\�b�h���s���畜�A�����ۂɃR���X�g���N�^�����‚����Ă���΂���ȏ�͑ł��؂� +// } +// } +// } +// } while (tp.stepBackOver()); // �Ăяo�����ɖ߂邩����ȏ�H��Ȃ��Ȃ�܂Ń��[�v +// } +// + + + + + + + + + private static ArrayList> getObjectFlow(ArrayList> aliasLists, String objId, TracePoint tp, int side) { ArrayList aliasList = aliasLists.get(aliasLists.size() - 1); // ����getObjectFlow���\�b�h���s���Ō��‚������G�C���A�X�����Ă������X�g @@ -171,13 +279,23 @@ ObjectReference returnValue = calledMethodExecution.getReturnValue(); if (returnValue.getId().equals(objId)) { // �߂�l�ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ + ArrayList aliasListBeforeMethodBackEntry = new ArrayList<>(aliasList); // �R�[�h�lj���(��) + aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_RETURN)); if (calledMethodExecution.isConstructor()) { + System.out.println("�R���X�g���N�^���B"); + System.out.println(aliasLists); return aliasLists; // �R���X�g���N�^�Ăяo���ӏ��̓G�C���A�X�̋N���Ȃ̂ł���ȑO�ɂ͂����Ȃ��͂� } TracePoint exitTp = calledMethodExecution.getExitPoint(); // �Ăяo�����\�b�h���s�̍ŏI�X�e�[�g�����g���w��tp���擾 aliasLists = getObjectFlow(aliasLists, objId, exitTp, side + 1); // �Ăяo����̃��\�b�h���s�ɐ��� aliasList = aliasLists.get(aliasLists.size() - 1); + if (aliasList.get(aliasList.size() - 1).isStatementCallingConstructor()) { + System.out.println("���\�b�h���s�ɐ���O�̃��[�g�����X�g�ɒlj�"); + aliasLists.add(aliasListBeforeMethodBackEntry); + aliasList = aliasListBeforeMethodBackEntry; + System.out.println(aliasLists); + } } } } while (tp.stepBackOver()); // �Ăяo�����ɖ߂邩����ȏ�H��Ȃ��Ȃ�܂Ń��[�v @@ -187,10 +305,12 @@ // --- ���̎��_�� tracePoint�� �Ăяo�������w���Ă��� (���O�܂ők���Ă������\�b�h���s�ɂ‚��Ẵ��\�b�h�Ăяo�����w���Ă���) --- MethodExecution calledMethodExecution = ((MethodInvocation)tp.getStatement()).getCalledMethodExecution(); ArrayList args = calledMethodExecution.getArguments(); + boolean isExistingInArgs = false; for (int i = 0; i < args.size(); i++) { if (args.get(i).getId().equals(objId)) { // ���\�b�h�Ăяo���̎������ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ aliasList.add(new Alias(objId, tp.duplicate(), (i + Alias.OCCURRENCE_EXP_FIRST_ARG))); + isExistingInArgs = true; if (side == 0) { // �T���J�n���\�b�h���s�܂��̓t�B�[���h��z��v�f�̍ŏI�X�V�T���Ŕ�񂾐�̃��\�b�h���s����, �X�^�b�N�g���[�X�ł��ǂ��S���\�b�h���s�̏ꍇ TracePoint previousTp = tp.duplicate(); @@ -199,9 +319,17 @@ } } } + if (!isExistingInArgs) { + System.out.println(); + System.out.println(aliasLists); + System.out.println(); + System.out.println("remove: " + aliasLists.get(aliasLists.size() - 1)); + System.out.println(); + aliasLists.remove(aliasLists.size() - 1); // �����ɃG�C���A�X���Ȃ������ꍇ�͂��̉�̒ǐՃG�C���A�X���X�g���폜���� + } return aliasLists; } - + public static int countMethodExecutionInTraceCollector(List methodExecutions, String targetSignature, int count, String indent) { if (methodExecutions == null || methodExecutions.isEmpty()) { return count;