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# ls
valgrind_example01.c
root@ubuntu:~/wangyiStudy#gcc -g -o valgrind_example01 valgrind_example01.c 
root@ubuntu:~/wangyiStudy# ls
valgrind_example01  valgrind_example01.c
root@ubuntu:~/wangyiStudy#valgrind --tool=memcheck --show-reachable=yes --read-var-info=yes --verbose--time-stamp=yes --leak-check=full --log-file=mycode.log ./valgrind_example01
root@ubuntu:~/wangyiStudy# ls
mycode.log  valgrind_example01  valgrind_example01.c

測试程序代码:valgrind_example01.c
root@ubuntu: # morevalgrind_example01.c
#include<stdio.h>
#include<stdlib.h>
int
main(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使用的更多相关文章

  1. [转]C++常见内存错误汇总

    在系统开发过程中出现的bug相对而言是比较好解决的,花费在这个上面的调试代价不是很大,但是在系统集成后的bug往往是难以定位的bug(最好方式是打桩,通过打桩可以初步锁定出错的位置,如:进入函数前打印 ...

  2. 应用 AddressSanitizer 发现程序内存错误

    作为 C/ C++ 工程师,在开发过程中会遇到各类问题,最常见便是内存使用问题,比如,越界,泄漏.过去常用的工具是 Valgrind,但使用 Valgrind 最大问题是它会极大地降低程序运行的速度, ...

  3. php常见细节错误

    PHP编程中10个最常见的错误 PHP是一种非常流行的开源服务器端脚本语言,你在万维网看到的大多数网站都是使用php开发的.本篇经将为大家介绍PHP开发中10个最常见的问题,希望能够对朋友有所帮助. ...

  4. TCP/IP 某些最常见的错误原因码 (errno)列表

    对于在基于 UNIX 的环境中的 TCP/IP 用户,下表列出了某些最常见的错误原因码 (errno).它不是完整的错误列表.可以在文件 /usr/include/sys/errno.h 中找到 Er ...

  5. spark分片个数的确定及Spark内存错误(GC error)的迂回解决方式

    我们知道,spark中每个分片都代表着一部分数据,那么分片数量如何被确认的呢? 首先我们使用最常见的HDFS+Spark,sparkDeploy的方式来讨论,spark读取HDFS数据使用的是spar ...

  6. HTML5几种常见的错误写法

    本文介绍了HTML5常见的6种错误写法,包括:1.不要使用section作为div的替代品 2.只在需要的时候使用header和hgroup 3.不要把所有列表式的链接放在nav里 4.figure元 ...

  7. java常见内存溢出(OOM)

    jvm内存区域 程序计数器一块很小的内存空间,作用是当前线程所执行的字节码的行号指示器. java栈与程序计数器一样,java栈(虚拟机栈)也是线程私有的,其生命周期与线程相同.通常存放基本数据类型, ...

  8. ADB几种常见的错误及解决方法

    下面列举出几种常见的错误及解决方法. Q1:无效的安装包,安装包已损坏[INSTALL_FAILED_INVALID_APK] A1:请检查安装包是否完整.如果是xpk包,可以通过 手动安装xpk来检 ...

  9. SQL SERVER 内存分配及常见内存问题(1)——简介

    原文:SQL SERVER 内存分配及常见内存问题(1)--简介 一.问题: 1.SQL Server 所占用内存数量从启动以后就不断地增加: 首先,作为成熟的产品,内存溢出的机会微乎其微.对此要了解 ...

随机推荐

  1. django日志的设置

    关于django的日志设置详细可以看下官方文档:https://yiyibooks.cn/xx/Django_1.11.6/topics/logging.html 示例: # 日志文件配置 LOGGI ...

  2. python中的迭代器详解

    #原创,转载请先联系 理论性的东西有点枯燥,耐心点看- 1.迭代是什么? 我们知道可以对list,tuple,dict,str等数据类型使用for...in的循环语法,从其中依次取出数据,这个过程叫做 ...

  3. KVM(六)Nova 通过 libvirt 管理 QEMU/KVM 虚机

    1. Libvirt 在 OpenStack 架构中的位置 在 Nova Compute 节点上运行的 nova-compute 服务调用 Hypervisor API 去管理运行在该 Hypervi ...

  4. 《锋利的JQuery》读书要点笔记3——事件和动画

    第四章 jQuery中的事件和动画 JS和HTML的交互是通过用户和浏览器操作页面时引发的事件来处理的,事件由浏览器自动生成. 4.1 jQuery中的事件 1. 加载DOM 这里主要是搞明白wind ...

  5. 【LeedCode】3Sum

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  6. ionic3 打包发布,以安卓说明

    1 添加图标 ionic cordova resources [<platform>] 官方https://ionicframework.com/docs/cli/cordova/reso ...

  7. [BZOJ1176][Balkan2007]Mokia cdq+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 3134  Solved: 1395[Submit][S ...

  8. 统计mysql库中每张表的行数据

    修改数据库配置文件:vim /etc/my.cnf [client] user=username password=password 使用shell脚本统计表中的行数据:count.sh #!/bin ...

  9. spark技术热点问题互动问答2

    决胜云计算大数据时代” Spark亚太研究院100期公益大讲堂 [第3期互动问答分享] Q1: groupbykey是排好序的吗?分组排序怎么实现? groupByKey在一个由(K,V)对组成的数据 ...

  10. 《javascript高级程序设计》读书小延伸

    这本书已经读了几章了,想着试试能不能做出点东西,就简单的练了把手.觉得对于初学者,自己试着练练,效果还不错的. 挥刀要从轻的开始,起初的原因是和同事谈起曾经的逝水年华(小时候干的坏事)时说起了曾经的一 ...