提交 170a4dca 编写于 作者: K kevinw

6313816: SA: jstack -m fails on Win32 : UnalignedAddressException

Reviewed-by: sla, poonam
上级 fc34a84b
...@@ -28,10 +28,10 @@ import java.io.*; ...@@ -28,10 +28,10 @@ import java.io.*;
import java.util.*; import java.util.*;
import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.debugger.cdbg.*; import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.x86.*;
import sun.jvm.hotspot.debugger.cdbg.basic.amd64.*;
import sun.jvm.hotspot.debugger.x86.*; import sun.jvm.hotspot.debugger.x86.*;
import sun.jvm.hotspot.debugger.amd64.*; import sun.jvm.hotspot.debugger.amd64.*;
import sun.jvm.hotspot.debugger.windows.x86.*;
import sun.jvm.hotspot.debugger.windows.amd64.*;
import sun.jvm.hotspot.utilities.AddressOps; import sun.jvm.hotspot.utilities.AddressOps;
class WindbgCDebugger implements CDebugger { class WindbgCDebugger implements CDebugger {
...@@ -75,14 +75,14 @@ class WindbgCDebugger implements CDebugger { ...@@ -75,14 +75,14 @@ class WindbgCDebugger implements CDebugger {
if (ebp == null) return null; if (ebp == null) return null;
Address pc = context.getRegisterAsAddress(X86ThreadContext.EIP); Address pc = context.getRegisterAsAddress(X86ThreadContext.EIP);
if (pc == null) return null; if (pc == null) return null;
return new X86CFrame(this, ebp, pc); return new WindowsX86CFrame(dbg, ebp, pc);
} else if (dbg.getCPU().equals("amd64")) { } else if (dbg.getCPU().equals("amd64")) {
AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext(); AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
Address rbp = context.getRegisterAsAddress(AMD64ThreadContext.RBP); Address rbp = context.getRegisterAsAddress(AMD64ThreadContext.RBP);
if (rbp == null) return null; if (rbp == null) return null;
Address pc = context.getRegisterAsAddress(AMD64ThreadContext.RIP); Address pc = context.getRegisterAsAddress(AMD64ThreadContext.RIP);
if (pc == null) return null; if (pc == null) return null;
return new AMD64CFrame(this, rbp, pc); return new WindowsAMD64CFrame(dbg, rbp, pc);
} else { } else {
// unsupported CPU! // unsupported CPU!
return null; return null;
......
...@@ -22,26 +22,26 @@ ...@@ -22,26 +22,26 @@
* *
*/ */
package sun.jvm.hotspot.debugger.cdbg.basic.amd64; package sun.jvm.hotspot.debugger.windows.amd64;
import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.debugger.amd64.*; import sun.jvm.hotspot.debugger.amd64.*;
import sun.jvm.hotspot.debugger.cdbg.*; import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*; import sun.jvm.hotspot.debugger.cdbg.basic.*;
import sun.jvm.hotspot.debugger.windbg.*;
/** Basic AMD64 frame functionality providing sender() functionality. */ public class WindowsAMD64CFrame extends BasicCFrame {
public class AMD64CFrame extends BasicCFrame {
private Address rbp; private Address rbp;
private Address pc; private Address pc;
private static final int ADDRESS_SIZE = 8; private static final int ADDRESS_SIZE = 8;
/** Constructor for topmost frame */ /** Constructor for topmost frame */
public AMD64CFrame(CDebugger dbg, Address rbp, Address pc) { public WindowsAMD64CFrame(WindbgDebugger dbg, Address rbp, Address pc) {
super(dbg); super(dbg.getCDebugger());
this.rbp = rbp; this.rbp = rbp;
this.pc = pc; this.pc = pc;
this.dbg = dbg;
} }
public CFrame sender(ThreadProxy thread) { public CFrame sender(ThreadProxy thread) {
...@@ -52,15 +52,20 @@ public class AMD64CFrame extends BasicCFrame { ...@@ -52,15 +52,20 @@ public class AMD64CFrame extends BasicCFrame {
return null; return null;
} }
// Check alignment of rbp
if ( dbg.getAddressValue(rbp) % ADDRESS_SIZE != 0) {
return null;
}
Address nextRBP = rbp.getAddressAt( 0 * ADDRESS_SIZE); Address nextRBP = rbp.getAddressAt( 0 * ADDRESS_SIZE);
if (nextRBP == null) { if (nextRBP == null || nextRBP.lessThanOrEqual(rbp)) {
return null; return null;
} }
Address nextPC = rbp.getAddressAt( 1 * ADDRESS_SIZE); Address nextPC = rbp.getAddressAt( 1 * ADDRESS_SIZE);
if (nextPC == null) { if (nextPC == null) {
return null; return null;
} }
return new AMD64CFrame(dbg(), nextRBP, nextPC); return new WindowsAMD64CFrame(dbg, nextRBP, nextPC);
} }
public Address pc() { public Address pc() {
...@@ -70,4 +75,6 @@ public class AMD64CFrame extends BasicCFrame { ...@@ -70,4 +75,6 @@ public class AMD64CFrame extends BasicCFrame {
public Address localVariableBase() { public Address localVariableBase() {
return rbp; return rbp;
} }
private WindbgDebugger dbg;
} }
...@@ -22,26 +22,26 @@ ...@@ -22,26 +22,26 @@
* *
*/ */
package sun.jvm.hotspot.debugger.cdbg.basic.x86; package sun.jvm.hotspot.debugger.windows.x86;
import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.debugger.x86.*; import sun.jvm.hotspot.debugger.x86.*;
import sun.jvm.hotspot.debugger.cdbg.*; import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*; import sun.jvm.hotspot.debugger.cdbg.basic.*;
import sun.jvm.hotspot.debugger.windbg.*;
/** Basic X86 frame functionality providing sender() functionality. */ public class WindowsX86CFrame extends BasicCFrame {
public class X86CFrame extends BasicCFrame {
private Address ebp; private Address ebp;
private Address pc; private Address pc;
private static final int ADDRESS_SIZE = 4; private static final int ADDRESS_SIZE = 4;
/** Constructor for topmost frame */ /** Constructor for topmost frame */
public X86CFrame(CDebugger dbg, Address ebp, Address pc) { public WindowsX86CFrame(WindbgDebugger dbg, Address ebp, Address pc) {
super(dbg); super(dbg.getCDebugger());
this.ebp = ebp; this.ebp = ebp;
this.pc = pc; this.pc = pc;
this.dbg = dbg;
} }
public CFrame sender(ThreadProxy thread) { public CFrame sender(ThreadProxy thread) {
...@@ -52,15 +52,20 @@ public class X86CFrame extends BasicCFrame { ...@@ -52,15 +52,20 @@ public class X86CFrame extends BasicCFrame {
return null; return null;
} }
// Check alignment of ebp
if ( dbg.getAddressValue(ebp) % ADDRESS_SIZE != 0) {
return null;
}
Address nextEBP = ebp.getAddressAt( 0 * ADDRESS_SIZE); Address nextEBP = ebp.getAddressAt( 0 * ADDRESS_SIZE);
if (nextEBP == null) { if (nextEBP == null || nextEBP.lessThanOrEqual(ebp)) {
return null; return null;
} }
Address nextPC = ebp.getAddressAt( 1 * ADDRESS_SIZE); Address nextPC = ebp.getAddressAt( 1 * ADDRESS_SIZE);
if (nextPC == null) { if (nextPC == null) {
return null; return null;
} }
return new X86CFrame(dbg(), nextEBP, nextPC); return new WindowsX86CFrame(dbg, nextEBP, nextPC);
} }
public Address pc() { public Address pc() {
...@@ -70,4 +75,6 @@ public class X86CFrame extends BasicCFrame { ...@@ -70,4 +75,6 @@ public class X86CFrame extends BasicCFrame {
public Address localVariableBase() { public Address localVariableBase() {
return ebp; return ebp;
} }
private WindbgDebugger dbg;
} }
...@@ -48,8 +48,6 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/amd64/*.java \ ...@@ -48,8 +48,6 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/amd64/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/x86/*.java \ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/x86/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/*.java \ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/basic/*.java \ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/basic/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/basic/x86/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/basic/amd64/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/dummy/*.java \ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/dummy/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/*.java \ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/amd64/*.java \ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/amd64/*.java \
...@@ -70,6 +68,8 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/win32/coff/*.java \ ...@@ -70,6 +68,8 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/win32/coff/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/*.java \ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/amd64/*.java \ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/amd64/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/x86/*.java \ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/x86/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windows/x86/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windows/amd64/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/x86/*.java \ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/x86/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/gc_implementation/g1/*.java \ $(AGENT_SRC_DIR)/sun/jvm/hotspot/gc_implementation/g1/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/gc_implementation/parallelScavenge/*.java \ $(AGENT_SRC_DIR)/sun/jvm/hotspot/gc_implementation/parallelScavenge/*.java \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册