C++ 踩内存】的更多相关文章

遇到一个crash,log如下: BUG: unable to handle kernel NULL pointer dereference at (null) IP: [<ffffffff81166504>] s_show+0xe4/0x330 PGD PUD 12666d8067 PMD Oops: [#] SMP last sysfs file: /sys/devices/pci0000:/:::::/expander-:/port-::/end_device-::/target0::/…
1.从上往下,栈在堆上面(记忆方法:站在堆上面),二者向里压缩,也就是说,栈地址减少,堆地址增加.栈顶是小地址. 2.模拟踩内存,让程序崩溃.代码如下: int main(int argc, char* argv[]) { int a = 263; int* pa = &a; char tmp[4]="ab"; strcpy(tmp,"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); int b = *pa+10; }…
踩内存问题,个人认为算是比较容易出现但是有很难定位的问题,被踩者轻者功能瘫痪,重者一命呜呼,直接诱发死机.产生踩内存的的原因也比较多样,比较典型的有如下几种: 数组越界访问 字符串越界操作 直接操作野指针 操作了一块已经被释放了内存 这几种问题,单独说起来都是比较容易发现问题,但这些问题往往在某些环境中不会出现,但是在另外的环境下几乎是必现问题,这时定位起来难度就便增加了很多.这种情况往往是基本逻辑没有问题,在某些环境下(多核.异步.其他复杂环境等)逻辑上出现错误导致出现踩内存的问题. 下面我记…
Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,是公认的最接近Purify的产品,它包含一个内核——一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务——调试,分析,或测试等.Valgrind可以检测内存泄漏和内存越界,还可以分析cache的使用等,灵活轻巧而又强大. 1.Valgrind概观 Valgrind的最新版是3.2.3,该版本包含下列工具:     1)memcheck:检查程序中的内存问题,如泄漏.越界.非法指针等.     2)callg…
from http://www.linuxidc.com/Linux/2012-06/63754.htm Valgrind通常用来成分析程序性能及程序中的内存泄露错误 一 Valgrind工具集简绍 Valgrind包含下列工具: 1.memcheck:检查程序中的内存问题,如泄漏.越界.非法指针等. 2.callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能. 3.cachegrind:分析CPU的cache命中率.丢失率,用于进行代码优化. 4.helgrind:用于检查多线…
1. 仿踩内存 if (buf[len - 1] != 0x5A) { return; }…
1.概述 在Windows下微软给我们提供了一个十分强大的C/C++运行时库,这个运行时库中包含了很多有用的功能.而众多强大功能之一就是内存泄露的检测. C/C++提供了强大的内存管理功能,不过随之而来的却是内存管理的复杂问题.内存泄露.踩内存等问题随之大量产生.要完全杜绝这些问题是比较困难,不过一个高效有用的工具却可以将内存泄露的问题第一时间发现并处理掉. VS的C/C++运行时库中内存管理系统的基础就是调试堆,调试堆和普通的堆不同之处就在于每一块分配的内存前后都有一些额外的信息.下面就是每块…
这里举个例子查看内存, 环境为:vs 2017 测试为strcpy[因为测试老api,需要在 预处理中 添加 _CRT_SECURE_NO_WARNINGS ] 测试问题:内存溢出 源码: #include <iostream>#include <stdlib.h>#include <string> #define MY_STR "hello"#define YOUR_STR "boom"#define NUMBERS "…
摘要:ASAN全称:Address Sanitizer,google发明的一种内存地址错误检查器.目前已经被集成到各大编译器中. 本文分享自华为云社区<内存定位利器-ASAN使用小结>,作者:云存储开发者支持团队. 1.什么是ASAN ASAN全称:Address Sanitizer,google发明的一种内存地址错误检查器.目前已经被集成到各大编译器中. 2.为什么我们需要ASAN 在c/c++开发过程中,经常出现内存异常使用的问题,比如踩内存,被踩的内存如果未被使用对外无影响.而一旦使用了…
1.尽量使用vector和string替换数组,但是老的代码还是使用数组.如果老的接口期望是数组,怎么办? 需要把vector和string,暴露出数组接口,也就是第一个元素的地址. 2.考虑方法DoSomething(const int* pInt,size_t size),对于vector<int> vec,调用如下: DoSomething(&vec[0], v.size()); 这里有个问题,vec的大小可能为0,更安全的做法是: if(!vec.empty()) { DoSo…
直接原因: 释放内存时,内存已经被修改或释放. 产生可能: 1.内存越界操作,踩了待释放指针头信息. 2.重复释放指针. 处理: 采用排除法,逐步屏蔽掉一些代码,当屏蔽某些代码时,不抛此异常,说明问题就出在这些代码里面. 逐个屏蔽堆指针,看是哪个指针出的问题,再看是否被重复释放,是否被踩内存.…
1. 整型和枚举类型数据的转换 测试代码如下: #include <stdio.h> typedef enum _E_TYPE_T {     E_TYPE_1 = -1,     E_TYPE_2,     E_TYPE_3,     E_TYPE_END }E_TYPE_T; int main(int argc, char* argv[]) {     unsigned char ui1_value = 0;     E_TYPE_T e_type = E_TYPE_1;        …
本文内容大致翻译自 libevent-book, 但不是照本翻译. 成文时, libevent最新的稳定版为 2.1.8 stable. 即本文如无特殊说明, 所有描述均以 2.1.8 stable 版本为准. 本文为系列文章的第一篇, 对应libevent-book的 chapter 0 + chapter 1 + R0 + R1 0. 前提条件 这个文档是对libevent的介绍与指导, 阅读文档需要你具有以下的能力: 你精通C语言 你至少了解Unix网络编程. 你会安装libevent 你…
前言 "new和malloc()有什么区别",这是一个很常见的C++面试题.我的回答是"new等于malloc()后再选择性执行构造函数".执行流程上是这样的,但是这样的回答是有纰漏的,比如没有考虑异常.下面就仔细聊一聊new,了解了new就了解了delete. 选择性的含义是有构造函数就会执行,没有构造函数则不会执行. new是什么 new是C++的一个关键字,这个关键字有两种用法 new运算符:分配内存 new表达式:分配内存并初始化 通常我们都是使用new表达…
三板斧如下: 使用windbg打开dump文件,设置好对应进程的 pdb 文件(这个很关键.为了避免releas优化导致符号文件错乱,我发布的所有                      release 版都是关闭代码优化的). 在windbg的"edit"->"open/close log file"  设置log 路径 “d:\a.log” 输入命令 “~*er?$t1=((ntdll!_NT_TIB*)@$teb)->StackLimit;r?$…
1.memory拷贝,根据拷贝的字节个数,从src一个一个字节拷贝到dst,拷贝过程不管src的取值,也不管dst是否能容纳.2.因此,对于memory拷贝,src中NULL字符(取值为0的字符)后面的字符也能拷贝过去.不管dst是否能容纳,都拷贝过去,会存在踩内存.为了避免踩内存,拷贝的字节个数,需要小于等于dst分配的大小.3.string拷贝,遇到src的NULL字符结束.因此,strcpy有两个问题特别需要注意:一,src结尾必须要有NULL字符,否则会一直拷贝下去,直到遇到NULL字符…
1 预处理 问题1:什么是预编译?何时需要预编译? 答: 预编译又称预处理,是整个编译过程最先做的工作,即程序执行前的一些预处理工作.主要处理#开头的指令.如拷贝#include包含的文件代码.替换#define定义的宏.条件编译#if等.. 何时需要预编译: 1.总是使用不经常改动的大型代码体. 2.程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项.在这种情况下,可以将所有包含文件预编译为一个预编译头. 问题2:写一个"标准"宏,这个宏输入两个参数并返回较小的一个…
C++即支持C风格的类型转换,又有自己风格的类型转换.C风格的转换格式很简单,但是有不少缺点的: 1.转换太过随意,可以在任意类型之间转换.你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成一个派生类对象的指针,这些转换之间的差距是非常巨大的,但是传统的C语言风格的类型转换没有区分这些. 2.C风格的转换没有统一的关键字和标示符.对于大型系统,做代码排查时容易遗漏和忽略. C++风格完美的解决了上面两个问题.1.对类型转换做了细分,提供了四种不同…
今天在弄一下啊小小程序的时候.报错,出现了问题.先看代码 int main(int argc, char* argv[]) { char *filename = "interface_ipset_1_1.json"; char* split1 = "_"; char* split2 = "."; char splitfile1[4][NAME_MAX]; sagent_string_split(filename,split1,splitfile1…
c#相较于c,c++而言,在内存管理上为程序员提供了极大的方便,解放了程序员与内存地址打交道,提高了程序员的工作效率.比如c中分配的malloc堆空间没有释放导致的内存泄露,数组越界导致的踩内存错误,使用了已释放的内存空间错误等等.这些在C#中统统的都不存在,主要是由于clr提供的安全检查机制以及垃圾回收机制.本篇文章主要来介绍常用的垃圾回收算法以及CLR中使用的垃圾回收算法. 在通常的情况下当分配对象时发现内存堆空间不足时,此时GC会执行垃圾回收算法.默认情况下,进程启动,会被分配相应的堆空间…
Contest 51 (2018年11月22日,周四早上)(题号681-684) 链接:https://leetcode.com/contest/leetcode-weekly-contest-51 比赛结果记录:3/4,ranking:270/2879.第三题有点类似于图的最小生成树,第四题似乎是很火的种花题(第四题我好像几个月之前做过,有印象,当时也是自己做的). [682]Baseball Game(第一题 3分) You're now a baseball game point reco…
导语 所有的编程练习都在牛客网OJ提交,链接: https://www.nowcoder.com/ta/coding-interviews 九章算法的 lintcode 也有这本书的题目.https://www.lintcode.com/ladder/6/ 第二章 面试需要的基础知识 [面试题3]二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有…
P1426 小鱼会有危险吗 我个人觉得这个题目出的不好,没说明白,就先只粘贴的AC代码吧 #include <bits/stdc++.h> using namespace std; int main() { double s, x; cin >> s >> x; double start = s - x, endd = s + x; //探测器的范围 double speed = 7.0, length = 0.0; //没有游到探测器范围之前 while(length…
任务说明:由一个根节点分叉,越分越多,就成了树.树可以表示数据之间的从属关系 P1087 FBI树 给一个01字符串,0对应B,1对应I,F对应既有0子节点又有1子节点的根节点,输出这棵树的后序遍历.字符串长度小于等于2^10. 心情好,写代码一次ac了 #include <iostream> #include <cstdio> #include <cstdlib> #include <stack> #include <map> #include…
一.valgrind介绍 valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,用于构建动态分析工具的装备性框架.它包括一个工具集,每个工具执行某种类型的调试.分析或类似的任务,以帮助完善你的程序.Valgrind的架构是模块化的,所以可以容易的创建新的工具而又不会扰乱现有的结构. valgrind主要包含以下工具: 1.memcheck:检查程序中的内存问题,如泄漏.越界.非法指针等. 2.callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能. 3.ca…
​作者:jiwenqiang,DFX技术专家 提到开发一个产品,我们通常首先想到的是要实现什么样的功能,但是除了功能之外,非功能属性也会很大程度上影响一个产品的体验效果,比如不定时出现的应用卡死.崩溃现象.那为什么有的系统故障频频,有的却很少出现这些问题呢,这就不得不提到我们今天的主角DFX了. 一.什么是DFX? DFX是早在1960~1970年代就出现的产品设计理念,但是对于不少开发者而言,这是一个陌生的概念,什么是DFX?所谓DFX(Design For X),是指产品的非功能属性设计,其…
udp的服务端有一个大坑,即如果收包不及时,在系统缓冲写满后,将大量丢包. 在网上通常的示例中,一般在for循环中执行操作逻辑.这在生产环境将是一个隐患.是的,俺就翻车了. go强大简易的并发能力可以用在处理udp数据上. PoolSizeUDP := 1472 listener, err := net.ListenUDP("udp", &net.UDPAddr{ IP: net.ParseIP(listenIP), Port: port, }) if err != nil {…
方法论 当我们遇到问题,应该怎么办?这不仅应用于程序开发,也是我们在生活中遇到问题的时候,应该想的事儿,怎么办!趁着此次机会,我好好想了七秒钟. 先问是不是问题,如果不是就不用解决了 如果确实是问题,那就得先找到问题出现位置,也就是定位问题.怎么定位呢?缩小问题范围是一个办法 定位问题后,就得分析问题 最后,解决问题 也就是:问题->定位->分析->解决.我觉得吧,这些步骤,在程序开发中得调试,也是非常有趣的实践方法. 程序开发调试 软件开发过程中,总是经常出现不如意的结果,这个时候就要…
一例智能网卡(mellanox)的网卡故障分析 背景:这个是在centos 7.6.1810的环境上复现的,智能网卡是目前很多 云服务器上的网卡标配,在oppo主要用于vpc等场景,智能网卡的代码随着 功能的增强导致复杂度一直在上升,驱动的bug一直是内核bug 中的大头,在遇到类似问题时,内核开发者由于对驱动代码不熟悉,排查 会比较费劲,本身涉及的背景知识有:dma_pool,dma_page,net_device, mlx5_core_dev设备,设备卸载,uaf问题等,另外,这个bug目测…
1.3.10内核,在项目中遇到一种情况,我们根据sk指针hash到一个cpu上,然后访问该cpu对应分配的一个数据区. 然后系统会偶尔crash掉,crash掉有两种情况,一种是cred的rcu回收时出现计数bugon,一种是hung, hung的这种一般是由于由一个持有mutex的进程在rttable的resize过程中synchronize_rcu() 出现等待gp,而另外一个进程也需要这把mutex的锁. 继续排查发现等待gp是因为synchronize_rcu() 自身的这个rcu没有及…