При направлении с ошибкой “*** glibc обнаружил *** свободный (): недопустимый следующий размер (быстро)”

Посмотрите, что MSO подвергает сомнению длинный список возможных дубликатов — C выделение памяти и переполняющиеся границы для получения информации о тесно связанных вопросах.


Среда разработчика: CentOS 4.7, Kdevelop 3.1.1, gcc 3.4.6

Я выполняю тестовый клиент Java, который загружается, C++ совместно использовал библиотеку с помощью JNI. Существует три компонента в моем приложении,

  1. Клиент Java
  2. C++ совместно использовал библиотеку, которая действует как обертка JNI. (Я назову это "wrapperlibrary"),
  3. C++ совместно использовал библиотеку, содержащую бизнес-объекты. (Я назову это "businesslibrary"),

Когда я выполняю клиент, я сталкиваюсь с ошибкой очень часто, которая является, *** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***. Эта ошибка прибывает в течение приблизительно 10 - 11 раз и затем выполнения приложения.

В моем клиенте Java я сначала загружаю необходимые библиотеки C++ в статическом ctor следующим образом,

static
{
System.Load("/root/Desktop/libs/businesslibrary");
System.out.println("business library loaded");
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}

Оператор "бизнес-библиотека, загруженная", печатается на консоли, но после него ошибка *** glibc... прибывает.

В настройках проекта wrapperlibrary businesslibrary указан как подчиненная библиотека. Так, даже если я опускаю вызов, чтобы загрузить businesslibrary и просто записать,

static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}

затем во-первых businesslibrary загружается (замеченный посредством входа создания глобальной переменной), и затем wrapperlibrary загружается. Управление возвращается назад к клиенту Java, и оператор "библиотека-оболочка, загруженная", печатается на консоли. После этого существует вызов к собственному методу. Но управление никогда не достигает реализации этого собственного метода. Скорее перед этим ошибка *** glibc... снова прибывает. Также, если я вставляю вызов в статический метод другого класса Java перед вызовом собственного метода такой как,

static
{
 System.Load("/root/Desktop/libs/wrapperlibrary");
 System.out.println("wrapper library loaded");
 System.out.println(Try.temp()); //where temp is a static method of Try class which returns a string.

 native method call;

 --
 --
}

затем вывод Try.temp () никогда не печатается.

Каковы могли быть возможные причины для проблемы и в этих подходах и в как я должен продолжить двигаться?

12
задан Community 20 March 2017 в 09:43
поделиться

1 ответ

Возможно, сама Java скомпонована с другим glibc, чем ваши библиотеки, или библиотеки по-разному скомпонованы / с разными glibc.
Также проверьте, не связывается ли одна из библиотек с отладочной версией glibc (эта проблема возникает в Windows с библиотекой времени выполнения C ++). Попробуйте связать свои библиотеки статически с glibc или для исключения возможности статического связывания вашей оболочки и бизнес-библиотек в одну библиотеку.

4
ответ дан 2 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: