使用valgrind检查内存问题
博客:blog.focus-linux.net linuxfocus.blog.chinaunix.net
- #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;
- }
- 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检查内存问题相关推荐
- valgrind 检查内存泄露
https://www.oschina.net/translate/valgrind-memcheck 转载于:https://www.cnblogs.com/xingmuxin/p/9584459. ...
- 【开发工具】【Valgrind】内存问题检测工具(valgrind)的使用
关键字: [valgrind].[内存泄露].[内存越界].[非法指针].[].[]. 获取更多相关的嵌入式开发工具,可收藏系列博文,持续更新中: [开发工具]嵌入式常用开发工具汇总帖 安装Valgr ...
- 在Ubuntu 14.04 64bit上安装Valgrind并检查内存泄露
valgrind官网:http://valgrind.org/ 1.安装方法 第一种方式:下载目前最新的源码,编译安装,在服务器上推荐这种方式 wget http://valgrind.org/dow ...
- linux valgrind memCheck ---内存检查工具的可视化方法valkyrie
linux valgrind memCheck -内存检查工具的可视化方法valkyrie linux valgrind Memcheck–内存检查工具 1.安装valgrind valgrind 安 ...
- 检查内存泄露的工具--valgrind
今天面试的时候问了一下怎么检查内存泄露,然后我就有点懵,现在开发基本都用智能指针了,以前用的时候也很少碰见内存泄露的问题,基本都是瞎调试.只依稀记得有这么一个工具可以用来检测内存泄露,实际没用过,只好 ...
- 简单说说Linux中valgrind进行内存检测
目录 1. 内存泄漏的产生 2. Valgrind使用的目的 3. 安装 Valgrind 的命令 4. 如何使用Valgrind 5.valgrind 基本选项 6.valgrind错误相关选项. ...
- 使用valgrind检查cache命中率
2019独角兽企业重金招聘Python工程师标准>>> Valgrind为一个debugging 和 profiling的工具包,检查内存问题只是其最知名的一个用途.今天介绍一下,v ...
- valgrind检测内存泄漏,gperftools,memwatch和性能优化Messy_Test
yum -y install valgrind 如何在windows使用valgrind_如何在windows下使用f2py_weixin_39621870的博客-CSDN博客 QNX下Valgri ...
- armv6 可以通过什么方式检查内存泄露?
armv6 可以通过什么方式检查内存泄露? 在 ARMv6 架构上进行内存泄漏检测,可以尝试使用以下工具: LeakSanitizer:LeakSanitizer 是 Clang/LLVM 工具链的一 ...
最新文章
- 昨天你用的 YYYY-MM-dd 被捶了吗?
- Java常见面试题(持续更新)
- IPv6与IPv4的区别
- 【Vue2.0】— 消息订阅与发布pubsub(二十)
- .git文件过大,怎么删除
- markDown零碎整理
- java二分查找分治法
- 7-Zip下载|7-Zip下载
- html视频怎么转换成图片,视频怎么转成gif格式 录制视频转gif图片用什么软件|gif动画录制工具...
- openg 通用扫描画线算法
- Android实现省市区三级联动效果
- 【FLY】Android(12)源码目录结构
- Tableau可视化技巧-让你的图表跟随时间动起来
- 写个脚本批量注册网站账号
- 齐岳研发可聚合性基团的小分子稀土配合物Eu(TTA)2phen
- IAR更改更改字体的办法,完美解决!
- C语言项目 电话查询系统 哈希表实现(项目要求 + 运行界面 + 代码分析 + 完整代码)
- 黑科技编程开发,利用Python使图片完美去除水印
- Redux 替代品 Zustand
- 浙大愤青郑强教授的演讲(大学生都来看看吧)
热门文章
- html overflow 样式,css修改overflow滚动条默认样式
- linux teaming状态命令,Linux 网卡Teaming
- C语言中字符数组的初始化与注意事项
- 国科大生命科学学院华大专项-孙海汐导师课题组专访:去伪存真的过程一定不是一帆风顺的...
- 从pheatmap无缝迁移至ComplexHeatmap
- R变量索引 - 什么时候使用 @或$
- 「超级右键」Mac必备的一款软件,新手get!
- 干货!无需任何工具,实测macOS双开微信客户端
- indexof java_java indexOf()简单字符查找实例
- 白鹭本地数据存储操作代码实例