Valgrind 使用简单说明
本文部分参考网上相关资料。
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 free’d)
使用超过 malloc分配的内存空间(Reading/writing off the end of malloc’d blocks)
对堆栈的非法访问 (Reading/writing inappropriate areas on the stack)
申请的空间是否有释放 (Memory leaks – where pointers to malloc’d 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
Callgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache 模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。
Cachegrind
它模拟 CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中 cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。
Helgrind
它主要用来检查多线程程序中出现的竞争问题。Helgrind 寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为” Eraser” 的竞争检测算法,并做了进一步改进,减少了报告错误的次数。
Massif
堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。
Valgrind 安装1、 到www.valgrind.org下载最新版valgrind-3.2.3.tar.bz2
2、 解压安装包:tar –jxvf valgrind-3.2.3.tar.bz2
wget http://www.valgrind.org/downloads/valgrind-3.8.1.tar.bz2
tar -xjvf linux-2.6.20.tar.bz2
3、 解压后生成目录valgrind-3.2.3
4、 cd valgrind-3.2.3
5、 ./configure
6、 Make;make installValgrind 使用
用法: valgrind [options] prog-and-args [options]: 常用选项,适用于所有Valgrind工具
-tool=<name> 最常用的选项。运行 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=<number> 输出LOG到描述符文件 [2=stderr]
-log-file=<file> 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID
-log-file-exactly=<file> 输出LOG信息到 file
-log-file-qualifier=<VAR> 取得环境变量的值来做为输出信息的文件名。 [none]
-log-socket=ipaddr:port 输出LOG到socket ,ipaddr:port
LOG信息输出
-xml=yes 将信息以xml格式输出,只有memcheck可用
-num-callers=<number> show <number> callers in stack traces [12]
-error-limit=no|yes 如果太多错误,则停止显示新错误? [yes]
-error-exitcode=<number> 如果发现错误则返回错误代码 [0=disable]
-db-attach=no|yes 当出现错误,valgrind会自动启动调试器gdb。[no]
-db-command=<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 使用举例
下面是一段有问题的C程序代码test.c
#include <stdlib.h>
void f(void)
{
int* x = malloc(10 * sizeof(int));
x[10] = 0; //问题1: 数组下标越界
} //问题2: 内存没有释放int main(void)
{
f();
return 0;
}1、 编译程序test.c
gcc -Wall test.c -g -o test
2、 使用Valgrind检查程序BUG
valgrind --tool=memcheck --leak-check=full ./test
3、 分析输出的调试信息
==3908== Memcheck, a memory error detector.
==3908== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==3908== Using LibVEX rev 1732, a library for dynamic binary translation.
==3908== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==3908== Using valgrind-3.2.3, a dynamic binary instrumentation framework.
==3908== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==3908== For more details, rerun with: -v
==3908==
--3908-- DWARF2 CFI reader: unhandled CFI instruction 0:50
--3908-- DWARF2 CFI reader: unhandled CFI instruction 0:50
/*数组越界错误*/
==3908== Invalid write of size 4
==3908== at 0x8048384: f (test.c:6)
==3908== by 0x80483AC: main (test.c:11)
==3908== Address 0x400C050 is 0 bytes after a block of size 40 alloc'd
==3908== at 0x40046F2: malloc (vg_replace_malloc.c:149)
==3908== by 0x8048377: f (test.c:5)
==3908== by 0x80483AC: main (test.c:11)
==3908==
==3908== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 14 from 1)
==3908== malloc/free: in use at exit: 40 bytes in 1 blocks.
==3908== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.
==3908== For counts of detected errors, rerun with: -v
==3908== searching for pointers to 1 not-freed blocks.
==3908== checked 59,124 bytes.
==3908==
==3908==
/*有内存空间没有释放*/
==3908== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==3908== at 0x40046F2: malloc (vg_replace_malloc.c:149)
==3908== by 0x8048377: f (test.c:5)
==3908== by 0x80483AC: main (test.c:11)
==3908==
==3908== LEAK SUMMARY:
==3908== definitely lost: 40 bytes in 1 blocks.
==3908== possibly lost: 0 bytes in 0 blocks.
==3908== still reachable: 0 bytes in 0 blocks.
==3908== suppressed: 0 bytes in 0 blocks.
分享到:
相关推荐
总的来说,Valgrind是软件开发中不可或缺的工具,它能够帮助开发者在早期阶段发现并修复潜在的内存错误,优化代码性能,特别是对于C和C++这样的语言,Valgrind的使用尤为重要。正确地使用Valgrind,可以极大地提高...
- **基本用法**:演示如何使用 Valgrind 进行简单的内存泄漏检查和性能分析。 - **高级功能**:介绍 Valgrind 的一些高级特性,如多线程支持、特定工具的使用等。 - **常见问题**:列出一些常见的问题及解决方法...
常见的调试方法包括使用内存检测工具(如Valgrind等)、设置断点以及记录内存分配和释放的日志等。 #### 二、大块内存池内存(Block Memory)分配接口说明 ##### 2.1 采用大块内存池内存分配接口的原因 大块内存...
现在,让我们通过一个简单的C++例子来说明如何使用Valgrind检测内存泄露: ```cpp #include int main() { int* ptr = (int*)malloc(sizeof(int)); // 没有释放ptr,导致内存泄露 return 0; } ``` 编译并运行...
5. **valgrind**:内存调试工具。帮助开发者检测内存泄漏和访问错误。 6. **doxygen**:文档生成器。从源代码注释中生成高质量的文档。 7. **git**:分布式版本控制系统。用于追踪对文件的修改,管理软件开发过程...
`README`文件可能包含了项目的使用说明和注意事项。开发者通常会在`README`中详细解释如何编译、运行测试以及如何解读检测结果。对于内存泄露检测,`README`可能会指导用户如何将这个模块集成到他们的代码中,以监控...
下面是NS3的安装说明和简单的使用方法。 一、NS3的安装 NS3的安装需要一些必要的依赖项,包括gcc、g++、python、python-dev、mercurial、bzr、libgtk2.0-0、libgtk2.0-dev、gdb、valgrind、doxygen、graphviz、...
`./waf –run hello-simulator`用于运行简单的示例程序,如果运行成功且无错误,说明ns-3已成功安装。 在实际操作中,可以编写无线网络拓扑的模拟脚本,例如将`examples/tutorial/third.cc`复制到`scratch`目录下...
描述该脚本将erlang的fprof输出转换为valgrind的callgrind输出。 要生成fprof输出,请使用fprof:analyse({dest, "outfile.fprof"}). 。 不要使用总计。 转换为callgrind很简单,只需键入: ./erlgrind_script ...
以一个简单的示例来说明mtrace的实际应用过程: 1. **修改源代码**:假设有一个名为`example.c`的程序,希望从程序中的`main`函数开始追踪内存分配情况。首先在`main`函数入口处调用`mtrace()`。 ```c #include ...
6. **动态分析** - 对于Valgrind或Google Sanitizers,会在运行时检查内存使用和其他潜在问题。 7. **报告结果** - CI服务会生成构建报告,显示是否所有步骤都成功,以及任何失败的测试或分析结果。 通过这个项目...
安装`cppcheck`相对简单,通常只需下载源代码,编译并安装到系统路径即可。对于那些没有安装经验的开发者,`cppcheck`附带的说明文档会提供详细的步骤指导。 使用`cppcheck`进行内存泄漏检测,首先需要在命令行中...
- `if`: 最简单的条件分支语句,如 `if (age > 18) printf("成年人");` - `if-else`: 提供两个选择路径,如 `if (age > 18) printf("成年人"); else printf("未成年人");` - `if-elseif-else`: 支持多个条件分支...
- **valgrind.suppress**: Valgrind抑制文件,用于忽略某些已知的内存检测问题。 - **.gitignore**: Git忽略文件,指定在版本控制中忽略的文件和目录。 - **LICENSE**: 许可证文件,说明了模块的授权方式,通常遵循...
本文主要介绍了在Windows系统中常用的内存泄露检测工具——Visual Leak Detector (VLD),以及一个简单的案例说明如何使用VLD进行内存泄露检测。 Visual Leak Detector是一款开源的内存泄露检测工具,专为Visual C++...
"使用说明.txt"很可能是该工具或编辑器的用户指南,包含了如何安装和操作的详细步骤。“当下软件园.url”则是一个网址链接,可能指向了下载该工具或获取更多相关信息的网站。 总的来说,测试工具、C语言代码编辑器...
而“说明.txt”可能是对文档的简要介绍或使用指南,可能包括阅读顺序、重点章节提示等内容。 总之,通过深入学习这个资料包,你可以逐步掌握Linux编程的核心技能,从而在Linux环境中游刃有余地开发和维护软件系统。...
如果仅仅是简单地更改类名无法解决问题,则需要采取更复杂的方法来避免命名冲突,比如使用命名空间。 ### 六、文件类简介 文件类在C++中主要用于文件的读写操作。通常会提供一些成员函数如`open()`用于打开文件,`...
- **内存泄漏检测**:通过工具如Valgrind检测程序中的内存泄漏问题。 ##### 2.3 内存页管理与动态内存管理 - **内存页管理**:现代操作系统中,内存是以页的形式管理的,每一页固定大小(如4KB),这有助于提高...