" : " + dataAtEntry(fpTop-8)  + "   (temp entry)\n"); ret.append("   " + Integer.toHexString(fpTop-12) + " : " + dataAtEntry(fpTop-12) + "   saved JTOC \n");
" : " + dataAtEntry(fpTop-8)  + "   (saved EDI)\n");
  private String printThisFrameFull(int depth, int linkaddr, int fpTop, int fpBottom) {    int addr, i;    int limit=0;            // safeguard in case we get a bad fp    int stopLimit=50;       // give up if stack has more than 50 entries    BootMap bmap = owner.bootmap();    int compiledMethodID = bmap.getCompiledMethodID(fpTop, linkaddr);    String depthString;    StringBuffer ret = new StringBuffer();        if (depth==-1)      depthString = "?";    else       depthString = String.valueOf(depth);              // check if this is the frame linking to the system code    // if so, skip it    if (isLinkToBoot(fpTop)) {      return ("frame " + depth + ": " + " <- link to boot C code");    }    // For native stack frame    if (compiledMethodID==NATIVE_METHOD_ID) {      // Note: getNativeProcedureName() not available on Lintel      // ret.append("frame " + depth + ": (native) " + getNativeProcedureName(linkaddr) +       ret.append("frame " + depth + ": (native) " +                  " : " + VM.intAsHexString(linkaddr));      ret.append('\n');      for (addr=(fpTop-4); addr>fpBottom; addr-=4) {	ret.append("   " + Integer.toHexString(addr) +                    " : " + dataAtEntry(addr));        ret.append('\n');      }      return ret.toString();    }    // For Java stack frame    VM_Method mth = bmap.findVMMethod(compiledMethodID, true);    if (mth!=null) {      String class_name = mth.getDeclaringClass().getName().toString();      String method_name = mth.getName().toString();      String method_sig = mth.getDescriptor().toString();      String line;      if (depth==0)            // for IP, get the current line	line = bmap.findLineNumberAsString(compiledMethodID, linkaddr);         else                     // for LR, get the previous line	line = bmap.findPreviousLineNumberAsString(compiledMethodID, linkaddr);        ret.append("frame " + depth + ": " +                  class_name + "." + method_name + ":" + line + " " +                  method_sig + " : " + VM.intAsHexString(linkaddr));      ret.append('\n');      // System.out.println("printThisFrameFull: found " + method_name +      // 			 " for method ID " + compiledMethodID +       // 			 " from fp " + VM.intAsHexString(fpTop));    } else {      ret.append("frame " + depth + ": " +                  "unknown method" +                  " : " + VM.intAsHexString(linkaddr));      ret.append('\n');    }            // label the method ID, return address, JTOC    ret.append("   " + Integer.toHexString(fpTop) + 	       " : " + dataAtEntry(fpTop)  + "   <- FP for this frame \n");    ret.append("   " + Integer.toHexString(fpTop-4) + 	       " : " + dataAtEntry(fpTop-4)  + "   method ID " + 	       read(fpTop-4) + "\n");    ret.append("   " + Integer.toHexString(fpTop-8) + 	       " : " + dataAtEntry(fpTop-8)  + "   (temp entry)\n");    ret.append("   " + Integer.toHexString(fpTop-12) + 	       " : " + dataAtEntry(fpTop-12) + "   saved JTOC \n");        if (fpBottom==0) {      ret.append("   ...frame bottom unknown... \n");      return ret.toString();    }      // the rest is space for paramaters and local vars    // For a regular JVM frame, try to find the VM_Method to map the     // local variables and spill space    if (mth!=null) {      for (addr=(fpTop-16); addr>fpBottom+4; addr-=4) {	ret.append("   " + Integer.toHexString(addr) +                    " : " + dataAtEntry(addr));        ret.append('\n');      }    }     // if the method info is not available, just print the stack values without comments    // catch (BmapNotFoundException e) {    else {      for (addr=(fpTop-16); addr>fpBottom+4; addr-=4) {	ret.append("   " + Integer.toHexString(addr) +                    " : " + dataAtEntry(addr));        ret.append('\n');        	if (limit++>stopLimit) {	  ret.append("   ...abort after " +  stopLimit + " frames...\n");	  return ret.toString();	}      }    }     // if stack too large, it may have been corrupted    // catch (Exception e1) {    // 	 System.out.println("   ...aborted, stack may be corrupted...");    // 	 return;    // }    if (depth!=0)      ret.append("   " + Integer.toHexString(addr) + 		 " : " + dataAtEntry(addr) + "   return address \n");    return ret.toString();  } 