转: 使用valgrind检查内存问题
博客:blog.focus-linux.net linuxfocus.blog.chinaunix.net
欲善其事,必先利其器。Valgrind作为一个免费且优秀的工具包,平时大部分人可能都是使用valgrind检测内存问题,如内存泄露,越界等。其实
Valgrind的用途远不止于此,其实际上为一个工具包,除了检查内存问题以外,还有其它多项用途。我准备将其大致介绍一下。本不想再介绍
Valgrind检测内存问题的用法的,但是又一想,毕竟这是Valgrind的一个最有名的用途,如果少了它,不免有些遗憾,所以还是把检查内存问题作
为第一篇吧。
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- static void mem_leak1(void)
- {
- char *p = malloc(1);
- }
- static void mem_leak2(void)
- {
- FILE *fp = fopen("test.txt", "w");
- }
- static void mem_overrun1(void)
- {
- char *p = malloc(1);
- *(short*)p = 2;
- free(p);
- }
- static void mem_overrun2(void)
- {
- char array[5];
- strcpy(array, "hello");
- }
- static void mem_double_free(void)
- {
- char *p = malloc(1);
- free(p);
- free(p);
- }
- static void mem_use_wild_pointer(void)
- {
- char *p = (void*)0x80184800;
- *p = 1;
- }
- static void mem_free_wild_pointer(void)
- {
- char *p;
- free(p);
- }
- int main()
- {
- mem_leak1();
- mem_leak2();
- mem_overrun1();
- mem_overrun2();
- mem_double_free();
- //mem_use_wild_pointer();
- mem_free_wild_pointer();
- return 0;
- }
里一共列出了七种常见的内存问题:1. 动态内存泄露;2. 资源泄露,这里以文件描述符为例;3.
动态内存越界;4.数组内存越界;5.动态内存double
free;6.使用野指针,即未初始化的指针;7.释放野指针,即未初始化的指针;其中由于本示例代码过于简单,第6中情况,使用野指针会直接导致
crash,所以在main中,并没有真正的调用那个示例代码。由于valgrind只能检测执行到的代码,所以在后面的报告中,不会报告第6种错误情
况。但是,在大型的项目中,有可能使用野指针并不会导致程序crash。另外上面的7中情况,有些情况严格的说,实际上可以归为一类。
- valgrind --track-fds=yes --leak-check=full --undef-value-errors=yes ./a.out
- ==2326== Memcheck, a memory error detector
- ==2326== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
- ==2326== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
- ==2326== Command: ./a.out
- ==2326==
- /* 这里检测到了动态内存的越界,提示Invalid write。*/
- ==2326== Invalid write of size 2
- ==2326== at 0x80484B4: mem_overrun1 (in /home/fgao/works/test/a.out)
- ==2326== by 0x8048553: main (in /home/fgao/works/test/a.out)
- ==2326== Address 0x40211f0 is 0 bytes inside a block of size 1 alloc'd
- ==2326== at 0x4005BDC: malloc (vg_replace_malloc.c:195)
- ==2326== by 0x80484AD: mem_overrun1 (in /home/fgao/works/test/a.out)
- ==2326== by 0x8048553: main (in /home/fgao/works/test/a.out)
- ==2326==
- ==2326== Invalid free() / delete / delete[]
- ==2326== at 0x40057F6: free (vg_replace_malloc.c:325)
- ==2326== by 0x8048514: mem_double_free (in /home/fgao/works/test/a.out)
- ==2326== by 0x804855D: main (in /home/fgao/works/test/a.out)
- ==2326== Address 0x4021228 is 0 bytes inside a block of size 1 free'd
- ==2326== at 0x40057F6: free (vg_replace_malloc.c:325)
- ==2326== by 0x8048509: mem_double_free (in /home/fgao/works/test/a.out)
- ==2326== by 0x804855D: main (in /home/fgao/works/test/a.out)
- ==2326==
- /* 这里检测到了未初始化变量 */
- ==2326== Conditional jump or move depends on uninitialised value(s)
- ==2326== at 0x40057B6: free (vg_replace_malloc.c:325)
- ==2326== by 0x804853C: mem_free_wild_pointer (in /home/fgao/works/test/a.out)
- ==2326== by 0x8048562: main (in /home/fgao/works/test/a.out)
- ==2326==
- ==2326== Invalid free() / delete / delete[]
- ==2326== at 0x40057F6: free (vg_replace_malloc.c:325)
- ==2326== by 0x804853C: mem_free_wild_pointer (in /home/fgao/works/test/a.out)
- ==2326== by 0x8048562: main (in /home/fgao/works/test/a.out)
- ==2326== Address 0x4021228 is 0 bytes inside a block of size 1 free'd
- ==2326== at 0x40057F6: free (vg_replace_malloc.c:325)
- ==2326== by 0x8048509: mem_double_free (in /home/fgao/works/test/a.out)
- ==2326== by 0x804855D: main (in /home/fgao/works/test/a.out)
- ==2326==
- ==2326==
- /*
- 这里检测到了文件指针资源的泄露,下面提示说有4个文件描述符在退出时仍是打开的。
- 描述符0,1,2无需关心,通过报告,可以发现程序中自己明确打开的文件描述符没有关闭。
- */
- ==2326== FILE DESCRIPTORS: 4 open at exit.
- ==2326== Open file descriptor 3: test.txt
- ==2326== at 0x68D613: __open_nocancel (in /lib/libc-2.12.so)
- ==2326== by 0x61F8EC: __fopen_internal (in /lib/libc-2.12.so)
- ==2326== by 0x61F94B: fopen@@GLIBC_2.1 (in /lib/libc-2.12.so)
- ==2326== by 0x8048496: mem_leak2 (in /home/fgao/works/test/a.out)
- ==2326== by 0x804854E: main (in /home/fgao/works/test/a.out)
- ==2326==
- ==2326== Open file descriptor 2: /dev/pts/4
- ==2326== <inherited from parent>
- ==2326==
- ==2326== Open file descriptor 1: /dev/pts/4
- ==2326== <inherited from parent>
- ==2326==
- ==2326== Open file descriptor 0: /dev/pts/4
- ==2326== <inherited from parent>
- ==2326==
- ==2326==
- /* 堆信息的总结:一共调用4次alloc,4次free。之所以正好相等,因为上面有一函数少了free,有一个函数多了一个free */
- ==2326== HEAP SUMMARY:
- ==2326== in use at exit: 353 bytes in 2 blocks
- ==2326== total heap usage: 4 allocs, 4 frees, 355 bytes allocated
- ==2326==
- /* 检测到一个字节的内存泄露 */
- ==2326== 1 bytes in 1 blocks are definitely lost in loss record 1 of 2
- ==2326== at 0x4005BDC: malloc (vg_replace_malloc.c:195)
- ==2326== by 0x8048475: mem_leak1 (in /home/fgao/works/test/a.out)
- ==2326== by 0x8048549: main (in /home/fgao/works/test/a.out)
- ==2326==
- /* 内存泄露的总结 */
- ==2326== LEAK SUMMARY:
- ==2326== definitely lost: 1 bytes in 1 blocks
- ==2326== indirectly lost: 0 bytes in 0 blocks
- ==2326== possibly lost: 0 bytes in 0 blocks
- ==2326== still reachable: 352 bytes in 1 blocks
- ==2326== suppressed: 0 bytes in 0 blocks
- ==2326== Reachable blocks (those to which a pointer was found) are not shown.
- ==2326== To see them, rerun with: --leak-check=full --show-reachable=yes
- ==2326==
- ==2326== For counts of detected and suppressed errors, rerun with: -v
- ==2326== Use --track-origins=yes to see where uninitialised values come from
- ==2326== ERROR SUMMARY: 5 errors from 5 contexts (suppressed: 12 from 8)
个只是一个简单的示例程序,即使没有Valgrind,我们也可以很轻易的发现问题。但是在真实的项目中,当代码量达到万行,十万行,甚至百万行时。由于
申请的内存可能不是在一个地方使用,不可避免的被传来传去。这时,如果光是看review代码来检查问题,可能很难找到根本原因。这时,使用
Valgrind则可以很容易的发现问题所在。
valgrind :
valgrind --tool=memcheck --leak-check=full <app> //检查内存泄漏、越界等错误
sample:
valgrind --tool=memcheck --leak-check=full ./bin/hostSample
转: 使用valgrind检查内存问题的更多相关文章
- 使用valgrind检查内存
Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,是公认的最接近Purify的产品,它包含一个内核——一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务——调试 ...
- 用valgrind检查内存问题
Valgrind Valgrind作为一个免费且优秀的工具包,平时大部分人可能都是使用valgrind检测内存问题,如内存泄露,越界等. Valgrind工具包包含多个工具,如Memcheck,Cac ...
- valgrind 检查内存泄露
https://www.oschina.net/translate/valgrind-memcheck
- Linux 下用 valgrind 查找内存泄漏小例子
1.安装 valgrind yum install valgrind 2.测试用例 main.cpp #include <iostream> using namespace std; st ...
- valgrind massif内存分析[转]
valgrind检查内存泄露 #valgrind ./程序 内存泄漏问题,我们有memcheck工具来检查.很爽.但是有时候memcheck工具查了没泄漏,程序一跑,内存还是狂飙.这又是什么问题. ...
- Valgrind检测内存泄露简介
原文地址: Valgrind 概述 体系结构 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核 ...
- Valgrind查找内存泄露利器
Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析.你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的ma ...
- valgrind调查内存leak
快有几个月没更新了,记录一下最近解决问题用到的工具吧. 最近代码跑压力测试,总是发现内存在无规律的慢慢增加,因此在Android上用上了大名顶顶的valgrind,说实话,真是名不虚传, 真是建议以后 ...
- 用mtrace检查内存泄漏
http://blog.csdn.net/ixidof/article/details/6638066内存泄漏检查方法(for Linux) 如果你更想读原始文档, 请参考glibc info的&qu ...
随机推荐
- 洛谷 P1454 圣诞夜的极光 == codevs 1293 送给圣诞夜的极光
题目背景 圣诞夜系列~~ 题目描述 圣诞老人回到了北极圣诞区,已经快到12点了.也就是说极光表演要开始了.这里的极光不是极地特有的自然极光景象.而是圣诞老人主持的人造极光. 轰隆隆……烟花响起(来自中 ...
- 51nod 1432 独木舟
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 n个人,已知每个人体重.独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人.显然要求总重量不超过独木舟承 ...
- Jenkins执行sudo权限的设置
Jenkins系统中添加执行脚本的时候,有一些命令是需要sudo权限和来执行的,可以在root权限下添加一下Jenkins账号的权限 1.添加不需要密码可sudo执行指定命令的权限 cd /etc c ...
- 暑假集训 || 区间DP
区间DP 经典石子合并问题V1 复杂度 On3 int a[SZ], sum[SZ], f[SZ][SZ]; int main() { int n; scanf("%d", ...
- ssh 带密码私钥 输入密码
$ssh-agent bash $ssh-add -k ~/.ssh/id_rsa Enter passphrase for /home/ubuntu/.ssh/id_rsa: Identity ad ...
- Java会话(session)管理
会话概述 什么是会话 简单的理解:用户打开浏览器,点击多个超链接,访问Web服务器上多个资源,然后关闭浏览器,整个过程称之为一次会话. 需要解决的问题 每个用户在使用浏览器与服务器会话的过程中,会产生 ...
- luogu P1407 稳定婚姻-tarjan
题目背景 原<工资>重题请做2397 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有 ...
- AT2663 Namori Grundy
题目描述: luogu 题解: 好多细节,比如说每个点有且仅有一条入边. 所以说这个图一定是一个基环外向树. 考虑只是一个环的情况,我们可以发现,当环长为偶数时我们可以$01$交替染色,但环长为奇数时 ...
- UVA12633 Super Rooks on Chessboard
题目描述 题解: 第一眼满眼骚操作,然后全部否掉. 然后屈服于题解,才发现这题这么执掌. 首先,如果这个东西是普通的车,那我们可以记录一下$x,y$的覆盖情况,然后减一下; 但是这个可以斜着走. 所以 ...
- Windows 命令收集
定时关机命令:schtasks /create /tn "关机" /tr "shutdown /s" /sc once /st 23:55