请参阅“ MSO问题”(可能的重复项的详细列表)—C内存分配和超限范围,以获取有关紧密相关问题的信息。
开发人员环境:CentOS 4.7,Kdevelop 3.1.1,gcc 3.4.6
我运行一个Java测试客户端,该客户端使用JNI加载C ++共享库。我的应用程序包含三个组件,
运行客户端时,我经常会遇到错误,即*** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***。该错误发生大约10-11次,然后应用程序运行。
*** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***
在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...。
*** 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()的输出永远不会被打印。
这两种方法均可能是导致问题的原因,我应该如何进行?
可能是Java本身链接到与您的库不同的glibc,也可能是库链接到不同的glibc。 还要检查其中一个库是否链接到glibc的调试版本(使用C++运行时库的Windows上存在该问题)。尝试针对glibc静态链接您的库,或者为了排除将包装器和业务库静态链接到一个库中的可能性。