*** glibc detected *** double free ....

2023-10-29

*** glibc detected *** free(): invalid pointer:
*** glibc detected *** malloc(): memory corruption:
*** glibc detected *** double free or corruption (out): 0x00000000005c18a0 ***
*** glibc detected *** corrupted double-linked list: 0x00000000005ab150 ***

你是否遇到过这样的情况,太沮丧了,程序总是无端coredump,gdb到core文件里面也看不出个所以然来,这对于一个大型的商业系统来说太令人恐怖了,事故随时可能发生。

遇到棘手的问题,慌张是没用的,解决不了任何问题。先坐下来,喝杯茶,舒缓一下神经。

内存问题始终是c++程序员需要去面对的问题,这也是c++语言的门槛较高的原因之一。通常我们会犯的内存问题大概有以下几种:

1.内存重复释放,出现double free时,通常是由于这种情况所致。
2.内存泄露,分配的内存忘了释放。
3.内存越界使用,使用了不该使用的内存。
4.使用了无效指针。
5.空指针,对一个空指针进行操作。


对于第一种和第二种,第五种情况,就不用多说,会产生什么后果大家应该都很清楚。

第四种情况,通常是指操作已释放的对象,如:
1.已释放对象,却再次操作该指针所指对象。
2.多线程中某一动态分配的对象同时被两个线程使用,一个线程释放了该对象,而另一线程继续对该对象进行操作。

我们重点探讨第三种情况,相对于另几种情况,这可以称得上是疑难杂症了(第四种情况也可以理解成内存越界使用)。

内存越界使用,这样的错误引起的问题存在极大的不确定性,有时大,有时小,有时可能不会对程序的运行产生影响,正是这种不易重现的错误,才是最致命的,一旦出错破坏性极大。

什么原因会造成内存越界使用呢?有以下几种情况,可供参考:
例1:
        char buf[32] = {0};
        for(int i=0; i<n; i++)// n < 32 or n > 32
        {
            buf[i] = 'x';
        }
        ....
        
例2:
        char buf[32] = {0};
        string str = "this is a test sting !!!!";
        sprintf(buf, "this is a test buf!string:%s", str.c_str()); //out of buffer space
        ....
        
例3:
        string str = "this is a test string!!!!";
        char buf[16] = {0};
        strcpy(buf, str.c_str()); //out of buffer space
        
类似的还存在隐患的函数还有:
        strcat,vsprintf等

同样,memcpy, memset, memmove等一些内存操作函数在使用时也一定要注意。
        
当这样的代码一旦运行,错误就在所难免,会带来的后果也是不确定的,通常可能会造成如下后果:

1.破坏了堆中的内存分配信息数据,特别是动态分配的内存块的内存信息数据,因为操作系统在分配和释放内存块时需要访问该数据,一旦该数据被破坏,以下的几种情况都可能会出现。
        *** glibc detected *** free(): invalid pointer:
        *** glibc detected *** malloc(): memory corruption:
        *** glibc detected *** double free or corruption (out): 0x00000000005c18a0 ***
        *** glibc detected *** corrupted double-linked list: 0x00000000005ab150 ***        

2.破坏了程序自己的其他对象的内存空间,这种破坏会影响程序执行的不正确性,当然也会诱发coredump,如破坏了指针数据。

3.破坏了空闲内存块,很幸运,这样不会产生什么问题,但谁知道什么时候不幸会降临呢?

通常,代码错误被激发也是偶然的,也就是说之前你的程序一直正常,可能由于你为类增加了两个成员变量,或者改变了某一部分代码,coredump就频繁发生,而你增加的代码绝不会有任何问题,这时你就应该考虑是否是某些内存被破坏了。

排查的原则,首先是保证能重现错误,根据错误估计可能的环节,逐步裁减代码,缩小排查空间。
检查所有的内存操作函数,检查内存越界的可能。常用的内存操作函数:
sprintf snprintf
vsprintf vsnprintf
strcpy strncpy strcat
memcpy memmove memset bcopy

如果有用到自己编写的动态库的情况,要确保动态库的编译与程序编译的环境一致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

*** glibc detected *** double free .... 的相关文章

  • 为什么 OS X 和 Linux 之间的 UTF-8 文本排序顺序不同?

    我有一个包含 UTF 8 编码文本行的文本文件 mac os x cat unsorted txt foo foo 津 如果它有助于重现问题 这里是文件中确切字节的校验和和转储 以及如何自己生成文件 在 Linux 上 使用base64 d
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • 查找文本文件中的唯一单词

    我正在用 Java 编写这个程序来查找文本文件中的唯一单词 我想知道这段代码是否正确 因为它甚至将空格显示为单词 String words List
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • 去除字符串的最佳方法是什么?

    我需要具有最佳性能的想法来删除 过滤字符串 I have string Input view 512 3 159 删除 view 和 的最佳性能方法是什么 和引号 我可以做这个 Input Input Replace view Replac
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • 正则表达式字符串中第一个和最后一个非点的位置

    我希望找到字符串的第一个和最后一个非点元素的位置 理想情况下我想这样做regex在基地R 我已经写过R解决问题的代码 不过 我对一个感兴趣regex解决方案 感谢您的任何建议 这是一个示例数据集和R代码以获得所需的结果 此代码拆分字符串并使
  • 如何在线程创建和退出时调用函数?

    include
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • 无法在“System.String”类型上的多个长度相等的构造函数之间进行选择

    尝试解析类型时出现以下错误 无法在 System String 类型上的多个长度相等的构造函数之间进行选择 注册组件时 使用UsingConstructor 配置方法显式选择构造函数 该类型有 1 个构造函数 该构造函数采用IReposit
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • 在 HTML5 Javascript 中将 BlobBuilder 转换为字符串

    function blobToString blob var reader new FileReader var d reader onloadend function d callback reader result console lo
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • shell中如何分割字符串

    我有一个变量作为 string ABC400p2q4 我怎样才能分开ABC400 and p2q4 我需要将它分成两个变量 结果我得到 echo var1 ABC400 echo var2 p2q4 可以用任何字母字符代替 ABC 可以用任
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win

随机推荐

  • 自动化控制编程软件(PLC/软PLC/Labviw/C#)特点

    一 PLC 什么是PLC PLC就是可编程控制器 是一种数字运算操作的电子系统 专为工业环境而设计 它采用了可编程序的存储器 用来在其内部存储逻辑运算 顺序控制 定时 计数和算术运算等操作的基于用户的指令 并通过数字式和模拟式的输入和输出
  • GPU通用计算(GPGPU)——将图形处理器用于高性能计算领域

    1 1 研究背景和意义随着当前计算机性能的不断提高 应用范围越来越广泛 不同的计算任务和计算需求都在快速增长 这就决定了处理器朝着通用化和专用化两个方向飞速发展 一方面 以CPU为代表的通用处理器是现代计算机的核心部件 经过多次器件换代的变
  • 【廖雪峰python进阶笔记】类的继承

    1 继承 如果已经定义了Person类 需要定义新的Student和Teacher类时 可以直接从Person类继承 class Person object def init self name gender self name name
  • int值太大造成数据溢出会变成负数的原因和解决方案

    这里造成数据溢出 造成负数的原因 原码 反码和补码的资料 十进制数字存储在计算机时要转换为二进制 数字在累加的时候会不断进位 超过最大范围时符号位就变成了1 1表示的是负数 计算机就理解成这是个负数了 java各种类型的数据范围 long
  • ORA-01841 :(完整)年份必须介于-4713和+9999之间,而不是0 Kaki的博客

    ORA 01841 完整 年份必须介于 4713和 9999之间 而不是0 Kaki的博客 我遇到这个问题的原因是因为数据中有空格 导致tochar 无法正常解析 请检查是否是数据问题 欢迎点赞关注收藏哦 码云 B站搜索KakiNakaji
  • 怎么创建css样式表,怎样创建可反复使用的外部CSS样式表?

    创建可反复使用的外部CSS样式表 用DreamWeaver在某网页中创建了一种CSS样式后 如果你要在另外的网页中应用该样式 你不必从新创建该CSS样式 只要你创建了外部CSS样式表文件 externalCSSstylesheet 你便可以
  • python3 self的用法

    在 Python 中 self 是一个特殊的变量 每个类都应该有一个 self 变量 它是一个指针 指向调用该方法的对象本身 例如 在定义一个类的方法时 你需要给这个方法的第一个参数命名为 self 这样 在调用这个方法时 你不需要显式地传
  • Kali下安装sublime text3

    Kali下安装sublime text3 文章目录 一 sublime简介 二 kali下安装sublime的步骤 1 下载安装包 2 将安装包复制到某个文件下 3 在终端下打开文件 总结 一 sublime简介 Sublime Text
  • OpenCV-Python图像形态变换概述及morphologyEx函数介绍

    前往老猿Python博客 https blog csdn net LaoYuanPython 一 形态变换概念 图像形态变换又称为形态学图像处理 图像形态学 它是基于数学形态学 Mathematical Morphology 基础之上建立的
  • Vue3.x学习笔记(进阶)

    Vue3 x学习笔记 进阶 全局组件 局部组件 父子组件的静态传值 父子组件的动态传值 动态绑定函数 组件传值时的校验操作 单项数据流机制 Non props使用技巧 子组件调用父组件方法 传值 校验 slot 插槽默认值 具名插槽 具名插
  • PermissionError: [Errno 13] Permission denied

    错误 PermissionError Errno 13 Permission denied 错误原因 权限错误 errno 13 权限被拒绝 错误产生的原因是文件无法打开 可能产生的原因是文件找不到 或者被占用 或者无权限访问 或者打开的不
  • K最近邻算法

    一 原理 K最近邻算法 K Nearest Neighbor KNN 是最基本的分类算法 其基本原理是 从最近的K个邻居 样本 中 选择出现次数最多的类别作为判定类别 K最近邻算法可以理解为是一个分类算法 常用于标签的预测 如性别 实现KN
  • vue锚点导航

    在box中 div class scrooltop gernerateId index return box index 在锚导航中 ul li class leftlist li ul div
  • vue-cli3引入less预处理语言

    一 引入less npm install less less loader save dev 二 引入样式资源处理器 在style资源中注入css sass scss less stylus这些内容 主要作用导入一些公共的样式文件 避免在每
  • 64位OCR:Tesseract4.1+leptonica1.74编译安装步骤详解

    64位OCR开源Tesseract4 1 leptonica1 74 编译安装步骤详解 本博文的pdf下载地址 https download csdn net download dcx dcx 12310340 最近由于需要OCR技术对生成
  • 网页计数器JavaBean

    1 设计记载网页访问数量的javabean Counter java package beans public class Counter private int count public Counter count 0 public in
  • SQL -查看一个表占用的空间大小

    SQL 查看一个表占用的空间大小 select sum bytes 1024 1024 as size M from user segments where segment name upper 表名
  • 3D真人手办自己也能做,颠覆你的想象!

    3D真人手办是现今比较流行的收集品之一 这些手工制作的手办因其精致的制作工艺和高度还原的细节而备受推崇 每个3D手办都是由一群专业的制作人员和雕塑家经过精心设计和打造的 他们利用先进的3D打印技术和现代化的制作工艺 制作了各种形状 尺寸和色
  • 【OpenGL】Shader实例分析(五)- 边缘检测

    转发请保持地址 http blog csdn net stalendp article details 23139953 这里将介绍基于法线的边缘检测方法 这里的shader是参考官方的 http wiki unity3d com inde
  • *** glibc detected *** double free ....

    glibc detected free invalid pointer glibc detected malloc memory corruption glibc detected double free or corruption out