gpt4 book ai didi

java - 为什么Java中的Z3优化会出现段错误?

转载 作者:行者123 更新时间:2023-12-01 23:32:03 26 4
gpt4 key购买 nike

在我正在开发的一个 Java 项目中,我有一个围绕 Z3 的包装类。当我测试优化时,我的程序因段错误而崩溃。经过一些实验,我找到了这个最小的可重现示例,它只是创建一个上下文和优化器,并检查优化器:

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 block ,程序仍然会出现段错误,即

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());
}

Check: SATISFIABLE

我可能做错了什么?一些可能相关的信息:

操作系统:

macOS 10.15.3

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
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());
}
}
}

然后:

$ 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

所以一切都很顺利。看看是否可以在命令行上复制此内容。如果是这样,问题一定出在构建系统的其他地方。如果失败,也许您最好的选择是从头开始使用 java 绑定(bind)重新安装 z3。

关于java - 为什么Java中的Z3优化会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61000213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com