use of com.ibm.j9ddr.vm29.pointer.generated.J9ClassPointer in project openj9 by eclipse.
the class J9ObjectStructureFormatter method format.
@Override
public FormatWalkResult format(String type, long address, PrintStream out, Context context, List<IFieldFormatter> fieldFormatters, String[] extraArgs) {
if (type.equalsIgnoreCase("j9object") || type.equalsIgnoreCase("j9indexableobject")) {
J9ClassPointer clazz = null;
J9ObjectPointer object = null;
try {
boolean isArray;
String className;
object = J9ObjectPointer.cast(address);
clazz = J9ObjectHelper.clazz(object);
if (clazz.isNull()) {
out.println("<can not read RAM class address>");
return FormatWalkResult.STOP_WALKING;
}
isArray = J9ClassHelper.isArrayClass(clazz);
className = J9UTF8Helper.stringValue(clazz.romClass().className());
U8Pointer dataStart = U8Pointer.cast(object).add(ObjectModel.getHeaderSize(object));
if (className.equals("java/lang/String")) {
formatStringObject(out, 0, clazz, dataStart, object);
} else if (isArray) {
int begin = DEFAULT_ARRAY_FORMAT_BEGIN;
int end = DEFAULT_ARRAY_FORMAT_END;
if (extraArgs.length > 0) {
begin = Integer.parseInt(extraArgs[0]);
}
if (extraArgs.length > 1) {
end = Integer.parseInt(extraArgs[1]);
}
formatArrayObject(out, clazz, dataStart, J9IndexableObjectPointer.cast(object), begin, end);
} else {
formatObject(out, clazz, dataStart, object);
}
} catch (MemoryFault ex2) {
out.println("Unable to read object clazz at " + object.getHexAddress() + " (clazz = " + clazz.getHexAddress() + ")");
} catch (CorruptDataException ex) {
out.println("Error for ");
ex.printStackTrace(out);
}
return FormatWalkResult.STOP_WALKING;
} else {
return FormatWalkResult.KEEP_WALKING;
}
}
use of com.ibm.j9ddr.vm29.pointer.generated.J9ClassPointer in project openj9 by eclipse.
the class J9ObjectStructureFormatter method printJ9ObjectFields.
private void printJ9ObjectFields(PrintStream out, int tabLevel, J9ClassPointer localClazz, U8Pointer dataStart, J9ObjectPointer localObject) throws CorruptDataException {
J9ClassPointer instanceClass = localClazz;
long superclassIndex;
long depth;
J9ClassPointer previousSuperclass = J9ClassPointer.NULL;
boolean lockwordPrinted = false;
if (J9BuildFlags.thr_lockNursery) {
lockwordPrinted = false;
}
/* print individual fields */
J9UTF8Pointer classNameUTF = instanceClass.romClass().className();
padding(out, tabLevel);
out.println(String.format("struct J9Class* clazz = !j9class 0x%X // %s", localClazz.getAddress(), J9UTF8Helper.stringValue(classNameUTF)));
padding(out, tabLevel);
out.println(String.format("Object flags = %s;", J9ObjectHelper.flags(localObject).getHexValue()));
if (!J9BuildFlags.thr_lockNursery) {
UDATA lockword = J9ObjectHelper.monitor(localObject);
if (lockword != null) {
padding(out, tabLevel);
out.println(String.format("j9objectmonitor_t monitor = %s;", lockword.getHexValue()));
}
}
depth = J9ClassHelper.classDepth(instanceClass).longValue();
for (superclassIndex = 0; superclassIndex <= depth; superclassIndex++) {
J9ClassPointer superclass;
if (superclassIndex == depth) {
superclass = instanceClass;
} else {
superclass = J9ClassPointer.cast(instanceClass.superclasses().at(superclassIndex));
}
U32 flags = new U32(J9VM_FIELD_OFFSET_WALK_INCLUDE_INSTANCE | J9VM_FIELD_OFFSET_WALK_INCLUDE_HIDDEN);
Iterator<J9ObjectFieldOffset> iterator = J9ObjectFieldOffsetIterator.J9ObjectFieldOffsetIteratorFor(superclass.romClass(), instanceClass, previousSuperclass, flags);
while (iterator.hasNext()) {
J9ObjectFieldOffset result = iterator.next();
boolean printField = true;
boolean isHiddenField = result.isHidden();
if (J9BuildFlags.thr_lockNursery) {
boolean isLockword = (isHiddenField && ((result.getOffsetOrAddress().add(J9Object.SIZEOF).eq(superclass.lockOffset()))));
if (isLockword) {
/* Print the lockword field if it is indeed the lockword for this instanceClass and we haven't printed it yet. */
printField = (!lockwordPrinted && (instanceClass.lockOffset().eq(superclass.lockOffset())));
if (printField) {
lockwordPrinted = true;
}
}
}
if (printField) {
printObjectField(out, tabLevel, localClazz, dataStart, superclass, result);
out.println();
}
}
previousSuperclass = superclass;
}
}
use of com.ibm.j9ddr.vm29.pointer.generated.J9ClassPointer in project openj9 by eclipse.
the class J9ClassFieldFormatter method postFormat.
@Override
public FormatWalkResult postFormat(String name, String type, String declaredType, int typeCode, long address, PrintStream out, Context context, IStructureFormatter structureFormatter) throws CorruptDataException {
if (typeCode == TYPE_STRUCTURE_POINTER && StructureCommandUtil.typeToCommand(type).equals("!j9class")) {
PointerPointer slotPtr = PointerPointer.cast(address);
J9ClassPointer clazz = J9ClassPointer.cast(slotPtr.at(0));
if (clazz.isNull()) {
return FormatWalkResult.KEEP_WALKING;
}
out.print(" // ");
if (J9ClassHelper.isArrayClass(clazz)) {
out.print(J9ClassHelper.getArrayName(clazz));
} else {
out.print(J9ClassHelper.getName(clazz));
}
}
return FormatWalkResult.KEEP_WALKING;
}
use of com.ibm.j9ddr.vm29.pointer.generated.J9ClassPointer in project openj9 by eclipse.
the class J9ClassStructureFormatter method postFormat.
@Override
public FormatWalkResult postFormat(String type, long address, PrintStream out, Context context, List<IFieldFormatter> fieldFormatters, String[] extraArgs) {
if (type.equalsIgnoreCase("j9class") && address != 0) {
J9ClassPointer clazz = J9ClassPointer.cast(address);
try {
out.println("Class name: " + J9ClassHelper.getName(clazz));
} catch (CorruptDataException e) {
// Do nothing
return FormatWalkResult.KEEP_WALKING;
}
out.println("To view static fields, use !j9statics " + clazz.getHexAddress());
out.println("To view instance shape, use !j9classshape " + clazz.getHexAddress());
}
return FormatWalkResult.KEEP_WALKING;
}
use of com.ibm.j9ddr.vm29.pointer.generated.J9ClassPointer in project openj9 by eclipse.
the class DTFJJavaObject method getReferences.
@SuppressWarnings("rawtypes")
public Iterator getReferences() {
boolean isClass = false;
boolean isClassLoader = false;
boolean isWeakReference = false;
boolean isSoftReference = false;
boolean isPhantomReference = false;
if (null == references) {
references = new LinkedList<Object>();
try {
// find this object's class
JavaClass jClass = getJavaClass();
// add a reference to the object's class
if (null != jClass) {
JavaReference ref = new DTFJJavaReference(this, jClass, "Class", JavaReference.REFERENCE_CLASS, JavaReference.HEAP_ROOT_UNKNOWN, JavaReference.REACHABILITY_STRONG);
references.add(ref);
}
if (isArray()) {
if (isObjectArray()) {
addObjectArrayReferences();
}
} else {
isClass = (jClass != null) && jClass.getName().equals("java/lang/Class");
List<JavaClass> superClasses = new LinkedList<JavaClass>();
// Do superclass walk
while (jClass != null) {
String className = jClass.getName();
isClassLoader |= className.equals("java/lang/ClassLoader");
isWeakReference |= className.equals("java/lang/ref/WeakReference");
isSoftReference |= className.equals("java/lang/ref/SoftReference");
isPhantomReference |= className.equals("java/lang/ref/PhantomReference");
superClasses.add(jClass);
jClass = jClass.getSuperclass();
}
int reachability = isWeakReference ? JavaReference.REACHABILITY_WEAK : isSoftReference ? JavaReference.REACHABILITY_SOFT : isPhantomReference ? JavaReference.REACHABILITY_PHANTOM : JavaReference.REACHABILITY_STRONG;
for (JavaClass clazz : superClasses) {
addFieldReferences(clazz, reachability);
}
}
} catch (CorruptDataException e) {
// Corrupt data, so add it to the container.
references.add(e.getCorruptData());
} catch (Throwable t) {
CorruptData cd = J9DDRDTFJUtils.handleAsCorruptData(DTFJContext.getProcess(), t);
references.add(cd);
}
// Now add association-specific references
if (isClassLoader) {
try {
JavaClassLoader associatedClassLoader = getAssociatedClassLoader();
if (associatedClassLoader != null) {
for (Iterator classes = associatedClassLoader.getDefinedClasses(); classes.hasNext(); ) {
Object potentialClass = classes.next();
if (potentialClass instanceof JavaClass) {
JavaClass currentClass = (JavaClass) potentialClass;
JavaReference ref = new DTFJJavaReference(this, currentClass, "Loaded class", JavaReference.REFERENCE_LOADED_CLASS, JavaReference.HEAP_ROOT_UNKNOWN, JavaReference.REACHABILITY_STRONG);
references.add(ref);
}
}
} else {
references.add(J9DDRDTFJUtils.newCorruptData(DTFJContext.getProcess(), "Couldn't find associated JavaClassLoader for classloader object " + this));
}
} catch (Throwable t) {
CorruptData cd = J9DDRDTFJUtils.handleAsCorruptData(DTFJContext.getProcess(), t);
references.add(cd);
}
}
if (isClass) {
try {
JavaClass associatedClass = getAssociatedClass();
if (associatedClass != null) {
JavaReference ref = new DTFJJavaReference(this, associatedClass, "Associated class", JavaReference.REFERENCE_ASSOCIATED_CLASS, JavaReference.HEAP_ROOT_UNKNOWN, JavaReference.REACHABILITY_STRONG);
references.add(ref);
} else {
// No associated class found. For anonymous classes this is expected, the class is not defined in a classloader.
J9ClassPointer j9Class = ConstantPoolHelpers.J9VM_J9CLASS_FROM_HEAPCLASS(object);
if (!J9ClassHelper.isAnonymousClass(j9Class)) {
// Not an anonymous class, so something is wrong/damaged, add a corrupt data object to the references list
references.add(J9DDRDTFJUtils.newCorruptData(DTFJContext.getProcess(), "Couldn't find associated JavaClass for Class object " + this));
}
}
} catch (Throwable t) {
CorruptData cd = J9DDRDTFJUtils.handleAsCorruptData(DTFJContext.getProcess(), t);
references.add(cd);
}
}
}
return references.iterator();
}
Aggregations