diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/CallStackLabelProvider.java b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/CallStackLabelProvider.java index 6f14937..1123a4f 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/CallStackLabelProvider.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/CallStackLabelProvider.java @@ -20,7 +20,7 @@ if (value instanceof CallStackModel) { CallStackModel callStackModel = (CallStackModel)value; StringBuilder text = new StringBuilder(); - text.append(callStackModel.getSignature()); + text.append(callStackModel.getCallStackSignature()); text.append(" line: "); text.append(callStackModel.getCallLineNo()); return text.toString(); diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/CallStackModel.java b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/CallStackModel.java index 6eeccd0..c5ce131 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/CallStackModel.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/CallStackModel.java @@ -1,7 +1,9 @@ package org.ntlab.reverseDebugger; import org.ntlab.onlineAccessor.JDIInstanceMethodCaller; +import org.ntlab.traceAnalysisPlatform.tracer.trace.Trace; +import com.sun.jdi.BooleanValue; import com.sun.jdi.ClassNotLoadedException; import com.sun.jdi.IncompatibleThreadStateException; import com.sun.jdi.InvalidTypeException; @@ -49,6 +51,32 @@ return signature; } + public String getCallStackSignature() { + String signature = ""; + try { + signature = getSignature(); + String objectType = ((StringReference)methodExecutionMc.callInstanceMethod("getThisClassName")).value(); + objectType = objectType.substring(objectType.lastIndexOf(".") + 1); + boolean isConstructor = ((BooleanValue)methodExecutionMc.callInstanceMethod("isConstructor")).value(); + String declaringType = Trace.getDeclaringType(signature, isConstructor); + declaringType = declaringType.substring(declaringType.lastIndexOf(".") + 1); + String methodName = Trace.getMethodName(signature); + String args = "(" + signature.split("\\(")[1]; + + StringBuilder sb = new StringBuilder(); + sb.append(objectType); + if (!declaringType.equals(objectType)) { + sb.append("(" + declaringType + ")"); + } + sb.append("." + methodName + args); + signature = sb.toString(); + } catch (InvalidTypeException | ClassNotLoadedException | InvocationException + | IncompatibleThreadStateException e) { + e.printStackTrace(); + } + return signature; + } + public Value callInstanceMethod(String methodName, Value... args) throws InvalidTypeException, ClassNotLoadedException, InvocationException, IncompatibleThreadStateException { return methodExecutionMc.callInstanceMethod(methodName, args);