13

有关密切相关问题的信息,请参阅 MSO 问题A long list of possible duplicates — C memory allocation and overrunning bounds 。


开发环境:CentOS 4.7、Kdevelop 3.1.1、gcc 3.4.6

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

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

当我运行客户端时,我经常遇到一个错误,即*** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***. 此错误出现大约 10 - 11 次,然后应用程序运行。

在我的 Java 客户端中,我首先在静态 ctor 中加载所需的 C++ 库,如下所示,

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() 的输出永远不会被打印。

这两种方法中出现问题的可能原因是什么,我应该如何进行?

4

2 回答 2

4

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

于 2010-04-06T11:46:50.340 回答
1

我多次遇到这个神秘的错误。

在每种情况下,它都是由引用数组外部的数组成员引起的。该引用没有导致分段错误,因为它仍在程序中另一个数组的范围内。然而,当我去释放数组时,事情已经搞砸了,足以引发这个错误。

解决方法是非常仔细地检查每个数组是否正确分配,并且对数组成员的引用永远不会超出范围。

于 2016-06-03T17:03:45.313 回答