Hello Xuan Bach,
I was getting the same exception when running JPF on Apache ActiveMQ Artemis and I believe I managed to get past it
gov.nasa.jpf.vm.NoUncaughtExceptionsProperty
java.lang.Error: java.lang.NoSuchFieldException: tid
at org.apache.logging.log4j.status.StatusLogger.<init>(StatusLogger.java:67)
at org.apache.logging.log4j.status.StatusLogger.<clinit>(StatusLogger.java:61)
at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:52)
at java.lang.Class.initialize0(gov.nasa.jpf.vm.JPF_java_lang_Class)
at java.lang.Class.forName(Class.java:229)
at org.jboss.logging.LoggerProviders.tryLog4j2(LoggerProviders.java:125)
at org.jboss.logging.LoggerProviders.findProvider(LoggerProviders.java:91)
at org.jboss.logging.LoggerProviders.find(LoggerProviders.java:34)
at org.jboss.logging.LoggerProviders.<clinit>(LoggerProviders.java:31)
at org.jboss.logging.Logger.getLogger(Logger.java:2465)
at org.jboss.logging.Logger.getLogger(Logger.java:2490)
at org.apache.activemq.artemis.tests.util.ActiveMQTestBase.<clinit>(ActiveMQTestBase.java:160)
at java.lang.Class.forName(gov.nasa.jpf.vm.JPF_java_lang_Class)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:86)
at org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:47)
at org.junit.runner.JUnitCore.main(JUnitCore.java:40)
Caused by: java.lang.NoSuchFieldException: tid
at org.apache.logging.log4j.status.StatusLogger.<init>(StatusLogger.java:67)
at org.apache.logging.log4j.status.StatusLogger.<clinit>(StatusLogger.java:61)
at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:52)
at java.lang.Class.initialize0(gov.nasa.jpf.vm.JPF_java_lang_Class)
at java.lang.Class.forName(Class.java:229)
at org.jboss.logging.LoggerProviders.tryLog4j2(LoggerProviders.java:125)
at org.jboss.logging.LoggerProviders.findProvider(LoggerProviders.java:91)
at org.jboss.logging.LoggerProviders.find(LoggerProviders.java:34)
at org.jboss.logging.LoggerProviders.<clinit>(LoggerProviders.java:31)
at org.jboss.logging.Logger.getLogger(Logger.java:2465)
at org.jboss.logging.Logger.getLogger(Logger.java:2490)
at org.apache.activemq.artemis.tests.util.ActiveMQTestBase.<clinit>(ActiveMQTestBase.java:160)
at java.lang.Class.forName(gov.nasa.jpf.vm.JPF_java_lang_Class)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:86)
at org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:47)
at org.junit.runner.JUnitCore.main(JUnitCore.java:40)
If I look at in OpenJDK 8 sources, I see in ReentrantReadWriteLock.java:1506
// Unsafe mechanics
private static final sun.misc.Unsafe UNSAFE;
private static final long TID_OFFSET;
static {
try {
UNSAFE = sun.misc.Unsafe.getUnsafe();
Class<?> tk = Thread.class;
TID_OFFSET = UNSAFE.objectFieldOffset
(tk.getDeclaredField("tid"));
} catch (Exception e) {
throw new Error(e);
}
}
If I open the Thread class in jpf-core, I do not see the field tid there.
To resolve this, I've edited the jpf-core sources and added
declaration to class Thread in jpf-core/src/classes/java/lang/Thread.java
Next, I encountered the following error.
gov.nasa.jpf.vm.NoUncaughtExceptionsProperty
java.lang.NoSuchMethodError: java.lang.Exception$SecurityManagerEx.getClassContext()[Ljava/lang/Class;
at java.lang.Exception$SecurityManagerEx.getThrowableContext(Exception.java:147)
at java.lang.Exception.<init>(Exception.java:37)
at java.lang.ReflectiveOperationException.<init>(ReflectiveOperationException.java:75)
at java.lang.ClassNotFoundException.<init>(ClassNotFoundException.java:82)
at java.lang.ClassLoader.findClass(ClassLoader.java:191)
at java.lang.ClassLoader.loadClass(ClassLoader.java:175)
at java.lang.Class.forName(Class.java:225)
at org.jboss.logging.Logger$1.run(Logger.java:2544)
at java.security.AccessController.doPrivileged(AccessController.java:34)
at org.jboss.logging.Logger.getMessageLogger(Logger.java:2529)
at org.jboss.logging.Logger.getMessageLogger(Logger.java:2516)
at org.apache.activemq.artemis.core.server.ActiveMQServerLogger.<clinit>(ActiveMQServerLogger.java:78)
at org.apache.activemq.artemis.tests.util.ActiveMQTestBase.<clinit>(ActiveMQTestBase.java:179)
at java.lang.Class.forName(gov.nasa.jpf.vm.JPF_java_lang_Class)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:86)
at org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:47)
at org.junit.runner.JUnitCore.main(JUnitCore.java:40)
To resolve that, I again edited jpf-core sources and created new file src/classes/java/lang/SecurityManager.java
public class SecurityManager {
protected Class[] getClassContext() {
return new Class[0];
}
}
Now the unittest class runs to completion.
I am executing the unittests by running
java -jar ~/workspace/jpf-core/build/RunJPF.jar +classpath=`find . -name "*.jar" | tr :space: :` org.junit.runner.JUnitCore org.apache.activemq.artemis.tests.integration.amqp.ProtonTest
before I had to execute mvn install dependency:copy-dependencies in order to get all transitive dependencies copied into one directory