踩内存问题,个人认为算是比较容易出现但是有很难定位的问题,被踩者轻者功能瘫痪,重者一命呜呼,直接诱发死机。产生踩内存的的原因也比较多样,比较典型的有如下几种:

  • 数组越界访问
  • 字符串越界操作
  • 直接操作野指针
  • 操作了一块已经被释放了内存

这几种问题,单独说起来都是比较容易发现问题,但这些问题往往在某些环境中不会出现,但是在另外的环境下几乎是必现问题,这时定位起来难度就便增加了很多。这种情况往往是基本逻辑没有问题,在某些环境下(多核、异步、其他复杂环境等)逻辑上出现错误导致出现踩内存的问题。

下面我记录一下遇到过的踩内存问题,定位了很久… 记忆尤新,可能让我亢奋的是我定位时的骚操作

1. 发现问题

发现问题比较简单,测试或者使用过程中突现了一个死机问题,通过core文件(获取其他信息)显示,第一想法是Oh, no, impossible, 这些死机问题怎么能死在这里???,代码不可能进入这个流程呀?,如果是这种情况,恭喜你中奖了,它基本上是因为踩内存引起的。

如果大概率是踩内存引起的死机问题,在仔细分析代码后没有什么效果的情况下,那么我们需要尝试去稳定复现此问题(可能很多条件不允许)

2. 复现问题出现的场景

想方设法找到必现条件。Why? 如果找不到必现条件,就算想验证我的想法都变得比较难,因为我不确定是它没有出现还是已经把它改好了。因此我认为找到必现条件几乎是必要的(目前还是一个小白)。

3. 分析代码逻辑

这个过程是贯穿整个问题的生命周期,甚至更长。分析代码并结合复现情景,把出现此问题的所有可能都进行分析,并进行尝试。尝试定位过程中不要求解决问题,**首先确定该问题是否为此问题引起的。**比如说:你怀疑由于提前释放了某一块内存,后面有操作了它,那么好,现在劳资就不释放此内存,然后对齐进行测试,确定是否出现此问题。如果问题依旧,那不好意思,咱们需要继续定位。但是如果不出现刚才的死机问题(可能由于没有释放内存出现OM了),那恭喜你,基本就是它导致的了。

这里我说一下我当时干过的骚操作:

在我确定踩内存与某些结构有关的情况下,但是我又不知道谁踩内存,

struct ohMyGod{
int *buff;
int length;
int cryptAlg;
int cryptAlgLen;
int hashAlg;
int hashAlgLen;
}

于是乎我将上述的结构体改为这样:

struct ohMyGod{
int unused[128];
int *buff;
int length;
int cryptAlg;
int cryptAlgLen;
int hashAlg;
int hashAlgLen;
int unused[128];
}

我当时的想法:你小子不是要踩内存吗? 劳资给你开一个VIP包间,你尽情的踩吧,我反正不使用这些内存。结果通过这种方式定位到了其中一个结构体。然后结合复现条件慢慢定位到了踩内存是由于新增的异步处理造成的。

4. 解决问题

踩内存的问题难度在于定位,解决往往比较简单。

记一次《C语言踩内存》问题定位有感的更多相关文章

  1. C语言中内存的申请函数

    C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等. alloca是向栈申请内存,因此无需释放. malloc分配的内存是位于堆中的,并且 ...

  2. JVM内存管理------JAVA语言的内存管理概述

    引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...

  3. 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域

    [源码下载] 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 动态分配内存 链 ...

  4. c语言之内存的申请malloc() 和释放free()

    c语言之内存的申请malloc() 和释放free() 1.如何使用 malloc 函数 malloc是一个函数,专门用来从堆上分配内存.使用malloc函数需要几个要求: 内存分配给谁?分配多大内存 ...

  5. C语言的内存管理

    C语言的内存管理 转载:http://blog.csdn.net/wind19/article/details/5964090   对于一个C语言程序而言,内存空间主要由五个部分组成代码段(.text ...

  6. (十一)C语言中内存堆和栈的区别

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认 ...

  7. C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针

    C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针 (1)开辟的内存没有释放,造成内存泄露 (2)野指针被使用或释放 (3)非法释放指针 (1)开辟的内存没有释放.造成内存泄露,以下的样 ...

  8. C语言中内存分配 (转)

    在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...

  9. 【转】C语言中内存分配

    原文:C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...

随机推荐

  1. python安全编程之指纹识别

    什么是cms CMS是Content Management System的缩写,意为"内容管理系统",这是百度百科的解释,意思是相当于网站的建站模板,整个网站架构已经集成好了,只需 ...

  2. 学习笔记-CCS-MSP430F5529[快速入门篇一]

    由于最近竞赛需要使用TI公司的MSP430系列芯片,本人在最近两天匆忙的学习了一下MSP430F5529(下文统一称作5529)的使用.写下本文是为了将这两天学习内容做一个复习,并且将学习过程中遇到的 ...

  3. Centos LInux 7.0 内核3.1 升级简化流程

    Centos LInux 7.0 内核3.1 升级建华流程 1)#导入ELRepo软件仓库的公共秘钥rpm --import https://www.elrepo.org/RPM-GPG-KEY-el ...

  4. noip模拟测试22

    考试总结:这次考试题,有好多部分分,导致了我在考试过程中一心想拿到这些部分分,对于正解没有留出时间进行思考,这是一个教训,在以后的考试中我一定要留出足够的思考时间,不要被部分分限制.还有,我的部分分也 ...

  5. 【NLP学习其四】如何构建自己用于训练的数据集?什么是词性标注?

    数据集与词性标注 数据集是NLP中的重要一环. 但是提到数据集,很多人的第一个想法可能是:"这玩意从网上下载就好了,不用管". 真的不用管?最开始我也是这么认为的 于是我直奔CoN ...

  6. Blazor 路由及导航开发指南

    翻译自 Waqas Anwar 2021年4月2日的文章 <A Developer's Guide To Blazor Routing and Navigation> [1] 检查传入的请 ...

  7. Flutter 中的动画

    Flutter 中动画的创建有很多种, 需要根据具体的需求选择不同的动画.如果只是简单的布局等的动画直接使用最简单的隐式动画就可以了,因为隐式动画是由框架控制的,所以仅仅只需要更改变需要变化属性就可以 ...

  8. MapReduce框架原理--Shuffle机制

    Shuffle机制 Mapreduce确保每个reducer的输入都是按键排序的.系统执行排序的过程(Map方法之后,Reduce方法之前的数据处理过程)称之为Shuffle. partition分区 ...

  9. python中两种拷贝目录方法的比较

    首先是用python自己的api: shutil.copytree('./build/tested/doc', './build/tested/build/doc') 优点是改变平台时不需要修改代码, ...

  10. 你认为的.NET数据库连接池,真的是全部吗?

    一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象. DBA能在对业务方无侵 ...