java jni异常访问冲突

时间:2012-07-26 15:47:54

标签: java java-native-interface access-violation

我使用JNI的java应用程序崩溃了hs_err_pid文件,错误为“Exception Access Violation”。操作系统是Windows VISTA。

据我所知,我的本机代码是非法写入不属于它的一些内存。

我在Linux上使用valgrind上的纯本机代码来检测过去的这些问题。

但是当使用java时,valgrind只是失败而且不起作用。

您建议使用什么(如果有)方法来识别有问题的代码?

我无法手动挖掘本机代码(几百万行)来识别它。

3 个答案:

答案 0 :(得分:4)

我终于能够解决这个问题了。我想我会在这里发布程序,以防其他人遇到类似的情况。

第1步: 使用适当的调试符号构建本机代码。编译器标志可能类似于

"-g -rdynamic -O0"

第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_ARGS

在上面的命令中,$ JAVA是java可执行文件,$ JAVA_ARGS是java程序的参数。

成功启动后,完成执行需要花费数量级。 Valgrind将打印数千个错误(大多数与jvm相关,可以忽略)。但是,您可以识别与您的jni代码相关的内容。

此一般策略应适用于大多数与本机内存相关的问题。

答案 1 :(得分:2)

如果您在Linux下运行Java,则可以使用-XX:OnError="gdb - %p"选项在发生错误时运行gdb。请参阅此example

在Windows下,您可以使用-XX:+UseOSErrorReporting选项获得类似的效果。

答案 2 :(得分:0)

为了调试JNI代码,在this article中发布的方法可能很有用(它是关于使用Netbeans和Visual Studio调试JNI)。这很简单 - 只需启动Java程序,然后在Visual Studio中选择Debug - > Attach to process并选择运行程序的java.exe进程。

当您向C ++代码添加断点时,Visual Studio将打破它们。沃伊拉:)