记一次《C语言踩内存》问题定位有感

踩内存问题,个人认为算是比较容易出现但是有很难定位的问题,被踩者轻者功能瘫痪,重者一命呜呼,直接诱发死机。产生踩内存的的原因也比较多样,比较典型的有如下几种:
- 数组越界访问
- 字符串越界操作
- 直接操作野指针
- 操作了一块已经被释放了内存
这几种问题,单独说起来都是比较容易发现问题,但这些问题往往在某些环境中不会出现,但是在另外的环境下几乎是必现问题,这时定位起来难度就便增加了很多。这种情况往往是基本逻辑没有问题,在某些环境下(多核、异步、其他复杂环境等)逻辑上出现错误导致出现踩内存的问题。
下面我记录一下遇到过的踩内存问题,定位了很久… 记忆尤新,可能让我亢奋的是我定位时的骚操作。
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语言踩内存》问题定位有感的更多相关文章
- C语言中内存的申请函数
C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等. alloca是向栈申请内存,因此无需释放. malloc分配的内存是位于堆中的,并且 ...
- JVM内存管理------JAVA语言的内存管理概述
引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...
- 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域
[源码下载] 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 动态分配内存 链 ...
- c语言之内存的申请malloc() 和释放free()
c语言之内存的申请malloc() 和释放free() 1.如何使用 malloc 函数 malloc是一个函数,专门用来从堆上分配内存.使用malloc函数需要几个要求: 内存分配给谁?分配多大内存 ...
- C语言的内存管理
C语言的内存管理 转载:http://blog.csdn.net/wind19/article/details/5964090 对于一个C语言程序而言,内存空间主要由五个部分组成代码段(.text ...
- (十一)C语言中内存堆和栈的区别
在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认 ...
- C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针
C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针 (1)开辟的内存没有释放,造成内存泄露 (2)野指针被使用或释放 (3)非法释放指针 (1)开辟的内存没有释放.造成内存泄露,以下的样 ...
- C语言中内存分配 (转)
在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...
- 【转】C语言中内存分配
原文:C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...
随机推荐
- 大数据学习(21)—— ZooKeeper原理
这一篇我们对zookeeper的主要原理做一个简单介绍.zookeeper的核心原理是zookeeper atomic broadcast(ZAB协议),它来源于paxos协议.这里用通俗易懂的话,介 ...
- linux笔记全(无图版)
1.ls 查看当前目录下的所有内容 黑色的是文件,蓝色的是文件夹,也就是目录 2.rm -f anaconda-ks. cfg 彻底删除文件(如不确定,则需要先保存备份,也就是快照) 3.ifconf ...
- Java数组04——多维数组
多维数组 package array; public class ArrayDemon06 { public static void main(String[] args) { ...
- 靶机CH4INRULZ_v1.0.1
nmap开路. root@kali:~# nmap -sP 192.168.1.* //拿到靶机地址192.168.1.8 root@kali:~# nmap -p- -sS -v -sV 192.1 ...
- xubuntu下制作自定义的ISO文件
by han; 1.打开命令编辑器,建立文件 # sudo su # mkdir -p /opt/custom_conf/user_custom_conf/config 2.将自定义的设置复制保存到/ ...
- 【剑指offer】65. 不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法 知识点:数学:位运算 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用 "+"."-"."* ...
- 代码中如何优化过多的if..else
针对代码中,过多的 if ... else ..,如何优化减少if else呢?(非常重要的优化技巧) 缺点:过多的if else 导致阅读不方便,逻辑过于复杂,代码多长. 解决方法:可以采用多个方 ...
- Golang语言系列-07-函数
函数 函数的基本概念 package main import ( "fmt" ) // 函数 // 函数存在的意义:函数能够让代码结构更加清晰,更简洁,能够让代码复用 // 函数是 ...
- 【笔记】F1 score
F1 score 关于精准率和召回率 精准率和召回率可以很好的评价对于数据极度偏斜的二分类问题的算法,有个问题,毕竟是两个指标,有的时候这两个指标也会产生差异,对于不同的算法,精准率可能高一些,召回率 ...
- 当Transactional碰到锁,有个大坑,要小心。
你好呀,我是why. 前几天在某平台看到一个技术问题,很有意思啊. 涉及到的两个技术点,大家平时开发使用的也比较多,但是属于一个小细节,深挖下去,还是有点意思的. 来,先带你看一下问题是什么,同时给你 ...