San*_*ari 0 java java-native-interface access-violation
我使用 JNI 的 java 应用程序崩溃,hs_err_pid 文件给出错误“异常访问冲突”。操作系统是Windows VISTA。
据我所知,我的本机代码非法写入不属于它的内存块。
我过去曾在 Linux 上的纯本机代码上使用 valgrind 来检测此类问题。
但是当使用java时,valgrind就会失败并且无法工作。
您建议使用什么(如果有)方法来识别有问题的代码?
我不可能手动挖掘本机代码(几百万行)来识别它。
我终于能够解决这个问题了。我想我会将程序发布在这里,以防其他人遇到类似情况。
第 1 步:使用正确的调试符号构建本机代码。编译器标志可能类似于
"-g -rdynamic -O0"Run Code Online (Sandbox Code Playgroud)。
步骤 2:以下 valgrind 命令应该可以完成这项工作。
valgrind --error-limit=no --trace-children=yes --smc-check=all --leak-check=full --track-origins=yes -v $JAVA -XX:UseSSE=0 -Djava.compiler=NONE $JAVA_ARGSRun Code Online (Sandbox Code Playgroud)
在上面的命令中,$JAVA 是 java 可执行文件,$JAVA_ARGS 是 java 程序的参数。
一旦成功启动,完成执行将需要更多数量级的时间。Valgrind 将打印数千个错误(大多数与 jvm 有关,可以忽略)。不过,您可以识别与您的 jni 代码相关的代码。
这个通用策略应该适用于大多数本机内存相关的问题。
| 归档时间: |
|
| 查看次数: |
3147 次 |
| 最近记录: |