我有一个 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 = “一个不错的安全字符串”时没有错误;被替换。这就是为什么我断定在这次调用中发生了段错误。
我使用另一个调用,char* retptr = magic_file(cookie,"/usr/include/magic.h"); 调试缓冲区问题,因为此调用返回相同的文件类型消息,只需要文件的完全限定路径名,而不是充满文件内容的缓冲区。它还会在 RHEL4/java 1.6 测试 VM 上引发 seg 错误。因此,我得出结论,问题似乎不是我的代码中的错误指针或溢出缓冲区。
magic_buffer 是对 libmagic.so 的调用。在前面的代码中,对这个库进行了其他成功的调用。但是,此调用涉及 lib 魔术数据库 /usr/share/file/magic。
将 C++ 编译为可执行文件并在问题机器上运行它就可以了。
以下是一些结论:
A. 有 JNI 参与,因为 #4
B. 因为#1/#2,我不认为这是一个 JNI 实现问题。
C. 因为#1、#2 和#4,我不认为这是 C++ 实现问题。
有什么建议或意见吗?(最初在 VMWare 上运行,现在在没有 VM 参与的情况下进行了测试)