Probable bug within sun.management.StackTraceElementCompositeData
Sven Reimers
sven.reimers at gmail.com
Sun Oct 14 19:42:14 UTC 2018
Hi all,
I hope this is the correct e-mailing list. During out testing of Apache
NetBeans 10 we discovered a problem with self sampling capability of
NetBeans. Digging further into this problem (NETBEANS-1359
<https://issues.apache.org/jira/browse/NETBEANS-1359>) I debugged through
the code and it seems that there is a problem with the order of the values
and the order of the attributes.
>From the code I see the order of the values is
final Object[] stackTraceElementItemValues = {
ste.getClassLoaderName(),
ste.getModuleName(),
ste.getModuleVersion(),
ste.getClassName(),
ste.getMethodName(),
ste.getFileName(),
ste.getLineNumber(),
ste.isNativeMethod(),
};
compared to the order of the attributes
private static final String[] V5_ATTRIBUTES = {
CLASS_NAME,
METHOD_NAME,
FILE_NAME,
LINE_NUMBER,
NATIVE_METHOD,
};
private static final String[] V9_ATTRIBUTES = {
CLASS_LOADER_NAME,
MODULE_NAME,
MODULE_VERSION,
};
private static final String[] STACK_TRACE_ELEMENT_ATTRIBUTES =
Stream.of(V5_ATTRIBUTES, V9_ATTRIBUTES).flatMap(Arrays::stream)
.toArray(String[]::new);
which can be expanded to
CLASS_NAME,
METHOD_NAME,
FILE_NAME,
LINE_NUMBER,
NATIVE_METHOD,
CLASS_LOADER_NAME,
MODULE_NAME,
MODULE_VERSION,
With the difference in ordering you will get an exception in
CompositeDataSupport, if you try to convert things (lines 228ff)
// Check each value, if not null, is of the open type defined for
the
// corresponding item
for (String name : namesFromType) {
Object value = items.get(name);
if (value != null) {
OpenType<?> itemType = compositeType.getType(name);
if (!itemType.isValue(value)) {
throw new OpenDataException(
"Argument value of wrong type for item " + name
+
": value " + value + ", type " + itemType);
}
}
}
which is hard to compensate from the caller side.
I think the change, which introduced this was
https://github.com/openjdk/jdk/commit/9091926ae64690982d59f1d634f96bb9b79a5470
The proposed patch seems simple, just change the ordering of the attributes
private static final String[] STACK_TRACE_ELEMENT_ATTRIBUTES =
Stream.of(V9_ATTRIBUTES, V5_ATTRIBUTES).flatMap(Arrays::stream)
.toArray(String[]::new);
or change the value ordering to fit the attributes order.
Can anyone confirm the analysis?
Thanks
-Sven
--
Sven Reimers
* Senior Expert Software Architect
* Java Champion
* Apache NetBeans Committer
*
* JUG Leader JUG Bodensee: http://www.jug-bodensee.de
* Duke's Choice Award Winner 2009
More information about the jdk-dev
mailing list