一尘不染

遇到错误“ *** glibc检测到*** free():下一个大小无效(快速)”

linux

请参阅“ MSO问题”(可能的重复项的详细列表)—C内存分配和超限范围,以获取有关紧密相关问题的信息。


开发人员环境:CentOS 4.7,Kdevelop 3.1.1,gcc 3.4.6

我运行一个Java测试客户端,该客户端使用JNI加载C ++共享库。我的应用程序包含三个组件,

  1. Java客户端
  2. C ++共享库,充当JNI包装器。(我将其称为“ wrapperlibrary”)
  3. 包含业务对象的C ++共享库。(我将其称为“业务库”)

运行客户端时,我经常会遇到错误,即*** 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的项目设置中,将业务库指定为从属库。因此,即使我省略了调用加载业务库并只是编写的调用,

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

然后,首先加载业务库(通过全局变量创建日志查看),然后加载包装库。控件返回到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()的输出永远不会被打印。

这两种方法均可能是导致问题的原因,我应该如何进行?


阅读 324

收藏
2020-06-02

共1个答案

一尘不染

可能是Java本身链接到与您的库不同的glibc,也可能是库链接到不同的glibc。
还要检查其中一个库是否链接到glibc的调试版本(使用C++运行时库的Windows上存在该问题)。尝试针对glibc静态链接您的库,或者为了排除将包装器和业务库静态链接到一个库中的可能性。

2020-06-02