面临错误“检测到 *** glibc *** free(): invalid next size (fast)”

Posted

技术标签:

【中文标题】面临错误“检测到 *** glibc *** free(): invalid next size (fast)”【英文标题】:Facing an error "*** glibc detected *** free(): invalid next size (fast)" 【发布时间】:2011-01-19 23:53:35 【问题描述】:

请参阅 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++ 共享库。我的应用程序中有三个组件,

    Java 客户端 用作 JNI 包装器的 C++ 共享库。 (我将其称为“包装库”) 包含业务对象的 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的项目设置中,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() 的输出永远不会被打印出来。

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

【问题讨论】:

您的共享库似乎有问题。 @Laurynas - Valgrind 向我展示了两个错误,但仅提到即使在调试版本中也没有解决实际代码。所以,不知道下一步该怎么做。由于空间不足,粘贴了一段输出。 ==23002== 跳转到下一行说明的无效地址 ==23002== 在 0x246: ??? ==23002== 地址 0x246 未堆栈、malloc 或(最近)释放 ==23002== ==23002== 进程以信号 11(SIGSEGV)的默认操作终止 ==23002== 错误地址 0x246 ==23002== 0x246 处映射区域的权限:??? @Adil - 共享库在与 C++ 可执行文件一起使用时工作正常,但在通过 Java 加载时会出现问题。我已经看到问题显然出现在共享库的加载阶段。 @HS Address 0x246 作为跳转目标看起来肯定是错误的。是否还有其他行不是“在 0xADDRESS”而是“通过 0xADDRESS”? 【参考方案1】:

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

【讨论】:

解决方案与您的建议有些相似 - 它与链接有关。业务库有自己的覆盖宽字符 API 的实现,因为它使用 2 字节 Unicode。预计会链接到这些 api,而是动态链接到预计大小为 4 的系统 api。我已经更改了被覆盖的 api 的名称来纠正这个问题。现在包装器和业务库都与被覆盖的 api 链接。谢谢。 @HS:如果您自己解决问题,您可以将解决方案作为答案发布并接受,以便其他人找到。【参考方案2】:

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

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

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

【讨论】:

以上是关于面临错误“检测到 *** glibc *** free(): invalid next size (fast)”的主要内容,如果未能解决你的问题,请参考以下文章

GNU Parallel 面临静默退出和无效选项错误

Hive - 面临动态分区错误中的挑战

将 xcode 升级到 10.2 版后面临 AFNetworking 错误

使用 xmpp 框架登录 ios 应用程序时面临断言失败错误:ios

无法在 Spring 中配置 CSRF 以免面临 CORS 错误

在本地服务器中面临 CORS 错误