【问题标题】:Redhat AS 4 seg fault calling magic_buffer using Java 1.6Redhat AS 4 seg fault 使用 Java 1.6 调用 magic_buffer
【发布时间】: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

段错误:

  1. 在调用时发生 char* retptr = magic_buffer(cookie, bigbuf, 1000); 没有错的时候 char* retptr = “一个不错的安全字符串”;被替换。这就是为什么我断定在这次调用中发生了 seg 错误。

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

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

  4. 将 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


【解决方案1】:

我的第一个建议是尝试找到一个纯 Java 替代方案。 This page 列出了许多替代方案。 Apache Tika 和 JMimeMagic 看起来很有希望。

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

【讨论】:

  • 性能是我们寻找替代方案来为每个实例生成新进程的原因。
  • 我不建议 #1 会有所帮助。我已经在发生 seg 错误的行上方发布了帖子,以及为什么我不认为缓冲区问题是罪魁祸首。添加额外的代码只会掩盖问题。这是一些代码: char* cptr = null; cptr = magic_file(cookie,"/usr/include/magic.h");该行是发生段故障的地方。该行如上所示。请注意,上面的讨论指出该代码适用于 java 1.5,仅在某些 redhat 版本下使用 1.6 时会引发 seg 错误。 C++ 代码在所有操作系统版本和(当然)java 版本下都能正常编译和运行。
  • 所有测试。性能成本很高,我们无法接受。
  • 查看我对该问题的最新评论。
猜你喜欢
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
相关资源
最近更新 更多