记一次《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节主要 ...
随机推荐
- Maven-内部多个项目依赖自动升级版本的部署
需要自动升级版本的AAA项目发布 (有内部依赖时) 步骤比较复杂, 有一些需要根据实际情况调整. 考虑了以下几种可能性: 依赖模块的版本有更新 依赖模块版本没更新 依赖模块的版本号: 直接定义, 用属 ...
- Mysql读写锁保姆级图文教程
摘要:读锁会阻塞写,但是不会阻塞读,而写锁会把杜希俄都阻塞. 本文分享自华为云社区<Mysql保姆级读写锁图文教程丨[绽放吧!数据库]>,作者:Code皮皮虾 . 准备 创建mylock表 ...
- selenium WebDriverWait
Selenium WebDriverWait的知识: 一.webdrivewait 示例代码 from selenium import webdriver from selenium.webdri ...
- 「Leetcode-算法_Easy461」通过「简单」题目学习位运算
Easy 461.汉明距离 因为原题目翻译效果不佳,这里是笔者自己的理解. 输入两个二进制数 x.y, 输出将 y 变为 x 所需改变的二进制位数,成为汉明距离. 注意: 0 ≤ x, y < ...
- 利用MySQL原数据信息批量转换指定库数据表生成Hive建表语句
1.写出文件工具类 package ccc.utile; import java.io.*; /** * @author ccc * @version 1.0.0 * @ClassName Write ...
- Python中input()函数用法
input()函数获取用户输入数据,实现用户交互 语法格式: 变量 = input("提示信息") input()返回的是字符串,无论输入的是数字还是字符串,默认的输入结束键是回车 ...
- ElasticSearch进阶篇(一)--版本控制
一.前言 ElasticSearch(以下简称ES)的数据写入支持高并发,高并发就会带来很普遍的数据一致性问题.常见的解决方法就是加锁.同样,ES为了保证高并发写的数据一致性问题,加入了类似于锁的实现 ...
- CAS5.3服务器搭建与客户端整合SpringBoot以及踩坑笔记
CAS5.3服务器搭建与客户端整合SpringBoot以及踩坑笔记 cas服务器的搭建 导出证书(1和2步骤是找了课程,随便写了一下存记录,不过对于自己测试不投入使用应该不影响) C:\Users\D ...
- 安全工具推荐之Goby篇
Goby(鰕虎鱼) 这个东西出来也很久了,有一年多了吧,个人感觉用起来还不错(当然见仁见智哈,别喷我),今天拿来水一篇 官网有很详细的使用说明,所以本文纯属发表一下感慨,非技术贴 官网在此:https ...
- K8s 部署 Gitlab
K8s 版本:1.20.6 这里使用的镜像不是官方的,而是 Gitlab 容器化中使用非常多的一个第三方镜像:sameersbn/gitlab,基本上和官方保持同步更新.地址:http://www.d ...