Created
April 19, 2012 04:23
-
-
Save rednaxelafx/2418558 to your computer and use it in GitHub Desktop.
Wrong filter predicate of visible locals in SA JSDB. Diff against jdk8/jdk8/hotspot. Screenshot http://dl.iteye.com/upload/picture/pic/111635/c03df4f1-8ee1-30aa-b15e-dd16ef695d2d.png
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ jps | |
32046 Demo | |
32069 Jps | |
$ pgrep -u sajia java | |
32046 | |
$ alias | grep clhsdb | |
alias clhsdb='java -classpath .:$JAVA_HOME/lib/sa-jdi.jar sun.jvm.hotspot.CLHSDB' | |
$ clhsdb | |
hsdb> attach 32046 | |
Attaching to process 32046, please wait... | |
hsdb> threads | |
32067 Low Memory Detector | |
32066 C2 CompilerThread1 | |
32065 C2 CompilerThread0 | |
32064 Signal Dispatcher | |
32063 Finalizer | |
32062 Reference Handler | |
32047 main | |
hsdb> universe | |
Heap Parameters: | |
ParallelScavengeHeap [ PSYoungGen [ eden = [0x0000000758600000,0x0000000758883d80,0x00000007603c0000] , from = [0x00000007618b0000,0x00000007618b0000,0x0000000762da0000] , to = [0x00000007603c0000,0x00000007603c0000,0x00000007618b0000] ] PSOldGen [ [0x0000000609200000,0x0000000609200000,0x000000061e140000] ] PSPermGen [ [0x0000000604000000,0x000000060427d438,0x00000006054c0000] ] ] | |
hsdb> jseval "jvm" | |
Java Hotspot Server 64 bit VM (build 20.5-b03) | |
hsdb> jseval "jvm.threads" | |
[Thread (address=0x000000075862c7f0, name=Low Memory Detector), Thread (address=0x000000075862c6c0, name=C2 CompilerThread1), Thread (address=0x000000075862c590, name=C2 CompilerThread0), Thread (address=0x000000075862c460, name=Signal Dispatcher), Thread (address=0x0000000758601320, name=Finalizer), Thread (address=0x00000007586011e8, name=Reference Handler), Thread (address=0x0000000758600840, name=main)] | |
hsdb> jseval "jvm.threads[6].frames" | |
[Frame (method=java.io.FileInputStream.readBytes(byte[], int, int), bci=0, line=0), Frame (method=java.io.FileInputStream.read(byte[], int, int), bci=4, line=220), Frame (method=java.io.BufferedInputStream.fill(), bci=175, line=218), Frame (method=java.io.BufferedInputStream.read(), bci=12, line=237), Frame (method=Demo.main(java.lang.String[]), bci=3, line=5)] | |
hsdb> jseval "mainFrame = jvm.threads[6].frames[4]" | |
Frame (method=Demo.main(java.lang.String[]), bci=3, line=5) | |
hsdb> jseval "for (var p in mainFrame) println(p)" | |
bci | |
thisObject | |
locals | |
thread | |
line | |
method | |
hsdb> jseval "mainFrame.method" | |
Method Demo.main(java.lang.String[]) | |
hsdb> jseval "mainFrame.locals" | |
{} | |
hsdb> | |
hsdb> jseval "sa.threads" | |
sun.jvm.hotspot.runtime.Threads@3f6dadf9 | |
hsdb> jseval "sa.threads.first().next().next().next().next().next().next().getThreadName()" | |
main | |
hsdb> jseval "jt = sa.threads.first().next().next().next().next().next().next()" | |
sun.jvm.hotspot.runtime.JavaThread@0x0000000050401800 | |
hsdb> jseval "jt.getLastJavaVFrameDbg()" | |
sun.jvm.hotspot.runtime.InterpretedVFrame@4486af30 | |
hsdb> jseval "jt.getLastJavaVFrameDbg().javaSender().javaSender().javaSender().javaSender().getMethod().name.asString()" | |
main | |
hsdb> jseval "jvf = jt.getLastJavaVFrameDbg().javaSender().javaSender().javaSender().javaSender()" | |
sun.jvm.hotspot.runtime.InterpretedVFrame@44bb43fb | |
hsdb> jseval "jvf.locals" | |
sun.jvm.hotspot.runtime.StackValueCollection@5de9ac4 | |
hsdb> jseval "jvf.locals.get(0).print(); println('')" | |
<0x0000000758633a00> | |
hsdb> inspect 0x0000000758633a00 | |
instance of ObjArray @ 0x0000000758633a00 @ 0x0000000758633a00 (size = 24) | |
_mark: 1 | |
0: "alpha" @ 0x0000000758633a30 Oop for java/lang/String @ 0x0000000758633a30 | |
1: "beta" @ 0x0000000758633ae8 Oop for java/lang/String @ 0x0000000758633ae8 | |
hsdb> whatis 0x0000000758633a00 | |
Address 0x0000000758633a00: In unknown section of Java heap | |
hsdb> universe | |
Heap Parameters: | |
ParallelScavengeHeap [ PSYoungGen [ eden = [0x0000000758600000,0x0000000758883d80,0x00000007603c0000] , from = [0x00000007618b0000,0x00000007618b0000,0x0000000762da0000] , to = [0x00000007603c0000,0x00000007603c0000,0x00000007618b0000] ] PSOldGen [ [0x0000000609200000,0x0000000609200000,0x000000061e140000] ] PSPermGen [ [0x0000000604000000,0x000000060427d438,0x00000006054c0000] ] ] | |
hsdb> quit | |
$ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ # without patch | |
$ java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -classpath .:$JAVA_HOME/lib/sa-jdi.jar sun.jvm.hotspot.CLHSDB | |
Listening for transport dt_socket at address: 8000 | |
hsdb> verbose true | |
hsdb> attach 32046 | |
Attaching to process 32046, please wait... | |
hsdb> jseval "mainFrame = jvm.threads[6].frames[4]" | |
Frame (method=Demo.main(java.lang.String[]), bci=3, line=5) | |
hsdb> jseval "mainFrame.locals" | |
Listening for transport dt_socket at address: 8000 | |
{} | |
hsdb> quit | |
$ # with patch applied | |
$ java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -classpath .:/tmp/ths/make/linux/linux_amd64_compiler2/generated/sa-jdi.jar sun.jvm.hotspot.CLHSDB | |
Listening for transport dt_socket at address: 8000 | |
hsdb> verbose true | |
hsdb> attach 32046 | |
Attaching to process 32046, please wait... | |
WARNING: Hotspot VM version 20.5-b03 does not match with SA version 20.0-b12-internal. You may see unexpected results. | |
hsdb> jseval "mainFrame = jvm.threads[6].frames[4]" | |
Frame (method=Demo.main(java.lang.String[]), bci=3, line=5) | |
hsdb> jseval "mainFrame.locals" | |
{args=Object 0x0000000758633a00} | |
hsdb> Listening for transport dt_socket at address: 8000 | |
inspect 0x0000000758633a00 | |
instance of ObjArray @ 0x0000000758633a00 @ 0x0000000758633a00 (size = 24) | |
_mark: 1 | |
0: "alpha" @ 0x0000000758633a30 Oop for java/lang/String @ 0x0000000758633a30 | |
1: "beta" @ 0x0000000758633ae8 Oop for java/lang/String @ 0x0000000758633ae8 | |
hsdb> quit | |
$ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ java -version | |
java version "1.6.0_30" | |
Java(TM) SE Runtime Environment (build 1.6.0_30-b12) | |
Java HotSpot(TM) 64-Bit Server VM (build 20.5-b03, mixed mode) | |
$ cat > Demo.java | |
import java.util.*; | |
public class Demo { | |
public static void main(String[] args) throws Exception { | |
System.in.read(); | |
System.out.println(Arrays.toString(args)); | |
} | |
} | |
$ javac -g Demo.java | |
$ javap -verbose -private Demo | |
Compiled from "Demo.java" | |
public class Demo extends java.lang.Object | |
SourceFile: "Demo.java" | |
minor version: 0 | |
major version: 50 | |
Constant pool: | |
const #1 = Method #8.#24; // java/lang/Object."<init>":()V | |
const #2 = Field #25.#26; // java/lang/System.in:Ljava/io/InputStream; | |
const #3 = Method #27.#28; // java/io/InputStream.read:()I | |
const #4 = Field #25.#29; // java/lang/System.out:Ljava/io/PrintStream; | |
const #5 = Method #30.#31; // java/util/Arrays.toString:([Ljava/lang/Object;)Ljava/lang/String; | |
const #6 = Method #32.#33; // java/io/PrintStream.println:(Ljava/lang/String;)V | |
const #7 = class #34; // Demo | |
const #8 = class #35; // java/lang/Object | |
const #9 = Asciz <init>; | |
const #10 = Asciz ()V; | |
const #11 = Asciz Code; | |
const #12 = Asciz LineNumberTable; | |
const #13 = Asciz LocalVariableTable; | |
const #14 = Asciz this; | |
const #15 = Asciz LDemo;; | |
const #16 = Asciz main; | |
const #17 = Asciz ([Ljava/lang/String;)V; | |
const #18 = Asciz args; | |
const #19 = Asciz [Ljava/lang/String;; | |
const #20 = Asciz Exceptions; | |
const #21 = class #36; // java/lang/Exception | |
const #22 = Asciz SourceFile; | |
const #23 = Asciz Demo.java; | |
const #24 = NameAndType #9:#10;// "<init>":()V | |
const #25 = class #37; // java/lang/System | |
const #26 = NameAndType #38:#39;// in:Ljava/io/InputStream; | |
const #27 = class #40; // java/io/InputStream | |
const #28 = NameAndType #41:#42;// read:()I | |
const #29 = NameAndType #43:#44;// out:Ljava/io/PrintStream; | |
const #30 = class #45; // java/util/Arrays | |
const #31 = NameAndType #46:#47;// toString:([Ljava/lang/Object;)Ljava/lang/String; | |
const #32 = class #48; // java/io/PrintStream | |
const #33 = NameAndType #49:#50;// println:(Ljava/lang/String;)V | |
const #34 = Asciz Demo; | |
const #35 = Asciz java/lang/Object; | |
const #36 = Asciz java/lang/Exception; | |
const #37 = Asciz java/lang/System; | |
const #38 = Asciz in; | |
const #39 = Asciz Ljava/io/InputStream;; | |
const #40 = Asciz java/io/InputStream; | |
const #41 = Asciz read; | |
const #42 = Asciz ()I; | |
const #43 = Asciz out; | |
const #44 = Asciz Ljava/io/PrintStream;; | |
const #45 = Asciz java/util/Arrays; | |
const #46 = Asciz toString; | |
const #47 = Asciz ([Ljava/lang/Object;)Ljava/lang/String;; | |
const #48 = Asciz java/io/PrintStream; | |
const #49 = Asciz println; | |
const #50 = Asciz (Ljava/lang/String;)V; | |
{ | |
public Demo(); | |
Code: | |
Stack=1, Locals=1, Args_size=1 | |
0: aload_0 | |
1: invokespecial #1; //Method java/lang/Object."<init>":()V | |
4: return | |
LineNumberTable: | |
line 3: 0 | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 5 0 this LDemo; | |
public static void main(java.lang.String[]) throws java.lang.Exception; | |
Code: | |
Stack=2, Locals=1, Args_size=1 | |
0: getstatic #2; //Field java/lang/System.in:Ljava/io/InputStream; | |
3: invokevirtual #3; //Method java/io/InputStream.read:()I | |
6: pop | |
7: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream; | |
10: aload_0 | |
11: invokestatic #5; //Method java/util/Arrays.toString:([Ljava/lang/Object;)Ljava/lang/String; | |
14: invokevirtual #6; //Method java/io/PrintStream.println:(Ljava/lang/String;)V | |
17: return | |
LineNumberTable: | |
line 5: 0 | |
line 6: 7 | |
line 7: 17 | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 18 0 args [Ljava/lang/String; | |
Exceptions: | |
throws java.lang.Exception | |
} | |
$ java Demo alpha beta | |
[alpha, beta] | |
$ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -r bbdc75c217e7 agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaFrame.java | |
--- a/agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaFrame.java Thu Mar 22 12:41:09 2012 -0700 | |
+++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaFrame.java Thu Apr 19 12:19:40 2012 +0800 | |
@@ -153,7 +153,8 @@ | |
List visibleVars = new ArrayList(0); | |
for (int i = 0; i < localVars.length; i++) { | |
LocalVariableTableElement cur = localVars[i]; | |
- if (cur.getStartBCI() >= bci && cur.getLength() > 0) { | |
+ int startBCI = cur.getStartBCI(); | |
+ if (startBCI <= bci && bci < startBCI + cur.getLength()) { | |
visibleVars.add(cur); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment