6310967: SA: jstack -m produce failures in output
Summary: While looking for the sender frame check that the frame pointer should not be less than the stack pointer.
Reviewed-by: dholmes, sla
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpot.java Mon Jun 11 13:10:14 2012 -0400
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpot.java Thu Jun 14 02:12:46 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -657,7 +657,7 @@
while (fr != null) {
trace.add(new StackTraceEntry(fr, getCDebugger()));
try {
- fr = fr.sender();
+ fr = fr.sender(t);
} catch (AddressException e) {
e.printStackTrace();
showMessageDialog("Error while walking stack; stack trace will be truncated\n(see console for details)",
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/amd64/BsdAMD64CFrame.java Mon Jun 11 13:10:14 2012 -0400
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/amd64/BsdAMD64CFrame.java Thu Jun 14 02:12:46 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
package sun.jvm.hotspot.debugger.bsd.amd64;
import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.debugger.amd64.*;
import sun.jvm.hotspot.debugger.bsd.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*;
@@ -51,8 +52,11 @@
return rbp;
}
- public CFrame sender() {
- if (rbp == null) {
+ public CFrame sender(ThreadProxy thread) {
+ AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
+ Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP);
+
+ if ( (rbp == null) || rbp.lessThan(rsp) ) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86CFrame.java Mon Jun 11 13:10:14 2012 -0400
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86CFrame.java Thu Jun 14 02:12:46 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,7 @@
import sun.jvm.hotspot.debugger.bsd.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*;
+import sun.jvm.hotspot.debugger.x86.*;
final public class BsdX86CFrame extends BasicCFrame {
// package/class internals only
@@ -52,8 +53,11 @@
return ebp;
}
- public CFrame sender() {
- if (ebp == null) {
+ public CFrame sender(ThreadProxy thread) {
+ X86ThreadContext context = (X86ThreadContext) thread.getContext();
+ Address esp = context.getRegisterAsAddress(X86ThreadContext.ESP);
+
+ if ( (ebp == null) || ebp.lessThan(esp) ) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java Mon Jun 11 13:10:14 2012 -0400
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java Thu Jun 14 02:12:46 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -34,7 +34,7 @@
public interface CFrame {
/** Returns null when no more frames on stack */
- public CFrame sender();
+ public CFrame sender(ThreadProxy th);
/** Get the program counter of this frame */
public Address pc();
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/amd64/AMD64CFrame.java Mon Jun 11 13:10:14 2012 -0400
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/amd64/AMD64CFrame.java Thu Jun 14 02:12:46 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
package sun.jvm.hotspot.debugger.cdbg.basic.amd64;
import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.debugger.amd64.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*;
@@ -43,8 +44,11 @@
this.pc = pc;
}
- public CFrame sender() {
- if (rbp == null) {
+ public CFrame sender(ThreadProxy thread) {
+ AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
+ Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP);
+
+ if ( (rbp == null) || rbp.lessThan(rsp) ) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/x86/X86CFrame.java Mon Jun 11 13:10:14 2012 -0400
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/x86/X86CFrame.java Thu Jun 14 02:12:46 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
package sun.jvm.hotspot.debugger.cdbg.basic.x86;
import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.debugger.x86.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*;
@@ -43,8 +44,11 @@
this.pc = pc;
}
- public CFrame sender() {
- if (ebp == null) {
+ public CFrame sender(ThreadProxy thread) {
+ X86ThreadContext context = (X86ThreadContext) thread.getContext();
+ Address esp = context.getRegisterAsAddress(X86ThreadContext.ESP);
+
+ if ( (ebp == null) || ebp.lessThan(esp) ) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java Mon Jun 11 13:10:14 2012 -0400
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java Thu Jun 14 02:12:46 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
package sun.jvm.hotspot.debugger.linux.amd64;
import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.debugger.amd64.*;
import sun.jvm.hotspot.debugger.linux.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*;
@@ -51,8 +52,11 @@
return rbp;
}
- public CFrame sender() {
- if (rbp == null) {
+ public CFrame sender(ThreadProxy thread) {
+ AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
+ Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP);
+
+ if ( (rbp == null) || rbp.lessThan(rsp) ) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/sparc/LinuxSPARCCFrame.java Mon Jun 11 13:10:14 2012 -0400
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/sparc/LinuxSPARCCFrame.java Thu Jun 14 02:12:46 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -57,7 +57,7 @@
return sp;
}
- public CFrame sender() {
+ public CFrame sender(ThreadProxy thread) {
if (sp == null) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java Mon Jun 11 13:10:14 2012 -0400
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java Thu Jun 14 02:12:46 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,7 @@
import sun.jvm.hotspot.debugger.linux.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*;
+import sun.jvm.hotspot.debugger.x86.*;
final public class LinuxX86CFrame extends BasicCFrame {
// package/class internals only
@@ -52,8 +53,11 @@
return ebp;
}
- public CFrame sender() {
- if (ebp == null) {
+ public CFrame sender(ThreadProxy thread) {
+ X86ThreadContext context = (X86ThreadContext) thread.getContext();
+ Address esp = context.getRegisterAsAddress(X86ThreadContext.ESP);
+
+ if ( (ebp == null) || ebp.lessThan(esp) ) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcCFrame.java Mon Jun 11 13:10:14 2012 -0400
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcCFrame.java Thu Jun 14 02:12:46 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,7 +37,7 @@
return fp;
}
- public CFrame sender() {
+ public CFrame sender(ThreadProxy t) {
return sender;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java Mon Jun 11 13:10:14 2012 -0400
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java Thu Jun 14 02:12:46 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -158,7 +158,7 @@
printUnknown(out);
}
}
- f = f.sender();
+ f = f.sender(th);
}
} catch (Exception exp) {
exp.printStackTrace();