use of com.ibm.j9ddr.exceptions.CorruptStructuresException in project openj9 by eclipse.
the class VMDataFactory method getAllVMData.
// TODO - fix this for z/OS which will require noting which RAS symbols have already been found in the core
/**
* Finds all of the blobs in a given process and wraps them in a IVMData structure.
*
* @param process process to scan
* @return all located blobs
* @throws IOException re-throws IOExceptions
*/
public static synchronized List<IVMData> getAllVMData(IProcess process) throws IOException {
List<IVMData> cachedVMData = vmDataCache.get(process);
if (cachedVMData != null) {
return cachedVMData;
}
// nothing in the cache for this process, so need to scan
// Get an ImageInputStream on the Structure Offset Data. This may or may not be in the core file itself.
List<IVMData> data = new ArrayList<IVMData>();
ImageInputStream in = null;
// End Of Memory
boolean EOM = false;
long address = 0;
j9RASAddress = 0;
while (!EOM) {
try {
address = j9RASAddress + 1;
in = getStructureDataFile(process, address);
if (in != null) {
EOM = !(in instanceof IMemoryImageInputStream);
IVMData vmdata = getVMData(process, in);
data.add(vmdata);
if (vmdata.getClassLoader().getHeader().getCoreVersion() == 1) {
// version 1 does not support multiple blobs
EOM = true;
break;
}
} else {
EOM = true;
}
} catch (JVMNotFoundException e) {
// no more JVMs were found
EOM = true;
} catch (JVMNotDDREnabledException e) {
// an older JVM was found, so ignore that and carry on looking
// on z/OS a failure with the j9ras symbol resolution aborts the scan
EOM = EOM | (process.getPlatform() == Platform.ZOS);
continue;
} catch (MissingDDRStructuresException e) {
// cannot process as the structures are missing
// on z/OS a failure with the j9ras symbol resolution aborts the scan
EOM = EOM | (process.getPlatform() == Platform.ZOS);
continue;
} catch (CorruptStructuresException e) {
// cannot process as the structures are corrupt and cannot be read
// on z/OS a failure with the j9ras symbol resolution aborts the scan
EOM = EOM | (process.getPlatform() == Platform.ZOS);
continue;
} catch (IOException e) {
continue;
}
}
// scan is switched off for Java-only applications (specifically jdmpview) via a system property.
if ((System.getProperty(NOEXTRASEARCHFORNODE_PROPERTY) == null) && (data.size() == 0)) {
StructureHeader header = null;
try {
header = findNodeVersion(process);
} catch (Exception e) {
if (e instanceof IOException) {
throw (IOException) e;
} else {
IOException ioe = new IOException();
// avoid use of IOException(throwable) to be compatible with J5
ioe.initCause(e);
throw ioe;
}
}
if (header != null) {
in = getBlobFromLibrary(process, header);
if (in != null) {
IVMData vmdata = getVMData(process, in);
data.add(vmdata);
}
}
}
vmDataCache.put(process, data);
return data;
}
Aggregations