为什么Z3优化是在Java中进行的?
在我正在处理的一个Java项目中,我有一个围绕Z3的包装器类。当我测试优化时,我的程序因一个错误而崩溃。经过一些实验,我找到了这个最小的可重复示例,它只创建了一个上下文和优化器,并检查优化器:为什么Z3优化是在Java中进行的?,java,z3,Java,Z3,在我正在处理的一个Java项目中,我有一个围绕Z3的包装器类。当我测试优化时,我的程序因一个错误而崩溃。经过一些实验,我找到了这个最小的可重复示例,它只创建了一个上下文和优化器,并检查优化器: import com.microsoft.z3.*; public class Z3Test { public static void main(String[] args) { try (Context ctx = new Context()) { Optimize opt
import com.microsoft.z3.*;
public class Z3Test {
public static void main(String[] args) {
try (Context ctx = new Context()) {
Optimize opt = ctx.mkOptimize();
System.out.println("Check: " + opt.Check());
}
}
}
请注意,程序仍会在没有try块的情况下进行故障分段,即
Context ctx = new Context();
Optimize opt = ctx.mkOptimize();
System.out.println("Check: " + opt.Check());
另一方面,在不进行优化的情况下进行求解运行良好:
try (Context ctx = new Context()) {
Solver opt = ctx.mkSolver();
System.out.println("Check: " + opt.check());
}
支票:满意
我可能做错了什么?一些潜在相关信息:
操作系统:
Java版本:
openjdk 14 2020-03-17
OpenJDK Runtime Environment (build 14+36-1461)
OpenJDK 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)
我在运行代码的目录中有libz3.dylib和libz3java.dylib
日志文件中的堆栈跟踪:
Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [libz3.dylib+0x79f96] Z3_optimize_check+0x76
C [libz3java.dylib+0x8425] Java_com_microsoft_z3_Native_INTERNALoptimizeCheck+0x45
j com.microsoft.z3.Native.INTERNALoptimizeCheck(JJ)I+0
j com.microsoft.z3.Native.optimizeCheck(JJ)I+2
j com.microsoft.z3.Optimize.Check()Lcom/microsoft/z3/Status;+11
j jaedmax.Main.main([Ljava/lang/String;)V+17
v ~StubRoutines::call_stub
V [libjvm.dylib+0x34b082] JavaCalls::call_helper(JavaValue*, methodHandle const&, JavaCallArguments*, Thread*)+0x256
V [libjvm.dylib+0x38f7f1] jni_invoke_static(JNIEnv_*, JavaValue*, _jobject*, JNICallType, _jmethodID*, JNI_ArgumentPusher*, Thread*)+0x11c
V [libjvm.dylib+0x3930d4] jni_CallStaticVoidMethod+0x1b3
C [libjli.dylib+0x4ac2] JavaMain+0xab4
C [libjli.dylib+0x6d6a] ThreadJavaMain+0x9
C [libsystem_pthread.dylib+0x5e65] _pthread_start+0x94
C [libsystem_pthread.dylib+0x183b] thread_start+0xf
项目目录结构:
.
├── build.xml
├── lib
│ └── com.microsoft.z3-4.7.1.jar
├── libz3.dylib
├── libz3java.dylib
└── src
└── Z3Test.java
Ant生成文件:
<project name="Z3Test" basedir="." default="run">
<path id="lib.path">
<pathelement location="lib/com.microsoft.z3-4.7.1.jar"/>
</path>
<path id="class.path">
<path refid="lib.path"/>
<pathelement location="build"/>
</path>
<target name="clean">
<delete dir="build"/>
<delete>
<fileset dir="." includes="**/*.log"/>
</delete>
</target>
<target name="compile" depends="clean">
<mkdir dir="build"/>
<javac srcdir="src" destdir="build" classpathref="lib.path" includeantruntime="no"/>
</target>
<target name="run" depends="compile">
<java classname="Z3Test" classpathref="class.path" fork="yes"/>
</target>
</project>
看来您的z3和/或Java安装可能有问题。为了让一切简单,我做了以下几点:
$cat Z3Test.java
导入com.microsoft.z3.*;
公共类Z3测试{
公共静态void main(字符串[]args){
try(Context ctx=new Context()){
Optimize opt=ctx.mkOptimize();
System.out.println(“检查:+opt.Check());
}
}
}
然后:
所以一切都很顺利。看看您是否可以在命令行上复制它。如果是这样的话,这个问题必须在构建系统中的其他地方。如果失败了,最好的办法可能是从头开始用java绑定重新安装z3。解决了!在我出错的原始项目中,Maven工件之一是作为依赖项下载com.microsoft.z3-4.7.1.jar,这与我从源代码构建的本机库不兼容。这个问题一直存在于最小的示例中,因为我复制了jar。修复方法是去掉那个工件,使用我从源代码构建的jar。请发布一个完全独立的程序(即带有
main
函数等),包括编译它时使用的命令行标志。我发布的代码是主要方法,我只是没有包含样板文件。这个项目是用Ant的javac任务编译的。你认为样板是人们必须为你重建的,所以他们可以围绕你的问题来帮助你。而且,通常你认为“样板”有问题。关于如何发布一个好的堆栈溢出问题(也称为MVCE),请参见以下指南:好的,谢谢您的反馈。编辑了更多的细节
<project name="Z3Test" basedir="." default="run">
<path id="lib.path">
<pathelement location="lib/com.microsoft.z3-4.7.1.jar"/>
</path>
<path id="class.path">
<path refid="lib.path"/>
<pathelement location="build"/>
</path>
<target name="clean">
<delete dir="build"/>
<delete>
<fileset dir="." includes="**/*.log"/>
</delete>
</target>
<target name="compile" depends="clean">
<mkdir dir="build"/>
<javac srcdir="src" destdir="build" classpathref="lib.path" includeantruntime="no"/>
</target>
<target name="run" depends="compile">
<java classname="Z3Test" classpathref="class.path" fork="yes"/>
</target>
</project>
$ javac -cp /usr/local/z3/build/com.microsoft.z3.jar:. Z3Test.java
$ java -Djava.library.path=/usr/local/z3/build -cp /usr/local/z3/build/com.microsoft.z3.jar:. Z3Test
Check: SATISFIABLE