Skip to content

Instantly share code, notes, and snippets.

@rednaxelafx
Created April 19, 2012 04:23
Show Gist options
  • Save rednaxelafx/2418558 to your computer and use it in GitHub Desktop.
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
$ 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
$
$ # 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
$
$ 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]
$
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