< prev index next >
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/LinuxCDebugger.java
Print this page
*** 88,102 ****
Address pc = context.getRegisterAsAddress(X86ThreadContext.EIP);
if (pc == null) return null;
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);
} else if (cpu.equals("sparc")) {
SPARCThreadContext context = (SPARCThreadContext) thread.getContext();
Address sp = context.getRegisterAsAddress(SPARCThreadContext.R_SP);
if (sp == null) return null;
Address pc = context.getRegisterAsAddress(SPARCThreadContext.R_O7);
--- 88,129 ----
Address pc = context.getRegisterAsAddress(X86ThreadContext.EIP);
if (pc == null) return null;
return new LinuxX86CFrame(dbg, ebp, pc);
} else if (cpu.equals("amd64")) {
AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
Address pc = context.getRegisterAsAddress(AMD64ThreadContext.RIP);
if (pc == null) return null;
!
! 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);
if (sp == null) return null;
Address pc = context.getRegisterAsAddress(SPARCThreadContext.R_O7);
< prev index next >