Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jdt-debug-dev] StackFrames and Variables

Thank you very much Darin. That now returns the information I need.

Joe

Darin Wright wrote:
There's a class cast exception in your code, try this:

IStackFrame[] frames = (IStackFrame[]) thread.getStackFrames();
                            for(int i=0;i<frames.length;i++){
List variables = ((IJavaStackFrame)frames[i]).getArgumentTypeNames();
                            Iterator iter = variables.iterator();
                            while(iter.hasNext()){
 System.out.println(iter.next().toString());}
                            }

Darin




Joe Tague <jtague@xxxxxxxxxxxxxxxx> Sent by: jdt-debug-dev-admin@xxxxxxxxxxx
02/23/2005 10:09 AM
Please respond to
jdt-debug-dev


To
jdt-debug-dev@xxxxxxxxxxx
cc

Subject
Re: [jdt-debug-dev] StackFrames and Variables






Here is some example code, of what I am trying to achieve. I have included how I set my markers and breakpoint to incase I am creating the problem at these points.

Markers are set on a resource after some analysis of the AST for the CompilationUnit:

public void candidatesFound(String classtype, final String method, final String mode){
     try{
         type = project.findType(classtype);
      } catch (JavaModelException e){..}
      if (type == null) return; //TODO: Log Later

final IType finalType = type;
  try{
   final IResource resource = type.getResource();
   IWorkspaceRunnable runnable = new IWorkspaceRunnable(){
   public void run(IProgressMonitor monitor)throws CoreException{

IMarker marker = resource.createMarker("org.eclipse.contribution.jimada.patternCandidate");

   IMethod[] allMethods = finalType.getMethods();
   IMethod candidateMethod = null;
   for(int i=0;i<allMethods.length;i++){
         if((allMethods[i].getElementName()).equals(method)){
             candidateMethod = allMethods[i];
             setMarkerAttributes(marker, candidateMethod, mode);
         }
    }
    }
    };
  resource.getWorkspace().run(runnable, null);
  } catch (CoreException e){..}
}

These markers and then used to create JavaMethodEntryBreakpoints for the resource:

public BreakpointCreator(IJavaProject project, IMarker[] pattcandidates) {
  javaProject = project;
  candidates = pattcandidates;
}

public void create() {
   for (int i = 0; i < candidates.length; i++) {
    try {
        if (candidates[i].getAttribute("METHOD") != null) {
          IResource resource = candidates[i].getResource();
          String type = candidates[i].getAttribute("TYPE", null);
          String method = candidates[i].getAttribute("METHOD", null);
          String signature = candidates[i].getAttribute("SIG", null);
          int start = Integer.parseInt(candidates[i].getAttribute(
                             IMarker.CHAR_START, "-1"));
          int end = Integer.parseInt(candidates[i].getAttribute(
                             IMarker.CHAR_END, "-1"));
          int line = Integer.parseInt(candidates[i].getAttribute(
                             IMarker.LINE_NUMBER, "-1"));
          if (type != null && method != null && signature != null){
             IJavaMethodBreakpoint br =
                           JDIDebugModel.createMethodBreakpoint(resource,
                           type, method, signature, true, false, false,
                           line, start, end, 0,true,
                           candidates[i].getAttributes());}

           }
      } catch (NumberFormatException e) {..}
   }
}

Now in my implementation of IJavaBreakpointListener I have the following code, (methods not show are empty):


...
...
public int breakpointHit(IJavaThread thread, IJavaBreakpoint breakpoint) {
  if(breakpoint instanceof IJavaMethodBreakpoint){
     IJavaMethodBreakpoint br = (IJavaMethodBreakpoint)breakpoint;
     mybreakpointHit(thread, br);
  }
  else if(breakpoint instanceof IJavaWatchpoint){
     IJavaWatchpoint br = (IJavaWatchpoint)breakpoint;
     mybreakpointHit(thread, br);
  }
  return IJavaBreakpointListener.DONT_SUSPEND;
}

private void mybreakpointHit(IJavaThread thread, IJavaMethodBreakpoint breakpoint) {
  // TODO Generate XML file from thread and breakpoint info.
  try {
System.out.println(breakpoint.getMarker().getAttribute("METHOD").toString());
System.out.println(breakpoint.getMarker().getAttribute("SIG").toString());
System.out.println(breakpoint.getMarker().getAttribute(IMarker.LINE_NUMBER).toString());

IJavaStackFrame[] frames = (IJavaStackFrame[]) thread.getStackFrames();
    for(int i=0;i<frames.length;i++){
    List variables = frames[i].getArgumentTypeNames();
    Iterator iter = variables.iterator();
    while(iter.hasNext()){
         System.out.println(iter.next().toString());}
    }
}

Sorry for the long code listing. The problem happens at the start of the IJavaStackFrame[] block. The first 3 lines, METHOD, SIG and LINE_NUMBER will print to the console, but then in the run-time workbench the perspective changes to Debug, and the first line of code in the method the breakpoint is set at is highlighted and I have to click Resume to step through the execution for each method a breakpoint is set at.

With out the IJavaStackFrame[] block the code performs as I expected it to. The debugee is launch, the breakpoints are hit the debugee continues as if they weren't there - i.e just like a normal run launch, and information gets printed out to console.

Thanks so much for your patience and time.

Joe

Darin Wright wrote:

From the description provided, it sounds like you are doing the right
thing to avoid suspending the thread.

We have tests that demonstrate this behavior (see org.eclipse.jdt.debug.tests plugin - JavaBreakpointListenerTests). To be


sure, I added a test for method breakpoints, and it all seems to be working. Perhaps you could provide us with a test case or small example that demonstrates the problem you are having (i.e. code that we can use

to
replicate the problem)?

Darin



<SNIPPED>
_______________________________________________
jdt-debug-dev mailing list
jdt-debug-dev@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/jdt-debug-dev


_______________________________________________
jdt-debug-dev mailing list
jdt-debug-dev@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/jdt-debug-dev




Back to the top