Facing an error “*** glibc detected *** free(): in

2018-12-31 01:50发布

Please see MSO question A long list of possible duplicates — C memory allocation and overrunning bounds for information about closely related questions.


Developer environment: CentOS 4.7, Kdevelop 3.1.1, gcc 3.4.6

I run a Java test client that loads a C++ shared library using JNI. There are three components in my application,

  1. Java client
  2. C++ shared library which acts as a JNI wrapper. (I will call it "wrapperlibrary")
  3. C++ shared library containing business objects. (I will call it "businesslibrary")

When I run the client I face an error very frequently which is, *** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***. This error comes for around 10 - 11 times and then the application runs.

In my Java client, I first load the required C++ libraries in a static ctor as follows,

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");
}

The statement "business library loaded" gets printed on the console but after it the error *** glibc... comes.

In the project settings of wrapperlibrary, the businesslibrary is specified as a dependant library. So, even if I omit the call to load businesslibrary and just write,

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

then firstly the businesslibrary gets loaded(seen through global variable creation logging) and then the wrapperlibrary gets loaded. The control returns back to java client and the statement "wrapper library loaded" is printed on console. After this there is a call to native method. But the control never reaches this native method's implementation. Rather before that the error *** glibc... again comes. Also if I insert a call to static method of another java class before native method call such as,

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;

 --
 --
}

then output of Try.temp() never gets printed.

What could be the possible reasons for the problem in both these approaches and how should I proceed?

标签: linux jni centos
2条回答
低头抚发
2楼-- · 2018-12-31 02:13

It could be that Java itself is linked against a different glibc than your libraries or that the libraries are linked differently/to different glibcs.
Also check if one of the libraries is linking against a debug version of the glibc (hat that problem on windows with the C++ runtime lib). Try linking your libraries staticly against the glibc, or for the sake of excluding possibilities linking your wrapper and business libs staticly into one library.

查看更多
皆成旧梦
3楼-- · 2018-12-31 02:25

I have encountered this cryptic error several times.

In each case it was caused by referencing an array member that was outside of the array. The reference did not cause a segmentation fault, as it was still within the bounds of another array in the program. When I went to free the array, however, things were messed up enough to throw this error.

The fix was to very carefully check that each array was properly allocated, and that references to array members never went out of bounds.

查看更多
登录 后发表回答