< prev index next >

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

Print this page

        

*** 36,68 **** Address libptr = dbg.findLibPtrByAddress(rip); Address cfa = context.getRegisterAsAddress(AMD64ThreadContext.RBP); DwarfParser dwarf = null; if (libptr != null) { // Native frame - try { dwarf = new DwarfParser(libptr); dwarf.processDwarf(rip); cfa = ((dwarf.getCFARegister() == AMD64ThreadContext.RBP) && !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. --- 36,76 ---- Address libptr = dbg.findLibPtrByAddress(rip); Address cfa = context.getRegisterAsAddress(AMD64ThreadContext.RBP); DwarfParser dwarf = null; if (libptr != null) { // Native frame dwarf = new DwarfParser(libptr); + try { dwarf.processDwarf(rip); + } catch (DebuggerException e) { + // DWARF processing should succeed when the frame is native + // but it might fail if Common Information Entry (CIE) has language + // personality routine and/or Language Specific Data Area (LSDA). + return new LinuxAMD64CFrame(dbg, cfa, rip, dwarf, true); + } cfa = ((dwarf.getCFARegister() == AMD64ThreadContext.RBP) && !dwarf.isBPOffsetAvailable()) ? context.getRegisterAsAddress(AMD64ThreadContext.RBP) : context.getRegisterAsAddress(dwarf.getCFARegister()) .addOffsetTo(dwarf.getCFAOffset()); } return (cfa == null) ? null : new LinuxAMD64CFrame(dbg, cfa, rip, dwarf); } private LinuxAMD64CFrame(LinuxDebugger dbg, Address cfa, Address rip, DwarfParser dwarf) { + this(dbg, cfa, rip, dwarf, false); + } + + private LinuxAMD64CFrame(LinuxDebugger dbg, Address cfa, Address rip, DwarfParser dwarf, boolean finalFrame) { super(dbg.getCDebugger()); this.cfa = cfa; this.rip = rip; this.dbg = dbg; this.dwarf = dwarf; + this.finalFrame = finalFrame; } // override base class impl to avoid ELF parsing public ClosestSymbol closestSymbolToPC() { // try native lookup in debugger.
*** 121,131 **** } return isValidFrame(nextCFA, context) ? nextCFA : null; } ! private DwarfParser getNextDwarf(Address nextPC) { DwarfParser nextDwarf = null; if ((dwarf != null) && dwarf.isIn(nextPC)) { nextDwarf = dwarf; } else { --- 129,151 ---- } return isValidFrame(nextCFA, context) ? nextCFA : null; } ! @Override ! public CFrame sender(ThreadProxy thread) { ! if (finalFrame) { ! return null; ! } ! ! ThreadContext context = thread.getContext(); ! ! Address nextPC = getNextPC(dwarf != null); ! if (nextPC == null) { ! return null; ! } ! DwarfParser nextDwarf = null; if ((dwarf != null) && dwarf.isIn(nextPC)) { nextDwarf = dwarf; } else {
*** 138,163 **** } } } 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; } --- 158,177 ---- } } } if (nextDwarf != null) { + try { nextDwarf.processDwarf(nextPC); + } catch (DebuggerException e) { + // DWARF processing should succeed when the frame is native + // but it might fail if Common Information Entry (CIE) has language + // personality routine and/or Language Specific Data Area (LSDA). + return new LinuxAMD64CFrame(dbg, null, nextPC, nextDwarf, true); } } Address nextCFA = getNextCFA(nextDwarf, context); return isValidFrame(nextCFA, context) ? new LinuxAMD64CFrame(dbg, nextCFA, nextPC, nextDwarf) : null; }
*** 165,170 **** --- 179,185 ---- private static final int ADDRESS_SIZE = 8; private Address rip; private Address cfa; private LinuxDebugger dbg; private DwarfParser dwarf; + private boolean finalFrame; }
< prev index next >