< prev index next >

src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java

Print this page

        

*** 34,43 **** --- 34,44 ---- public static LinuxAMD64CFrame getTopFrame(LinuxDebugger dbg, Address rip, ThreadContext context) { Address libptr = dbg.findLibPtrByAddress(rip); Address cfa = context.getRegisterAsAddress(AMD64ThreadContext.RBP); DwarfParser dwarf = null; + boolean unsupportedDwarf = false; if (libptr != null) { // Native frame try { dwarf = new DwarfParser(libptr); dwarf.processDwarf(rip);
*** 45,68 **** !dwarf.isBPOffsetAvailable()) ? context.getRegisterAsAddress(AMD64ThreadContext.RBP) : context.getRegisterAsAddress(dwarf.getCFARegister()) .addOffsetTo(dwarf.getCFAOffset()); } catch (DebuggerException e) { ! // Bail out to Java frame case } } return (cfa == null) ? null ! : new LinuxAMD64CFrame(dbg, cfa, rip, dwarf); } ! private LinuxAMD64CFrame(LinuxDebugger dbg, Address cfa, Address rip, DwarfParser dwarf) { super(dbg.getCDebugger()); this.cfa = cfa; this.rip = rip; this.dbg = dbg; this.dwarf = dwarf; } // override base class impl to avoid ELF parsing public ClosestSymbol closestSymbolToPC() { // try native lookup in debugger. --- 46,78 ---- !dwarf.isBPOffsetAvailable()) ? context.getRegisterAsAddress(AMD64ThreadContext.RBP) : context.getRegisterAsAddress(dwarf.getCFARegister()) .addOffsetTo(dwarf.getCFAOffset()); } catch (DebuggerException e) { ! if (dwarf != null) { ! // DWARF processing should succeed when the frame is native ! // but it might fail if CIE has language personality routine ! // and/or LSDA. ! dwarf = null; ! unsupportedDwarf = true; ! } else { ! throw e; ! } } } return (cfa == null) ? null ! : new LinuxAMD64CFrame(dbg, cfa, rip, dwarf, !unsupportedDwarf); } ! private LinuxAMD64CFrame(LinuxDebugger dbg, Address cfa, Address rip, DwarfParser dwarf, boolean possibleNext) { super(dbg.getCDebugger()); this.cfa = cfa; this.rip = rip; this.dbg = dbg; this.dwarf = dwarf; + this.possibleNext = possibleNext; } // override base class impl to avoid ELF parsing public ClosestSymbol closestSymbolToPC() { // try native lookup in debugger.
*** 121,133 **** } return isValidFrame(nextCFA, context) ? nextCFA : null; } ! private DwarfParser getNextDwarf(Address nextPC) { ! DwarfParser nextDwarf = null; if ((dwarf != null) && dwarf.isIn(nextPC)) { nextDwarf = dwarf; } else { Address libptr = dbg.findLibPtrByAddress(nextPC); if (libptr != null) { --- 131,155 ---- } return isValidFrame(nextCFA, context) ? nextCFA : null; } ! @Override ! public CFrame sender(ThreadProxy thread) { ! if (!possibleNext) { ! return null; ! } ! ! ThreadContext context = thread.getContext(); ! ! Address nextPC = getNextPC(dwarf != null); ! if (nextPC == null) { ! return null; ! } + DwarfParser nextDwarf = null; + boolean unsupportedDwarf = false; if ((dwarf != null) && dwarf.isIn(nextPC)) { nextDwarf = dwarf; } else { Address libptr = dbg.findLibPtrByAddress(nextPC); if (libptr != null) {
*** 138,170 **** } } } if (nextDwarf != null) { nextDwarf.processDwarf(nextPC); } - - return nextDwarf; - } - - @Override - public CFrame sender(ThreadProxy thread) { - ThreadContext context = thread.getContext(); - - Address nextPC = getNextPC(dwarf != null); - if (nextPC == null) { - return null; } - DwarfParser nextDwarf = getNextDwarf(nextPC); Address nextCFA = getNextCFA(nextDwarf, context); ! return isValidFrame(nextCFA, context) ? new LinuxAMD64CFrame(dbg, nextCFA, nextPC, nextDwarf) ! : null; } // package/class internals only private static final int ADDRESS_SIZE = 8; private Address rip; private Address cfa; private LinuxDebugger dbg; private DwarfParser dwarf; } --- 160,188 ---- } } } if (nextDwarf != null) { + try { nextDwarf.processDwarf(nextPC); + } catch (DebuggerException e) { + // DWARF processing should succeed when the frame is native + // but it might fail if CIE has language personality routine + // and/or LSDA. + nextDwarf = null; + unsupportedDwarf = true; } } Address nextCFA = getNextCFA(nextDwarf, context); ! LinuxAMD64CFrame nextFrame = new LinuxAMD64CFrame(dbg, nextCFA, nextPC, nextDwarf, !unsupportedDwarf); ! return isValidFrame(nextCFA, context) ? nextFrame : null; } // package/class internals only private static final int ADDRESS_SIZE = 8; private Address rip; private Address cfa; private LinuxDebugger dbg; private DwarfParser dwarf; + private boolean possibleNext; }
< prev index next >