设计网站数据,网站改版不换域名,网站建设验收书,wordpress域名重定向前言 
正文 
一、环境的安装 
1、tar –xf valgrind-3.17.0.tar.bz2
2、cd valgrind-3.17.0
3、./configure         // 运行配置脚本生成makefile文件#xff0c;可以--help查看配置项#xff0c;自行按需配置#xff0c;比如修改编译工具、修改安装路径等
4、make
5、make…前言 
正文 
一、环境的安装 
1、tar –xf valgrind-3.17.0.tar.bz2
2、cd valgrind-3.17.0
3、./configure         // 运行配置脚本生成makefile文件可以--help查看配置项自行按需配置比如修改编译工具、修改安装路径等
4、make
5、make install        //安装生成可执行文件可执行文件的路径有参数--prefix指定需要在PATH中添加环境变量若不加参数--prefix指定仅使用默认配置则会自动关联安装完后可以使用 valgrind --help查看使用方法 或测试一下是否安装成功 
二、使用 
1、工具的基本介绍 
1Memcheck。这是valgrind应用最广泛的工具一个重量级的内存检查器能够发现开发中绝大多数内存错误使用情况比如使用未初始化的内存使用已经释放了的内存内存访问越界等。这也是本文将重点介绍的部分。 2Callgrind。它主要用来检查程序中函数调用过程中出现的问题。 3Cachegrind。它主要用来检查程序中缓存使用出现的问题。 4Helgrind。它主要用来检查多线程程序中出现的竞争问题。 5Massif。它主要用来检查程序中堆栈使用中出现的问题。 6Extension。可以利用core提供的功能自己编写特定的内存调试工具 
2、常用选项 
1适用于所有Valgrind工具 –tool name  最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。 -h --help 显示帮助信息。 –version 显示valgrind内核的版本每个工具都有各自的版本。 -q --quiet 安静地运行只打印错误信息。 -v --verbose 更详细的信息, 增加错误数统计。 –trace-childrenno|yes 跟踪子线程? [no] –track-fdsno|yes 跟踪打开的文件描述[no] –time-stampno|yes 增加时间戳到LOG信息? [no] –log-fd number  输出LOG到描述符文件 [2stderr] –log-file file  将输出的信息写入到filename.PID的文件里PID是运行程序的进行ID –log-file-exactly file  输出LOG信息到 file –log-file-qualifier VAR  取得环境变量的值来做为输出信息的文件名。 [none] –log-socketipaddr:port 输出LOG到socket ipaddr:port 
2LOG信息输出 –xmlyes 将信息以xml格式输出只有memcheck可用 –num-callers number  show  numbe r callers in stack traces [12] –error-limitno|yes 如果太多错误则停止显示新错误? [yes] –error-exitcode number  如果发现错误则返回错误代码 [0disable] –db-attachno|yes 当出现错误valgrind会自动启动调试器gdb。[no] –db-command command  启动调试器的命令行选项[gdb -nw %f %p] 
3适用于Memcheck工具的相关选项 –leak-checkno|summary|full 要求对leak给出详细信息? [summary] –leak-resolutionlow|med|high how much bt merging in leak check [low] –show-reachableno|yes show reachable blocks in leak check? [no] 更详细的使用信息详见帮助文件、man手册或官网http://valgrind.org/docs/manual/manual-core.html 
4注意 ① valgrind不会自动的检查程序的每一行代码只会检查运行到的代码分支所以单元测试或功能测试用例很重要 ② 可以把valgrind看成是一个sandbox通过valgrind运行的程序实际上是运行在valgrind的sandbox中的所以不要测试性能会让你失望的建议只做功能测试 ③ 编译代码时建议增加-g -o0选项不要使用-o1、-o2选项 
3、memcheck工具的原理 
–tool name  : 使用的工具名称
–log-file file  : 输出的日志的名称valgrind --toolmemcheck --log-filelog.txt --leak-checkyes  ./test说明使用memcheck工具对test程序进行包含内存泄漏的检查并将日志保存到log.txt 
当待分析程序片段第一次被执行时valgrind会将代码片段交给工具——比如内存调试时使用的memcheck处理工具会在代码中插入一些辅助分析的代码片段。新的代码会在valgrind模拟出的CPU上执行。然后valgrind会结合之前读取到的待执行程序和其所关联的库文件的调试信息输出分析结果。 
因为有新插入的代码逻辑valgrind运行下的程序都比其独立运行时要慢。视选择的工具不同其效率可能是正常值的1/4~1/50。所以使用valgrind做性能分析时一般不使用绝对数据而使用相同环境下的相对数据进行对比。 
为了让valgrind读取出准确的调试信息待分析程序最好使用-O0禁止编译器优化以及使用-g让编译器把行号信息编入到文件中。 
4、memcheck示例 
编译 g -O0 -g test.c -o test_g 
ValGrind分析valgrind --toolmemcheck ./test_g 
1、写违例 
#include stdlib.hint main() {const int array_count  4;int* p  (int *)malloc(array_count * sizeof(int));p[array_count]  0; // Illegal read free(p);return 0;
}第1显示有4个字节被违例写入第2显示写入的位置在分配的16个字节之后。 
2、读违例 
#include stdlib.hint main() {const int array_count  4;int* p  (int *)malloc(array_count * sizeof(int));int error_num  p[array_count]; // Illegal readfree(p);return 0;
}错误的位置和上例一样区别在于这次是读取不合法的地址的数据。使用valgrind分析显示 第一行显示有4个字节被违例读取第三行显示读取的位置在分配的16个字节之后。 
3、使用未初始化变量 
#include stdlib.h
#include stdio.hint main() {const int array_count  4;int* p  (int*)malloc(array_count * sizeof(int));printf(%d,  p[array_count - 1]);free(p);int undefine_num;printf(%d, undefine_num);return 0;
}第7行和第11行分别访问了堆上、栈上未初始化的变量。valgrind分析显示  
这里面就会提醒第7行和第11行访问了未初始化的变量。 
5、Valgrind 的局限 
Valgrind 不对静态数组 (分配在栈上) 进行边界检查。如果在程序中声明了一个数组: 
int main(int argc, char *argv[])
{char x[10];x[11]  a;return 0;
}Valgrind 则不会警告你你可以把数组改为动态在堆上分配的数组这样就可能进行边界检查了。这个方法好像有点得不偿失的感觉。 
Valgrind 占用了更多的内存—可达两倍于你程序的正常使用量。如果你用 Valgrind 来检测使用大量内存的程序就会遇到问题它可能会用很长的时间来运行测试。大多数情况下这都不是问题即使速度慢也仅是检测时速度慢如果你用 Valgrind 来检测一个正常运行时速度就很慢的程序这下问题就大了。Valgrind 不可能检测出你在程序中犯下的所有错误—如果你不检查缓冲区溢出Valgrind 也不会告诉你代码写了它不应该写的内存。 
参考