这里记录一下使用valgrind查找你的应用程序中的各种潜在的错误信息,并举例说明。

经常使用valgrind查找一下你的代码的内存有关错误,对移植到嵌入系统后的系统稳定性来说有着重要的意义。

usage

  • x86 平台
  • 先编译你自己的应用程序
  • 命令行:
    • valgrind --log-file=1 --tool=memcheck ./a.out

error specification

一、有malloc,但未free

  • code

    #include <stdio.h>
    #include <stdlib.h> void main()
    {
    char *p = malloc(20);
    sprintf(p, "%s", "test");
    fprintf(stderr, "p:%s/n", p);
    }
  • 分析:
    • 文件后部,总体来看,有确定无疑的lost 20字节。如下:

      ==26512== LEAK SUMMARY:
      ==26512== definitely lost: 20 bytes in 1 blocks.
    • 在文件之前描述的内容,细节可以看出,有1个malloc,但未去free。如下:
      ==26512== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 1)
      ==26512== malloc/free: in use at exit: 20 bytes in 1 blocks.
      ==26512== malloc/free: 1 allocs, 0 frees, 20 bytes allocated.

二、free一个未malloc的指针

  • code

    void main()
    {
    char p[] = "hello";
    fprintf(stderr, "p:%s/n", p);
    free(p);
    }
  • 分析:
    • 文件后部,总体来看,有1个错误,0个malloc,1个free。如下:

      ==26786== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1)
      ==26786== malloc/free: in use at exit: 0 bytes in 0 blocks.
      ==26786== malloc/free: 0 allocs, 1 frees, 0 bytes allocated.
    • 在文件之前描述的内容,细节可以看出,有一个无效的free。如下:
      ==26786== Invalid free() / delete / delete[]
      ==26786== at 0x402265C: free (vg_replace_malloc.c:323)
      ==26786== by 0x804841F: main (in /home/yutao/test/a.out)

三、stack中,无效的读取,不会提示出错

  • code

    void main()
    {
    char p[8] = "hello"; //p在栈上, "hello"在常量区
    fprintf(stderr, "p10:%c/n", p[10]);
    }
  • 分析:
    • 读取stack栈中的内容,不会提示错误

      ==27452== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 1)
      ==27452== malloc/free: in use at exit: 0 bytes in 0 blocks.
      ==27452== malloc/free: 0 allocs, 0 frees, 0 bytes allocated.
  • 其为局部变量,存贮在stack中,由于p[10]未超出栈的长度,所以没提示出错?

四、heap堆中,无效的读取,会提示出错

  • code

    void main()
    {
    char *p = malloc(8);
    fprintf(stderr, "p10:%c/n", p[10]);
    free(p);
    }
  • 分析:
    • 读取heap堆中的内容,会提示错误,提示无效的1个字节的读取,位置是malloc的8字节的后面第2字节

      ==27744== Invalid read of size 1
      ==27744== at 0x804842A: main (in /home/yutao/test/a.out)
      ==27744== Address 0x4190032 is 2 bytes after a block of size 8 alloc'd
      ==27744== at 0x4022AB8: malloc (vg_replace_malloc.c:207)
      ==27744== by 0x8048420: main (in /home/yutao/test/a.out)
      ==27744==
      ==27744== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1)
      ==27744== malloc/free: in use at exit: 0 bytes in 0 blocks.
      ==27744== malloc/free: 1 allocs, 1 frees, 8 bytes allocated.
    • malloc的数据在heap堆中。

五、stack上的,无效的写

  • code

    void main()
    {
    char p[8] = "hello";
    p[10]='a';
    }
  • 分析:
    • 运行时会出错,会打印Backtrace

      *** stack smashing detected ***: ./a.out terminated
      ======= Backtrace: =========
      /lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)[0x412d138]
      /lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x0)[0x412d0f0]
      ./a.out[0x80483d6]
      /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0x4056450]
      ./a.out[0x8048331]
      ======= Memory map: ========
      04000000-0401a000 r-xp 00000000 08:06 682589 /lib/ld-2.7.so
    • 总体,会提示有1个错误,内容是5个malloc,0个free
      ==27918== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 13 from 1)
      ==27918== malloc/free: in use at exit: 892 bytes in 5 blocks.
      ==27918== malloc/free: 5 allocs, 0 frees, 892 bytes allocated.
      ==27918== LEAK SUMMARY:
      ==27918== definitely lost: 0 bytes in 0 blocks.
      ==27918== possibly lost: 0 bytes in 0 blocks.
      ==27918== still reachable: 892 bytes in 5 blocks.
    • 文件前面的错误信息是,有一个无效read,读了4个字节。
      ==27918== Invalid read of size 4
      ==27918== at 0x40151F3: (within /lib/ld-2.7.so)
      ==27918== by 0x4005C69: (within /lib/ld-2.7.so)
      ==27918== by 0x4007A97: (within /lib/ld-2.7.so)
      ==27918== by 0x4011543: (within /lib/ld-2.7.so)
      ==27918== by 0x400D5D5: (within /lib/ld-2.7.so)
      ==27918== by 0x4010F5D: (within /lib/ld-2.7.so)
      ==27918== by 0x414E291: (within /lib/tls/i686/cmov/libc-2.7.so)
      ==27918== by 0x400D5D5: (within /lib/ld-2.7.so)
      ==27918== by 0x414E454: __libc_dlopen_mode (in /lib/tls/i686/cmov/libc-2.7.so)
      ==27918== by 0x412A4D8: (within /lib/tls/i686/cmov/libc-2.7.so)
      ==27918== by 0x412A4D8: (within /lib/tls/i686/cmov/libc-2.7.so)
      ==27918== by 0x412A669: backtrace (in /lib/tls/i686/cmov/libc-2.7.so)
      ==27918== by 0x40A3B91: (within /lib/tls/i686/cmov/libc-2.7.so)
      ==27918== Address 0x4190038 is 16 bytes inside a block of size 19 alloc'd
    • 这个提示的错误信息和代码中的信息,没很好的匹配上,但可以知道是已经出错了。

六、heap堆上,无效的写

  • code

    void main()
    {
    char *p = malloc(8);
    p[10]='a';
    free(p);
    }
  • 分析:
    • 程序运行不会出错
    • 写heap堆中的内容,log会提示错误,提示无效的1个字节的写,位置是malloc的8字节的后面第2字节
      ==28351== Invalid write of size 1
      ==28351== at 0x80483CA: main (in /home/yutao/test/a.out)
      ==28351== Address 0x4190032 is 2 bytes after a block of size 8 alloc'd
      ==28351== at 0x4022AB8: malloc (vg_replace_malloc.c:207)
      ==28351== by 0x80483C0: main (in /home/yutao/test/a.out)

valgrind 的使用及错误信息分析的更多相关文章

  1. SxsTrace程序追踪 && 错误信息分析

    先贴错误:应用程序无法运行,并行配置不正确 ,使用命令行sxstrace.exe.百度解决版本. 起因:同事给我一 EXE,然后基于 其进行开发 dll和模块,但是无法加入进程,无法运行. SxsTr ...

  2. linux驱动调试--段错误之oops信息分析

    linux驱动调试--段错误之oops信息分析 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id= ...

  3. Valgrind memcheck 8种错误实例

    调不尽的内存泄漏,用不完的Valgrind Valgrind 安装 1. 到www.valgrind.org下载最新版valgrind-3.2.3.tar.bz2 2. 解压安装包:tar –jxvf ...

  4. EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)

    前言 Entity Framework 延伸系列目录 今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不 ...

  5. jQuery之ajax错误调试分析

    jQuery中把ajax封装得非常好.但是日常开发中,我偶尔还是会遇到ajax报错.这里简单分析一下ajax报错 一般的jQuery用法如下,ajax通过post方式提交"汤姆和老鼠&quo ...

  6. DB2中错误信息说明

    DB2错误信息SQLCODE SQLSTATE (按sqlcode排序) .分类: db2数据库 2012-10-19 11:35 2942人阅读 评论(0) 收藏 举报 db2sql存储table数 ...

  7. JavaScript基础--小案例:在网页指定位置弹出错误信息(十二)

    案例分析:点击按钮后,在网页上指定区域,提示错误信息!5秒后,错误信息提示自动消失! <script languag="javascript" type="text ...

  8. 项目中logger、message错误信息的配置

    申明:在一个项目中必不可少的是Logger和错误信息的配置,现在给出在我们常用的处理方法. —.创建一个ConfigUtils类和他对应的rah.properties文件和Test测试类 Config ...

  9. SQL Server 磁盘请求超时的833错误原因分析以及解决

    本文出处:http://www.cnblogs.com/wy123/p/6984885.html 最近遇到一个SQL Server服务器响应极度缓慢,并且出现客户端请求报错的情况,在数据库中的erro ...

随机推荐

  1. hibernate_validator_05

    校验约束 一,认识Validator---Validation中最主要的接口 1.怎么获取一个Validator--Validation.buildDefaultValidatorFactory() ...

  2. 3DMAX-模型制作简介

    本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/3dmax_moxingzhizuo.html  一.快捷键: ALT + X 透明 ...

  3. C++普通函数与模板函数以及特化函数重载的优先级问题

    在面对C++模板的时候,需要十分注意,因为模板的复杂性有很多情况,所以最好学习模板的方法我个人认为就是用到就去学,用不到就尽量别去看各种奇门怪技,因为你就算看了,好不容易搞懂模板的实现内部了,包括元编 ...

  4. Extjs中grid表格中去掉红三角

    在编辑Extjs的gridpanel的时候,数据有错误或是修改在每个单元格上都会出现红色的小三角,在每个列上面可以配置allowBlank: false来标识这个不可以为空 有的时候在保存数据时如果不 ...

  5. IOS自定义alertview

    在家闲来无事,于是就看起来ios绘图的那块,写点什么好呢? 鼓捣了一会,总算写出了一个小东西 这个是写完以后的效果 这里我实现了三种款式的alertview 分别是成功,错误和警告,剩下的呢有空继续添 ...

  6. FPGA同步复位异步复位

    今天看了篇博客, 是拿altera的芯片和软件作例子的,讲同步异步复位的: http://blog.sina.com.cn/s/blog_bff0927b0101aaii.html 还有一个博客, h ...

  7. Chapter 2. OpenSSL的安装和配置学习笔记

    Chapter 2. OpenSSL的安装和配置学习笔记 2.1 在linux上面安装OpenSSL我还是做点No paper事情比较在行,正好和老师的课程接轨一下.以前尝试过在Windows上面安装 ...

  8. SPSS方差分析

    1.overall:一切的,全面地 单因素方差分析:分析--比较均值--单因素ANOVA.多因素方差分析:分析--一般线性模型--单变量. 单因素方差分析和单变量方差分析区别:单因素针对的是自变量(自 ...

  9. poi导出word

    最近做了个poi导出word的功能 下面是代码: 一个可以参考的例子: package com.lzb.crm.web; import java.io.FileOutputStream; import ...

  10. java实现DES加密与解密,md5加密

    很多时候要对秘要进行持久化加密,此时的加密采用md5.采用对称加密的时候就采用DES方法了 import java.io.IOException; import java.security.Messa ...