04-常见内存错误以及valgrind使用
04-常见内存错误以及valgrind使用
代码段:
仅仅读数据,因此对这一部分的数据。试图写仅仅读数据,这个在编译的时候基本上能够检測。
数据段/BSS段:
未初始化直接訪问,即使没有显示初始化,仍然会初始化为0
栈空间数据:
(1)局部变量。未初始化变量会给随机的初值。出现异常情况更诡异
(2)栈溢出:在栈中申请过大的局部变量
堆空间数据
内存泄露 (1)申请未释放(2)申请后。双重释放
对于全部的地址空间:
(1) 野指针的问题:未初始化指针。会訪问这个指针指向的空间
(2) 越界訪问:比如一个数据a[10] ,试图訪问啊a【10】以及以后数据
(3) 非法的越权訪问 比如:mmap的空间仅仅读,但试图写
(4) 空间不在控制范围仍然去訪问空间。比如返回局部变量地址,且后面訪问这个空间
尽管在编程时尽量避免这些问题,可是一旦出现故障。要善于使用工具去检測我们的内存错误
能够使用工具
$Sudo apt-get install valgrind
$ valgrind --tool=memcheck--show-reachable=yes --read-var-info=yes --verbose --time-stamp=yes --leak-check=full--log-file=mycode.log ./valgrind_example01
假设要使用图形化的工具,须要安装QT 这个工具名字叫 Valkyrie
第一、自己在编程中,要避免一些常见的错误。第二、要善于使用工具去检測我们的内存错误。
測试样例:
root@ubuntu:~/wangyiStudy# lsvalgrind_example01.croot@ubuntu:~/wangyiStudy#gcc -g -o valgrind_example01 valgrind_example01.croot@ubuntu:~/wangyiStudy# lsvalgrind_example01 valgrind_example01.croot@ubuntu:~/wangyiStudy#valgrind --tool=memcheck --show-reachable=yes --read-var-info=yes --verbose--time-stamp=yes --leak-check=full --log-file=mycode.log ./valgrind_example01root@ubuntu:~/wangyiStudy# lsmycode.log valgrind_example01 valgrind_example01.c
測试程序代码:valgrind_example01.c
root@ubuntu: # morevalgrind_example01.c#include<stdio.h>#include<stdlib.h>intmain(void){int i[5];if(i[0] == 0)i[1] = 1;char *ptr1;*ptr1 = 'c';char *ptr = malloc(100);free(ptr);free(ptr);return 0;}
查看生成的日志:
root@ubuntu:~/wangyiStudy# moremycode.log
==00:00:00:03.1165282== HEAP SUMMARY:
==00:00:00:03.1165282== in use at exit: 0 bytes in 0blocks
==00:00:00:03.1165282== totalheap usage: 1 allocs, 2 frees, 100 bytes allocated //一次申请。双重释放
==00:00:00:03.1165282==
==00:00:00:03.1165282== All heap blocks were freed -- no leaks are possible
==00:00:00:03.1165282==
==00:00:00:03.1165282== Use --track-origins=yes to see where uninitialised values come from
==00:00:00:03.1165282== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
==00:00:00:03.1165282==
==00:00:00:03.1165282== 1 errors in context 1 of 3:
==00:00:00:03.1165282== Invalid free() / delete / delete[] / realloc()
==00:00:00:03.1165282== at 0x4C2BDEC: free (in/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==00:00:00:03.1165282== by 0x4005BF: main(valgrind_example01.c:15)
==00:00:00:03.1165282== Address 0x51fd040 is 0 bytes insidea block of size 100 free'd
==00:00:00:03.1165282== at 0x4C2BDEC: free (in/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==00:00:00:03.1165282== by 0x4005B3: main(valgrind_example01.c:14)
==00:00:00:03.1165282==
==00:00:00:03.1165282==
==00:00:00:03.1165282== 1 errors in context 2 of 3:
==00:00:00:03.1165282== Use of uninitialised value of size 8
==00:00:00:03.1165282== at 0x400597: main(valgrind_example01.c:11)
==00:00:00:03.1165282==
==00:00:00:03.1165282==
==00:00:00:03.1165282== 1 errors in context 3 of 3:
==00:00:00:03.1165282== Conditional jump or move depends on
uninitialised value(s) //未初始化==00:00:00:03.1165282== at 0x40058A: main (valgrind_example01.c:8) // 错误定位
==00:00:00:03.1165282==
==00:00:00:03.1165282== ERROR SUMMARY: 3 errors from 3 contexts(suppressed: 0 from 0) // 总计 3 出错误
04-常见内存错误以及valgrind使用的更多相关文章
- [转]C++常见内存错误汇总
在系统开发过程中出现的bug相对而言是比较好解决的,花费在这个上面的调试代价不是很大,但是在系统集成后的bug往往是难以定位的bug(最好方式是打桩,通过打桩可以初步锁定出错的位置,如:进入函数前打印 ...
- 应用 AddressSanitizer 发现程序内存错误
作为 C/ C++ 工程师,在开发过程中会遇到各类问题,最常见便是内存使用问题,比如,越界,泄漏.过去常用的工具是 Valgrind,但使用 Valgrind 最大问题是它会极大地降低程序运行的速度, ...
- php常见细节错误
PHP编程中10个最常见的错误 PHP是一种非常流行的开源服务器端脚本语言,你在万维网看到的大多数网站都是使用php开发的.本篇经将为大家介绍PHP开发中10个最常见的问题,希望能够对朋友有所帮助. ...
- TCP/IP 某些最常见的错误原因码 (errno)列表
对于在基于 UNIX 的环境中的 TCP/IP 用户,下表列出了某些最常见的错误原因码 (errno).它不是完整的错误列表.可以在文件 /usr/include/sys/errno.h 中找到 Er ...
- spark分片个数的确定及Spark内存错误(GC error)的迂回解决方式
我们知道,spark中每个分片都代表着一部分数据,那么分片数量如何被确认的呢? 首先我们使用最常见的HDFS+Spark,sparkDeploy的方式来讨论,spark读取HDFS数据使用的是spar ...
- HTML5几种常见的错误写法
本文介绍了HTML5常见的6种错误写法,包括:1.不要使用section作为div的替代品 2.只在需要的时候使用header和hgroup 3.不要把所有列表式的链接放在nav里 4.figure元 ...
- java常见内存溢出(OOM)
jvm内存区域 程序计数器一块很小的内存空间,作用是当前线程所执行的字节码的行号指示器. java栈与程序计数器一样,java栈(虚拟机栈)也是线程私有的,其生命周期与线程相同.通常存放基本数据类型, ...
- ADB几种常见的错误及解决方法
下面列举出几种常见的错误及解决方法. Q1:无效的安装包,安装包已损坏[INSTALL_FAILED_INVALID_APK] A1:请检查安装包是否完整.如果是xpk包,可以通过 手动安装xpk来检 ...
- SQL SERVER 内存分配及常见内存问题(1)——简介
原文:SQL SERVER 内存分配及常见内存问题(1)--简介 一.问题: 1.SQL Server 所占用内存数量从启动以后就不断地增加: 首先,作为成熟的产品,内存溢出的机会微乎其微.对此要了解 ...
随机推荐
- selenium 下拉框处理
web应用中有很多时候我们会遇见<select></select>标签的下列列表框,一般是无法直接去操作下列列表中的选择的.selenium webdriver 提供了专门操作 ...
- selenium+python自动化79-文件下载(SendKeys)【转载】
前言 文件下载时候会弹出一个下载选项框,这个弹框是定位不到的,有些元素注定定位不到也没关系,就当没有鼠标,我们可以通过键盘的快捷键完成操作. SendKeys库是专业的处理键盘事件的,所以这里需要用S ...
- mysql的expain(zz)
两张表,T1和T2,都只有一个字段,id int.各插入1000条记录,运行如下语句: explain SELECT t1.id,t2.id FROM t1 INNER JOIN t2 ON t1.i ...
- webloader上传图片详细教程/使用thinkphp5.0(原创)
这个插件对后端程序员相当友好,无论是JAVA还是PHP,抑或python,基本只需要一句代码就能完成上传并且预览的效果,先上效果图,让你们眼馋一下 废话不说,直接撸代码,前端代码如下: <htm ...
- AC日记——Card Game codeforces 808f
F - Card Game 思路: 题意: 有n张卡片,每张卡片三个值,pi,ci,li: 要求选出几张卡片使得pi之和大于等于给定值: 同时,任意两两ci之和不得为素数: 求选出的li的最小值,如果 ...
- 图解Javascript——执行上下文
什么是执行上下文? 执行上下文(Execution Context)是ECMAScript规范中用来描述 JavaScript 代码执行的抽象概念,规定了当前代码执行的环境(当前执行代码片段中的变量. ...
- 浙江省第十二届省赛 Beauty of Array(思维题)
Description Edward has an array A with N integers. He defines the beauty of an array as the summatio ...
- Geodetic集合 c++
感谢某位不知名dalao的博客,我才知道怎么解题.... 最开始连题意都读错了....这个故事告诉我们要好好读题 描述 Description 图G是一个无向连通图,没有自环,并且两点之间至多只有一条 ...
- Lambda演算(二)归约!归约!归约!
(一) 这里先不列出λ项的正式定义,只记住λ表达式语义上的构造方式为: x 一个单独的变量名是一个λ项表达式: (λx.M) 该λ表示一个函数.其中 M 是这个函数的函数体,M 本身也是一个 λ项. ...
- 读《thinking in java》第一遍笔记
1.System.out.println(variable)为什么会调用重写的toString方法? 根据我搜到的信息结合源代码,得到以下结论,如有误请告知. 首先我们看一下println方法的源代码 ...