




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Valgrind 使用简单说明Valgrind的概述:Valgrind时建立动态分析工具的框架。它有一系列用于调试分析的工具。Valgrind的架构是组件化的,所以可以方便的添加新的工具而不影响当前的结构。下面的工具是安装时的标准配置:Memcheck:用于检测内存错误。它帮助c和c+的程序更正确。Cachegrind:用于分析cache和分支预测。它帮助程序执行得更快。Callgrind:用于函数调用的分析。Helgrind:用于分析多线程。DRD:也用于分析多线程。与Helgrind类似,但是用不同的分析技术,所以可以检测不同的问题。Massif:用于分析堆。它帮助程序精简内存的使用。SGcheck:检测栈和全局数组溢出的实验性工具,它和Memcheck互补使用。Valgrind能做什么? 内存使用检测,包括: 内存泄漏 非法内存访问 未初始化变量使用 重复释放内存 多线程竞争 检测死锁 -检测竞争Valgrind还能做什么? 性能分析 Cachegrind+ cg_annotate 它模拟 CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中 cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数,这些可以看成程序的执行成本。以上数据其实对于app开发意义不大,仅作为参考。 使用方法: Callgrind+ callgrind_annotate/kcachegrind 比起Cachegrind而言Callgrind更有用。Callgrind在Cachegrind基础上实现,可以可视化展示函数调用关系,以及每个函数在整个进程运行过程中所占的成本。对于 Helgrind/DRD POSIXAPI误用 潜在的死锁提醒 数据竞争 Massif 内存分析工具,统计进程使用的内存情况,包括堆、栈Valgrind memcheck 用法:valgrind-tool=memcheck-leak-check=yes ./grog 输出:Memcheck 工具主要检查下面的程序错误:使用未初始化的内存 (Use of uninitialised memory) 使用已经释放了的内存 (Reading/writing memory after it has been freed) 使用超过 malloc分配的内存空间(Reading/writing off the end of mallocd blocks) 对堆栈的非法访问 (Reading/writing inappropriate areas on the stack) 申请的空间是否有释放 (Memory leaks where pointers to mallocd blocks are lost forever) malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new vs free/delete/delete ) src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions) Callgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache 模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。它模拟 CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中 cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。它主要用来检查多线程程序中出现的竞争问题。Helgrind 寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为” Eraser” 的竞争检测算法,并做了进一步改进,减少了报告错误的次数。堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。1、 到下载最新版valgrind-3.2.3.tar.bz22、 解压安装包:tar jxvf valgrind-3.2.3.tar.bz23、 解压后生成目录valgrind-3.2.3 4、 cd valgrind-3.2.35、 ./configure6、 Make;make install用法: valgrind options prog-and-args options: 常用选项,适用于所有Valgrind工具-tool= 最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。 h help 显示帮助信息。 -version 显示valgrind内核的版本,每个工具都有各自的版本。 q quiet 安静地运行,只打印错误信息。 v verbose 更详细的信息, 增加错误数统计。 -trace-children=no|yes 跟踪子线程? no -track-fds=no|yes 跟踪打开的文件描述?no -time-stamp=no|yes 增加时间戳到LOG信息? no -log-fd= 输出LOG到描述符文件 2=stderr -log-file= 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID -log-file-exactly= 输出LOG信息到 file -log-file-qualifier= 取得环境变量的值来做为输出信息的文件名。 none -log-socket=ipaddr:port 输出LOG到socket ,ipaddr:port LOG信息输出-xml=yes 将信息以xml格式输出,只有memcheck可用 -num-callers= show callers in stack traces 12 -error-limit=no|yes 如果太多错误,则停止显示新错误? yes -error-exitcode= 如果发现错误则返回错误代码 0=disable -db-attach=no|yes 当出现错误,valgrind会自动启动调试器gdb。no -db-command= 启动调试器的命令行选项gdb -nw %f %p 适用于Memcheck工具的相关选项:-leak-check=no|summary|full 要求对leak给出详细信息? summary -leak-resolution=low|med|high how much bt merging in leak check low -show-reachable=no|yes show reachable blocks in leak check? no Valgrind的使用:1.准备好程序:编译程序时用-g,这样编译后的文件包含调试信息,那Memcheck的分析信息中就包含正确的行号。最好使用-O0的优化等级,使用-O2及以上的优化等级使用时可能会有问题。2.在Memcheck下运行程序:如果你的程序执行如下:myprog arg1 arg2那么使用如下:valgrind -leak-check=yes myprog arg1 arg2Memcheck是默认的工具。-leak-check打开内存泄漏检测的细节。在上面的命令中运行程序会使得程序运行很慢,而且占用大量的内存。Memcheck会显示内存错误和检测到的内存泄漏。3.如何查看Memcheck的输出:这里有一个实例c代码(a.c),有一个内存错误和一个内存泄漏。#include void f(void) int*x = (int *)malloc(10 * sizeof(int); x10= 0; /problem 1: heap block overrun /problem 2: memory leak - x not freed int main(void) f(); return0; 运行如下: linuxidc:/NFS/valg/test$ valgrind-leak-check=yes ./a=24780= Memcheck, a memory error detector=24780= Copyright (C) 2002-2011, and GNUGPLd, by Julian Seward et al.=24780= Using Valgrind-3.7.0 and LibVEX;rerun with -h for copyright info=24780= Command: ./a=24780=24780= Invalid write of size 4=24780= at 0x80484DF: f() (a.c:5)=24780= by 0x80484F1: main (a.c:11)=24780= Address 0x42d3050 is 0 bytes after a block of size 40 allocd=24780= at 0x4026444: malloc (vg_replace_malloc.c:263)=24780= by 0x80484D5: f() (a.c:4)=24780= by 0x80484F1: main (a.c:11)=24780=24780=24780= HEAP SUMMARY:=24780= in use at exit: 40 bytes in 1 blocks=24780= total heap usage: 1 allocs, 0 frees, 40 bytes allocated=24780=24780= 40 bytes in 1 blocks aredefinitely lost in loss record 1 of 1=24780= at 0x4026444: malloc (vg_replace_malloc.c:263)=24780= by 0x80484D5: f() (a.c:4)=24780= by 0x80484F1: main (a.c:11)=24780=24780= LEAK SUMMARY:=24780= definitely lost: 40 bytes in 1 blocks=24780= indirectly lost: 0 bytes in 0 blocks=24780= possibly lost: 0 bytes in 0 blocks=24780= still reachable: 0 bytes in 0 blocks=24780= suppressed: 0 bytes in 0 blocks=24780=24780= For counts of detected andsuppressed errors, rerun with: -v=24780= ERROR SUMMARY: 2 errors from 2contexts (suppressed: 17 from 6) 如何来阅读这个输出结果:=24780= Memcheck, a memory error detector=24780= Copyright (C) 2002-2011, and GNUGPLd, by Julian Seward et al.=24780= Using Valgrind-3.7.0 and LibVEX;rerun with -h for copyright info=24780= Command: ./a这一部分是显示使用的工具以及版本信息。其中24780是Process ID。 =24780= Invalid write of size 4=24780= at 0x80484DF: f() (a.c:5)=24780= by 0x80484F1: main (a.c:11)=24780= Address 0x42d3050 is 0 bytes after a block of size 40 allocd=24780= at 0x4026444: malloc (vg_replace_malloc.c:263)=24780= by 0x80484D5: f() (a.c:4)=24780= by 0x80484F1: main (a.c:11)这部分指出了错误:Invalid write。后面的几行显示了函数堆栈。 =24780= HEAP SUMMARY:=24780= in use at exit: 40 bytes in 1 blocks=24780= total heap usage: 1 allocs, 0 frees, 40 bytes allocated=24780=24780= 40 bytes in 1 blocks aredefinitely lost in loss record 1 of 1=24780= at 0x4026444: malloc (vg_replace_malloc.c:263)=24780= by 0x80484D5: f() (a.c:4)=24780= by 0x80484F1: main (a.c:11)=24780=24780= LEAK SUMMARY:=24780= definitely lost: 40 bytes in 1 blocks=24780= indirectly lost: 0 bytes in 0 blocks=24780= possibly lost: 0 bytes in 0 blocks=24780= still reachable: 0 bytes in 0 blocks=24780= suppressed: 0 bytes in 0 blocks这部分是对堆和泄漏的总结,可以看出内存泄漏的错误。=24780= For counts of detected andsuppressed errors, rerun with: -v=24780= ERROR SUMMARY: 2 errors from 2contexts (suppressed: 17 from 6)这部分是堆所有检测到的错误的总结。代码中的两个错误都检测到了。Helgrind:线程错误检测工具若使用这个工具,在Valgrind的命令中添加-tool=helgrind。Helgrind用于c,c+下使用POSIXpthreads的程序的线程同步错误。Helgrind可以检测下面三类错误:1.POSIX pthreads API的错误使用2.由加锁和解锁顺序引起的潜在的死锁3.数据竞态-在没有锁或者同步机制下访问内存以数据竞态为例来说明Helgrind的用法:在不使用合适的锁或者其他同步机制来保证单线程访问时,两个或者多个线程访问同一块内存就可能引发数据竞态。一个简单的数据竞态的例子:#include int var = 0; void* child_fn ( void* arg ) var+;/* Unprotected relative to parent */ /* this is line 6 */ returnNULL; int main ( void ) pthread_tchild; pthread_create(&child,NULL, child_fn, NULL); var+;/* Unprotected relative to child */ /* this is line 13 */ pthread_join(child,NULL); return0; 运行如下: linuxidc:/NFS/valg/test$ valgrind-tool=helgrind ./b=25449= Helgrind, a thread error detector=25449= Copyright (C) 2007-2011, and GNUGPLd, by OpenWorks LLP et al.=25449= Using Valgrind-3.7.0 and LibVEX;rerun with -h for copyright info=25449= Command: ./b=25449=25449=-Thread-Announcement-=25449=25449= Thread #1 is the programs rootthread=25449=25449= -Thread-Announcement-=25449=25449= Thread #2 was created=25449= at 0x4123A38: clone (in /lib/tls/i686/cmov/libc-2.11.1.so)=25449= by 0x40430EA: pthread_createGLIBC_2.1 (in /lib/tls/i686/cmov/libpthread-2.11.1.so)=25449= by 0x402A9AD: pthread_create_WRK (hg_intercepts.c:255)=25449= by 0x402AA85: pthread_create* (hg_intercepts.c:286)=25449= by 0x80484E1: main (b.c:11)=25449=25449=-=25449=25449= Possible data race during read ofsize 4 at 0x804A020 by thread #1=25449= Locks held: none=25449= at 0x80484E2: main (b.c:12)=25449=25449= This conflicts with a previouswrite of size 4 by thread #2=25449= Locks held: none=25449= at 0x80484A7: child_fn (b.c:6)=25449= by 0x402AB04: mythread_wrapper (hg_intercepts.c:219)=25449= by 0x404296D: start_thread (in /lib/tls/i686/cmov/libpthread-2.11.1.so)=25449= by 0x4123A4D: clone (in /lib/tls/i686/cmov/libc-2.11.1.so)=25449=25449=-=25449=25449= Possible data race during writeof size 4 at 0x804A020 by thread #1=25449= Locks held: none=25449= at 0x80484E2: main (b.c:12)=25449=25449= This conflicts with a previouswrite of size 4 by thread #2=25449= Locks held: none=25449= at 0x80484A7: child_fn (b.c:6)=25449= by 0x402AB04: mythread_wrapper (
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 惠安财务基础知识培训课件
- 北京海淀2026届化学高二第一学期期末联考模拟试题含答案
- 患者院感课件
- 传统节日中秋节趣味活动方案
- 恐龙科普绘本课件
- 春学期学校教研活动方案
- 新疆直升本科考试试题及答案
- 划焊工艺考试题及答案
- 四川叉车考试试题及答案
- 松鼠初数面试题及答案
- 医药行业数字化营销方案研究
- 3.2 歌曲《牧童之歌》课件(9张)
- 可穿戴设备可靠性优化技术
- 仓库人员防暑措施方案
- 小学教师嘉奖主要事迹材料简短
- 2024年江西省高考化学试卷(真题+答案)
- 血液透析诊疗指南
- 2023年河南省对口升学养殖类专业课试卷
- TSG-T7001-2023电梯监督检验和定期检验规则宣贯解读
- 社区健康服务与管理教案
- 房屋装修合同范本下载
评论
0/150
提交评论