【发布时间】:2010-01-20 21:51:40
【问题描述】:
我有一个 java 类,它通过 JNI C++ 类调用 C++ 类来访问 libmagic.so 提供的“文件”命令功能。
- C++ 类作为 C++ main() 编译并运行良好
-在运行 java 1.5 和 1.6 的 RHEL 5 上运行良好;
-它在运行 java 1.5 的 RHEL 4 上运行良好
-它在使用 java 1.6 的 RHEL 4 上引发 seg fault 26234
段错误:
在调用时发生 char* retptr = magic_buffer(cookie, bigbuf, 1000); 没有错的时候 char* retptr = “一个不错的安全字符串”;被替换。这就是为什么我断定在这次调用中发生了 seg 错误。
我使用另一个调用,char* retptr = magic_file(cookie,"/usr/include/magic.h");调试缓冲区问题,因为此调用返回相同的文件类型消息,只需要文件的完全限定路径名,而不是充满文件内容的缓冲区。它还会在 RHEL4/java 1.6 测试 VM 上引发 seg 错误。因此,我得出结论,问题似乎不是我的代码中的错误指针或缓冲区溢出。
magic_buffer 是对 libmagic.so 的调用。在前面的代码中,对这个库进行了其他成功的调用。但是,此调用涉及 lib magic 数据库 /usr/share/file/magic。
将 C++ 编译为可执行文件并在问题机器上运行它就可以正常工作。
以下是一些结论:
A.有 JNI 参与,因为 #4
B.由于#1/#2,我不认为这是 JNI 实现问题。
C.因为 #1、#2 和 #4,我不认为这是 C++ 实现问题。
有什么建议或建议吗? (最初在 VMWare 上运行,现在在没有 VM 参与的情况下进行测试)
【问题讨论】:
-
更新后出现这种情况吗?无法在 RHEL4 上返回 java 1.5?
-
如果您将 C++ 代码发布给 JNI 专家检查,这可能会有所帮助。
-
不涉及更新;这是测试新的发展。我们有 RHEL4/5 和 Java 1.5/1.6 的混合环境。我想找出问题的原因,而不是在不了解问题所在的情况下寻找解决方法。
标签: java java-native-interface segmentation-fault redhat