使用Java 1.6调用magic_缓冲区的Redhat AS 4段错误 我有一个java类,它通过JNI C++类调用C++类,以访问LabMoovie提供的“文件”命令功能。 C++类编译并运行为C++主体()/LI>

使用Java 1.6调用magic_缓冲区的Redhat AS 4段错误 我有一个java类,它通过JNI C++类调用C++类,以访问LabMoovie提供的“文件”命令功能。 C++类编译并运行为C++主体()/LI>,java,java-native-interface,segmentation-fault,redhat,Java,Java Native Interface,Segmentation Fault,Redhat,-它在运行Java1.5和1.6的RHEL5上运行良好 -它在运行Java1.5的RHEL4上运行良好 -它在使用java 1.6的RHEL 4上抛出seg故障26234 seg故障: 在调用char*retptr=magic_缓冲区(cookie,bigbuf,1000)时发生; 没有错的时候 char*retptr=“一个很好的安全字符串”;被替换。这就是为什么我得出结论,seg故障发生在这次调用中 我使用另一个调用char*retptr=magic_文件(cookie,“/usr/incl

-它在运行Java1.5和1.6的RHEL5上运行良好

-它在运行Java1.5的RHEL4上运行良好

-它在使用java 1.6的RHEL 4上抛出seg故障26234

seg故障:

  • 在调用char*retptr=magic_缓冲区(cookie,bigbuf,1000)时发生; 没有错的时候 char*retptr=“一个很好的安全字符串”;被替换。这就是为什么我得出结论,seg故障发生在这次调用中

  • 我使用另一个调用char*retptr=magic_文件(cookie,“/usr/include/magic.h”);要调试缓冲区问题,因为此调用返回相同的文件类型消息,只需要文件的完全限定路径名,而不需要充满文件内容的缓冲区。它还会在RHEL4/Java1.6测试VM上抛出seg错误。因此,我得出结论,在我的代码中,问题似乎不是指针错误或缓冲区溢出

  • magic_buffer是对libmagic.so的调用。在前面的代码中,对该库进行了其他成功调用。然而,这个调用涉及lib-magic数据库/usr/share/file/magic

  • > P>编译C++作为可执行文件,在问题机器上运行它运行正常。

    以下是一些结论:

    A.JNI参与,因为#4

    B.因为#1/#2,我不认为这是一个JNI实现问题

    P<C,由于α1,α2,和4,我不认为这是C++实现问题。
    有什么建议或意见吗?(最初在VMWare上运行,现在测试时没有虚拟机参与)

    我的第一个建议是尝试寻找纯Java的替代方案。列出了许多备选方案。ApacheTika和JMimeMagic看起来很有前途


    我的第二个建议是使用
    Process
    在单独的进程中运行
    file
    命令,并从命令的标准输出中获取所需的信息。如果您需要每秒执行数百次此操作,则可能会出现(嗯哼)性能问题,但偶尔使用也可以。

    这是在更新后发生的吗?在RHEL4上不能返回java 1.5吗?如果您发布C++代码给JNI专家检查,可能会有所帮助。这是对新发展的测试。我们有一个RHEL4/5和Java1.5/1.6的混合环境。我想找出问题的原因,而不是在不了解问题所在的情况下寻找解决方案。性能是我们为什么要寻找替代方案,以避免为每个实例生成新流程的原因。我认为#1没有帮助。我已经发布了seg故障发生的位置,以及为什么我不认为缓冲区问题是罪魁祸首。添加额外的代码只会掩盖这个问题。下面是一些代码:char*cptr=null;cptr=magic_文件(cookie,“/usr/include/magic.h”);该线路是seg故障发生的地方。这条线如上图所示。请注意,上面的讨论指出,该代码适用于Java1.5,在某些redhat版本下,仅适用于1.6抛出seg错误。C++代码编译和运行在所有OS版本和(当然)java版本下。性能成本很高,我们无法接受。请参阅我对这个问题的最新评论。