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

Linux 面对一个错误“***”glibc检测到***free():下一个大小无效(快速)“;,linux,java-native-interface,centos,Linux,Java Native Interface,Centos,有关密切相关问题的信息,请参见MSO问题 开发者环境:CentOS 4.7、Kdevelop 3.1.1、gcc 3.4.6 < >我运行java测试客户端,它使用JNI加载C++共享库。我的申请中有三个部分 Java客户端 充当JNI包装器的C++共享库。(我称之为“包装库”) 包含业务对象的C++共享库。(我称之为“商业图书馆”) 运行客户端时,我经常遇到一个错误,***glibc检测到***free():无效的下一个大小(fast):0x080eeef8***。这个错误大约出现10-11

有关密切相关问题的信息,请参见MSO问题


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

< >我运行java测试客户端,它使用JNI加载C++共享库。我的申请中有三个部分

  • Java客户端
  • 充当JNI包装器的C++共享库。(我称之为“包装库”)
  • 包含业务对象的C++共享库。(我称之为“商业图书馆”)
  • 运行客户端时,我经常遇到一个错误,
    ***glibc检测到***free():无效的下一个大小(fast):0x080eeef8***
    。这个错误大约出现10-11次,然后应用程序运行

    在我的java客户端中,我首先在静态的C++中加载所需的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");
    }
    
    控制台上会打印“business library loaded”语句,但之后会出现错误
    ***glibc…

    在wrapperlibrary的项目设置中,businesslibrary被指定为从属库。因此,即使我省略了加载businesslibrary的调用,只需编写

    static
    {
    System.Load("/root/Desktop/libs/wrapperlibrary");
    System.out.println("wrapper library loaded");
    }
    
    然后首先加载businesslibrary(通过全局变量创建日志查看),然后加载wrapperlibrary。该控件返回java客户机,并在控制台上打印语句“wrapper library loaded”。这之后有一个电话 使用本机方法。但是控件从未到达本机方法的实现。在此之前,错误
    ***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链接。
    还检查是否有一个库链接到了GLIMC的调试版本(Windows上的带有C++运行时库的问题)。
    尝试针对glibc静态链接您的库,或者为了排除将包装器和业务库静态链接到一个库中的可能性。

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

    在每种情况下,它都是由引用数组外部的数组成员引起的。该引用没有导致分段错误,因为它仍然在程序中另一个数组的范围内。然而,当我释放阵列时,事情变得一团糟,以至于抛出了这个错误


    修复方法是非常仔细地检查每个数组是否已正确分配,以及对数组成员的引用是否从未超出范围。

    在共享库中似乎存在问题。@Laurynas-Valgrind向我显示了两个错误,但只提到了地址,而不是实际代码,即使在调试版本中也是如此。所以,我不知道下一步该怎么办。粘贴因缺少空间而剪切的输出==23002==跳转到下一行所述的无效地址==23002==在0x246:==23002==地址0x246不是stack'd、malloc'd或(最近)free'd==23002==23002==进程以信号11(SIGSEGV)的默认操作终止= = 23002==地址0x246=23002==0x246:??@ ADIL的映射区域的坏权限。共享库在与C++可执行文件一起使用时是良好的,但在通过java加载时会出现问题。我已经看到,问题显然出现在共享库的加载阶段。@HS地址0x246作为跳转目标看起来肯定是错误的。是否还有更多的行不是说“在0xADDRESS”,而是说“按0xADDRESS”?解决方案与您的建议有些类似-它与链接有关。业务库有自己的宽字符API重写实现,因为它使用的是2字节Unicode。它本来应该链接到这些API,但实际上是动态链接到系统API,系统API的大小应该是4。我已经更改了被重写的API的名称以更正此问题。现在,包装器和业务库都与重写的API链接。谢谢。@HS:如果你自己解决了一个问题,你可以将解决方案作为答案发布并接受,这样其他人就可以找到它。