gpt4 book ai didi

java - JNA 调用中的间歇性内存损坏错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:11 24 4
gpt4 key购买 nike

我们有一个非常简单的要求,即从 Java 调用几个 native 函数。我们正在使用 JNA 进行这些本地调用。

编辑:我们没有任何自定义 native 代码。我们正在调用 Linux 内核 C 库函数。

我们遇到了非常奇怪的内存损坏错误,例如

  • `/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64/jre/bin/java' 中的错误:malloc():内存损坏:0x00007f9b7849fc40<
  • `/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64/jre/bin/java' 中的错误:损坏的大小与 prev_size:0x00007f253c4470f0
  • SIGSEGV (0xb)

程序有时甚至会挂起。这些错误是间歇性的。

有关在 JNA 调用中使用结构的一些标准示例/文档会有所帮助。


这是我们的具有 native 功能的库包装器:

https://github.com/tmtsoftware/csw/blob/master/csw-time-client/src/main/scala/csw/time/client/internal/TimeLibrary.java

这些是映射到 C 中结构的原生模型:

https://github.com/tmtsoftware/csw/tree/master/csw-time-client/src/main/scala/csw/time/client/internal/native_models

这就是我们访问库函数的方式:

val timeVal = new NTPTimeVal()
TimeLibrary.ntp_gettimex(timeVal)
println(timeVal.tai)

为了更清楚,您可以引用 TimeServiceImpl.scala。

https://github.com/tmtsoftware/csw/blob/master/csw-time-client/src/main/scala/csw/time/client/internal/TimeServiceImpl.scala

有人能告诉我们到底哪里做错了吗?

最佳答案

ntptimeval中有一些保留字段及相关结构:

struct ntptimeval
{
struct timeval time; /* current time (ro) */
long int maxerror; /* maximum error (us) (ro) */
long int esterror; /* estimated error (us) (ro) */
long int tai; /* TAI offset (ro) */

long int __glibc_reserved1;
long int __glibc_reserved2;
long int __glibc_reserved3;
long int __glibc_reserved4;
};

your code 中没有:

public class NTPTimeVal extends Structure {
public TimeVal time; /* Current time */
public Long maxerror; /* Maximum error */
public Long esterror;
public int tai;
}

如果这些保留字段恰好在您的 glibc 版本中使用,则可以解释堆损坏。

我还会仔细检查您返回的数据。如果某些字段包含奇怪的值,则可能意味着字段大小/对齐问题,这也可能表明结构比需要的要短。

关于java - JNA 调用中的间歇性内存损坏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53533906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com