valgrind 的使用及错误信息分析
这里记录一下使用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.
- 文件后部,总体来看,有确定无疑的lost 20字节。如下:
二、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)
- 文件后部,总体来看,有1个错误,0个malloc,1个free。如下:
三、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栈中的内容,不会提示错误
- 其为局部变量,存贮在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堆中。
- 读取heap堆中的内容,会提示错误,提示无效的1个字节的读取,位置是malloc的8字节的后面第2字节
五、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 - 这个提示的错误信息和代码中的信息,没很好的匹配上,但可以知道是已经出错了。
- 运行时会出错,会打印Backtrace
六、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 的使用及错误信息分析的更多相关文章
- SxsTrace程序追踪 && 错误信息分析
先贴错误:应用程序无法运行,并行配置不正确 ,使用命令行sxstrace.exe.百度解决版本. 起因:同事给我一 EXE,然后基于 其进行开发 dll和模块,但是无法加入进程,无法运行. SxsTr ...
- linux驱动调试--段错误之oops信息分析
linux驱动调试--段错误之oops信息分析 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id= ...
- Valgrind memcheck 8种错误实例
调不尽的内存泄漏,用不完的Valgrind Valgrind 安装 1. 到www.valgrind.org下载最新版valgrind-3.2.3.tar.bz2 2. 解压安装包:tar –jxvf ...
- EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)
前言 Entity Framework 延伸系列目录 今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不 ...
- jQuery之ajax错误调试分析
jQuery中把ajax封装得非常好.但是日常开发中,我偶尔还是会遇到ajax报错.这里简单分析一下ajax报错 一般的jQuery用法如下,ajax通过post方式提交"汤姆和老鼠&quo ...
- DB2中错误信息说明
DB2错误信息SQLCODE SQLSTATE (按sqlcode排序) .分类: db2数据库 2012-10-19 11:35 2942人阅读 评论(0) 收藏 举报 db2sql存储table数 ...
- JavaScript基础--小案例:在网页指定位置弹出错误信息(十二)
案例分析:点击按钮后,在网页上指定区域,提示错误信息!5秒后,错误信息提示自动消失! <script languag="javascript" type="text ...
- 项目中logger、message错误信息的配置
申明:在一个项目中必不可少的是Logger和错误信息的配置,现在给出在我们常用的处理方法. —.创建一个ConfigUtils类和他对应的rah.properties文件和Test测试类 Config ...
- SQL Server 磁盘请求超时的833错误原因分析以及解决
本文出处:http://www.cnblogs.com/wy123/p/6984885.html 最近遇到一个SQL Server服务器响应极度缓慢,并且出现客户端请求报错的情况,在数据库中的erro ...
随机推荐
- 你好,C++(39)6.4.4 依葫芦画瓢:用C++表达设计结果(下)
6.4.4 依葫芦画瓢:用C++表达设计结果 完成上面的分析与设计之后,小陈感觉已经成竹在胸胜利在望了.他知道,只要完成了程序中的类以及类之间关系的分析和设计,整个程序就相当于已经完成了一大半.接下 ...
- python3 解析apk图标
有两处值小点,一是如何解压缩,另一个是如何写文件,第二点上我找的是phthon2的代码,一直写文件的时候报不是字符串的问题,将打开方式加上"b“的模式搞定 print文件出来直接删除了,原因 ...
- select 1 from table where的作用?
"SELECT 1 FROM identity_approve WHERE identity_num=' " . trim($_POST['IDnumber']) . " ...
- span宽度高度设置
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- highcharts实例教程一:结合php与mysql生成折线图
Highcharts是一款纯javascript和html5编写的图表库,不仅几乎能兼容所有pc浏览器,而且对ios和android手机端的兼容 性也不错,它能够很简单便捷的在Web网站或Web应用中 ...
- 扩展《C程序设计语言》练习2-3程序通用性
最近开始自学C语言,在看K&R的<C程序设计语言>.练习2-3要求写一个函数,将输入的十六进制数字字符串转换成与之等价的整数值,配套答案没有扩展程序的通用性,所以我就稍微改造改造. ...
- C++中的dll
创建动态链接库 (DLL) 项目 在菜单栏上,依次选择“文件”.“新建”.“项目”. 在“新建项目”对话框的左窗格中,依次展开“已安装”.“模板”.“Visual C++”,然后选择“Win32”. ...
- socket本地模拟TCP 服务器+客户端(二)
建立两个py文件,分别打开两个cmd界面,即可进行通信.服务器端运用多进程,连续不断的处理从客户端接收到的数据:客户端通过一个list不断给客户端发送数据. (每个连接都必须创建新线程(或进程)来处理 ...
- 使用UIImagePickerController时3DTouch引起的Crash问题的解决--备用
一.crash的场景 程序中用到UIImagePickerController时,如果在IPhone6S上运行APP,当forceTouch 一个图片时程序会crash,并附带如下crash mess ...
- 构建高可用web站点学习(三)
分布式的构建 做为网站访问的生命线(数据访问),当然也可以采用分布式的方法来减轻单台服务器的访问压力.之前有讲过Memcached的分布式,但是Memcached服务器互不通信,所以我们也提过redi ...