8204110: serviceability/sa/ClhsdbSymbol.java and ClhsdbInspect.java failed when running in CDS mode
ClhsdbSymbol - added printing of symbols from shared table. ClhsdbInspect - find type via FileMapInfo if guessTypeForAddress returns null and sharing is enabled. Reviewed-by: jgeorge, sspitsyn, iklam
This commit is contained in:
parent
f56c0b79d8
commit
cc4dcf32d3
@ -49,6 +49,7 @@ import sun.jvm.hotspot.code.NMethod;
|
|||||||
import sun.jvm.hotspot.debugger.Address;
|
import sun.jvm.hotspot.debugger.Address;
|
||||||
import sun.jvm.hotspot.debugger.OopHandle;
|
import sun.jvm.hotspot.debugger.OopHandle;
|
||||||
import sun.jvm.hotspot.classfile.ClassLoaderDataGraph;
|
import sun.jvm.hotspot.classfile.ClassLoaderDataGraph;
|
||||||
|
import sun.jvm.hotspot.memory.FileMapInfo;
|
||||||
import sun.jvm.hotspot.memory.SymbolTable;
|
import sun.jvm.hotspot.memory.SymbolTable;
|
||||||
import sun.jvm.hotspot.memory.SystemDictionary;
|
import sun.jvm.hotspot.memory.SystemDictionary;
|
||||||
import sun.jvm.hotspot.memory.Universe;
|
import sun.jvm.hotspot.memory.Universe;
|
||||||
@ -89,6 +90,7 @@ import sun.jvm.hotspot.ui.tree.OopTreeNodeAdapter;
|
|||||||
import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
|
import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
|
||||||
import sun.jvm.hotspot.utilities.AddressOps;
|
import sun.jvm.hotspot.utilities.AddressOps;
|
||||||
import sun.jvm.hotspot.utilities.Assert;
|
import sun.jvm.hotspot.utilities.Assert;
|
||||||
|
import sun.jvm.hotspot.utilities.CompactHashTable;
|
||||||
import sun.jvm.hotspot.utilities.HeapProgressThunk;
|
import sun.jvm.hotspot.utilities.HeapProgressThunk;
|
||||||
import sun.jvm.hotspot.utilities.LivenessPathElement;
|
import sun.jvm.hotspot.utilities.LivenessPathElement;
|
||||||
import sun.jvm.hotspot.utilities.MethodArray;
|
import sun.jvm.hotspot.utilities.MethodArray;
|
||||||
@ -637,12 +639,22 @@ public class CommandProcessor {
|
|||||||
},
|
},
|
||||||
new Command("symboldump", "symboldump", false) {
|
new Command("symboldump", "symboldump", false) {
|
||||||
public void doit(Tokens t) {
|
public void doit(Tokens t) {
|
||||||
SymbolTable.getTheTable().symbolsDo(new SymbolTable.SymbolVisitor() {
|
SymbolTable theTable = SymbolTable.getTheTable();
|
||||||
|
theTable.symbolsDo(new SymbolTable.SymbolVisitor() {
|
||||||
public void visit(Symbol sym) {
|
public void visit(Symbol sym) {
|
||||||
sym.printValueOn(out);
|
sym.printValueOn(out);
|
||||||
out.println();
|
out.println();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
CompactHashTable sharedTable = theTable.getSharedTable();
|
||||||
|
if (sharedTable != null) {
|
||||||
|
sharedTable.symbolsDo(new CompactHashTable.SymbolVisitor() {
|
||||||
|
public void visit(Symbol sym) {
|
||||||
|
sym.printValueOn(out);
|
||||||
|
out.println();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new Command("flags", "flags [ flag | -nd ]", false) {
|
new Command("flags", "flags [ flag | -nd ]", false) {
|
||||||
@ -1048,6 +1060,15 @@ public class CommandProcessor {
|
|||||||
}
|
}
|
||||||
if (node == null) {
|
if (node == null) {
|
||||||
Type type = VM.getVM().getTypeDataBase().guessTypeForAddress(a);
|
Type type = VM.getVM().getTypeDataBase().guessTypeForAddress(a);
|
||||||
|
if (type == null && VM.getVM().isSharingEnabled()) {
|
||||||
|
// Check if the value falls in the _md_region
|
||||||
|
Address loc1 = a.getAddressAt(0);
|
||||||
|
FileMapInfo cdsFileMapInfo = VM.getVM().getFileMapInfo();
|
||||||
|
if (cdsFileMapInfo.inCopiedVtableSpace(loc1)) {
|
||||||
|
type = cdsFileMapInfo.getTypeForVptrAddress(loc1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
if (type != null) {
|
if (type != null) {
|
||||||
out.println("Type is " + type.getName() + " (size of " + type.getSize() + ")");
|
out.println("Type is " + type.getName() + " (size of " + type.getSize() + ")");
|
||||||
node = new CTypeTreeNodeAdapter(a, type, null);
|
node = new CTypeTreeNodeAdapter(a, type, null);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -65,6 +65,10 @@ public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
|
|||||||
return table;
|
return table;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CompactHashTable getSharedTable() {
|
||||||
|
return sharedTable;
|
||||||
|
}
|
||||||
|
|
||||||
public static long getSeed() {
|
public static long getSeed() {
|
||||||
return (long) seedField.getValue();
|
return (long) seedField.getValue();
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -119,4 +119,39 @@ public class CompactHashTable extends VMObject {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface SymbolVisitor {
|
||||||
|
public void visit(Symbol sym);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void symbolsDo(SymbolVisitor visitor) {
|
||||||
|
long symOffset;
|
||||||
|
Symbol sym;
|
||||||
|
Address baseAddress = baseAddressField.getValue(addr);
|
||||||
|
Address bucket = bucketsField.getValue(addr);
|
||||||
|
for (long index = 0; index < bucketCount(); index++) {
|
||||||
|
int bucketInfo = (int)bucket.getCIntegerAt(index * uintSize, uintSize, true);
|
||||||
|
int bucketOffset = bucketOffset(bucketInfo);
|
||||||
|
int nextBucketInfo = (int)bucket.getCIntegerAt((index+1) * uintSize, uintSize, true);
|
||||||
|
int nextBucketOffset = bucketOffset(nextBucketInfo);
|
||||||
|
|
||||||
|
Address entry = entriesField.getValue(addr).addOffsetTo(bucketOffset * uintSize);
|
||||||
|
|
||||||
|
if (isValueOnlyBucket(bucketInfo)) {
|
||||||
|
symOffset = entry.getCIntegerAt(0, uintSize, true);
|
||||||
|
sym = Symbol.create(baseAddress.addOffsetTo(symOffset));
|
||||||
|
visitor.visit(sym);
|
||||||
|
} else {
|
||||||
|
Address entryMax = entriesField.getValue(addr).addOffsetTo(nextBucketOffset * uintSize);
|
||||||
|
while (entry.lessThan(entryMax)) {
|
||||||
|
symOffset = entry.getCIntegerAt(uintSize, uintSize, true);
|
||||||
|
Address symAddr = baseAddress.addOffsetTo(symOffset);
|
||||||
|
sym = Symbol.create(symAddr);
|
||||||
|
visitor.visit(sym);
|
||||||
|
entry = entry.addOffsetTo(2 * uintSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user