Периодические ошибки повреждения памяти в вызовах JNA - PullRequest
0 голосов
/ 29 ноября 2018

У нас очень простое требование вызова пары нативных функций из Java.Мы используем JNA для выполнения собственных вызовов.

Изменения: У нас нет собственного встроенного кода.Мы делаем вызовы функций библиотеки Linux Kernel 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 ': размер поврежден по сравнению с предыдущим размером: 0x00007f253c4470f0
  • SIGSEGV (0xb)

программа даже зависает несколько раз.Эти ошибки периодически.

Некоторые стандартные примеры / документы по использованию структур в вызовах JNA были бы полезны.


Это наша библиотека-обертка, имеющая собственные функции:

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

Может кто-нибудь сказать нам, что именно мы делаем неправильно?

1 Ответ

0 голосов
/ 29 ноября 2018

Есть несколько зарезервированных полей в 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;
};

Которых у вас нет в вашем коде :

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

Если эти зарезервированные поля будут использоваться в вашей версии glibc, это может объяснить повреждение кучи.

Я бы также внимательно изучил данные, которые вы получите.Если некоторые поля содержат странные значения, это может означать проблему размера / выравнивания поля, что также может указывать на то, что структура короче, чем должна быть.

...