use of com.ibm.j9ddr.exceptions.MissingDDRStructuresException in project openj9 by eclipse.
the class DDRInteractive method locateRuntimes.
private void locateRuntimes(ICore reader) {
currentCore = reader;
Collection<? extends IAddressSpace> spaces = reader.getAddressSpaces();
for (IAddressSpace thisSpace : spaces) {
// indicates if a context has been allocated for the address space
boolean hasCtxBeenAddedForAS = false;
Collection<? extends IProcess> processes = thisSpace.getProcesses();
for (IProcess thisProcess : processes) {
hasCtxBeenAddedForAS = true;
try {
IVMData vmData = VMDataFactory.getVMData(thisProcess);
if (vmData != null) {
contexts.add(new Context(thisProcess, vmData, nonVMCommands));
} else {
addMissingJVMToContexts(thisProcess);
}
} catch (JVMNotDDREnabledException e) {
addMissingJVMToContexts(thisProcess);
} catch (JVMNotFoundException e) {
addMissingJVMToContexts(thisProcess);
} catch (MissingDDRStructuresException e) {
addMissingJVMToContexts(thisProcess);
} catch (IOException e) {
System.err.println("Problem searching for VMData in process " + thisProcess);
e.printStackTrace();
// put the stack trace to the log
Logger logger = Logger.getLogger(LoggerNames.LOGGER_INTERACTIVE_CONTEXT);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
logger.logp(FINE, null, null, sw.toString());
}
}
if (!hasCtxBeenAddedForAS) {
ASNoProcess as = new ASNoProcess(thisSpace);
addMissingJVMToContexts(as);
}
}
if (contexts.size() == 0) {
throw new RuntimeException("Couldn't find any address spaces in this dump");
} else {
// default to the first address space
currentContext = contexts.get(0);
for (Context ctx : contexts) {
// but if there is one with a JVM in it, set it to that
if (!(ctx.vmData instanceof MissingVMData)) {
currentContext = ctx;
break;
}
}
}
}
use of com.ibm.j9ddr.exceptions.MissingDDRStructuresException in project openj9 by eclipse.
the class VMDataFactory method foundRAS.
private static ImageInputStream foundRAS(IProcess addressSpace, long candidateAddress) throws IOException {
try {
j9RASAddress = candidateAddress;
String structureFileName = System.getProperty(STRUCTUREFILE_PROPERTY);
if (structureFileName != null) {
// for it in the blob archive
try {
return getStructureDataFromFile(structureFileName, addressSpace);
} catch (FileNotFoundException e) {
return getBlobFromArchive(structureFileName, addressSpace);
}
}
int j9RASVersion = addressSpace.getIntAt(candidateAddress + J9RAS_VERSION_OFFSET);
short j9RASMajorVersion = (short) (j9RASVersion >> 16);
if (j9RASMajorVersion < MINIMUM_J9RAS_MAJOR_VERSION) {
return locateInServiceVMStructure(addressSpace);
}
long ddrDataStart = addressSpace.getPointerAt(candidateAddress + DDR_DATA_POINTER_OFFSET);
if (0 == ddrDataStart) {
// CMVC 172446 : no valid address to DDR blob, so see if we can locate it via the blob archive
try {
return locateInServiceVMStructure(addressSpace);
} catch (IOException e) {
// failed to locate a blob
MissingDDRStructuresException ioe = new MissingDDRStructuresException(addressSpace, "System dump was generated by a DDR-enabled JVM, but did not contain embedded DDR structures. This dump cannot be analyzed by DDR. " + "You can specify the location of a DDR structure file to use with the " + STRUCTUREFILE_PROPERTY + " system property");
ioe.initCause(e);
throw ioe;
}
}
// the address may be a marker to treat it in a special way, rather than as an actual address
// -1 = the blob is located directly after this structure
// -2 = there is only a blob descriptor loaded
long marker = (addressSpace.bytesPerPointer() == 4) ? 0xFFFFFFFF00000000L | ddrDataStart : ddrDataStart;
if (marker == -2) {
StructureHeader header = new StructureHeader((byte) 1);
ddrDataStart = candidateAddress + DDR_DATA_POINTER_OFFSET + (addressSpace.bytesPerPointer() * 2);
ImageInputStream stream = new IMemoryImageInputStream(addressSpace, ddrDataStart);
header.readBlobVersion(stream);
return getBlobFromLibrary(addressSpace, header);
}
if (marker == -1) {
if (j9RASVersion == 0x100000) {
// there is one pointer in the way that needs to be skipped over
ddrDataStart = candidateAddress + DDR_DATA_POINTER_OFFSET + (addressSpace.bytesPerPointer() * 2);
} else {
MissingDDRStructuresException ioe = new MissingDDRStructuresException(addressSpace, "System dump was generated by a DDR-enabled JVM, but did not contain embedded DDR structures. This dump cannot be analyzed by DDR. " + "You can specify the location of a DDR structure file to use with the " + STRUCTUREFILE_PROPERTY + " system property");
throw ioe;
}
}
return new IMemoryImageInputStream(addressSpace, ddrDataStart);
} catch (MemoryFault e) {
// put the stack trace to the log
Logger logger = Logger.getLogger(LoggerNames.LOGGER_STRUCTURE_READER);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
logger.logp(FINE, null, null, sw.toString());
throw new IOException(e.getMessage());
}
}
use of com.ibm.j9ddr.exceptions.MissingDDRStructuresException 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