--- old/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/LinuxCDebugger.java 2019-11-28 21:31:14.062604800 +0900 +++ new/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/LinuxCDebugger.java 2019-11-28 21:31:13.811456000 +0900 @@ -90,11 +90,38 @@ return new LinuxX86CFrame(dbg, ebp, pc); } else if (cpu.equals("amd64")) { AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext(); - Address rbp = context.getRegisterAsAddress(AMD64ThreadContext.RBP); - if (rbp == null) return null; Address pc = context.getRegisterAsAddress(AMD64ThreadContext.RIP); if (pc == null) return null; - return new LinuxAMD64CFrame(dbg, rbp, pc); + + long libptr = dbg.findLibPtrByAddress(pc); + if (libptr == 0L) { // Java frame + Address rbp = context.getRegisterAsAddress(AMD64ThreadContext.RBP); + if (rbp == null) { + return null; + } + return new LinuxAMD64CFrame(dbg, rbp, pc, null); + } else { // Native frame + DwarfParser dwarf; + try { + dwarf = new DwarfParser(libptr); + } catch (DebuggerException e) { + Address rbp = context.getRegisterAsAddress(AMD64ThreadContext.RBP); + if (rbp == null) { + return null; + } + return new LinuxAMD64CFrame(dbg, rbp, pc, null); + } + dwarf.processDwarf(pc); + Address cfa = ((dwarf.getCFARegister() == AMD64ThreadContext.RBP) && + !dwarf.isBPOffsetAvailable()) + ? context.getRegisterAsAddress(AMD64ThreadContext.RBP) + : context.getRegisterAsAddress(dwarf.getCFARegister()) + .addOffsetTo(dwarf.getCFAOffset()); + if (cfa == null) { + return null; + } + return new LinuxAMD64CFrame(dbg, cfa, pc, dwarf); + } } else if (cpu.equals("sparc")) { SPARCThreadContext context = (SPARCThreadContext) thread.getContext(); Address sp = context.getRegisterAsAddress(SPARCThreadContext.R_SP);