《Linux C++ 开发9 - 手把手教你使用gprof性能分析工具》一文中,我们解说了gprof工具的使用方法,本文将继承解说valgrind工具的使用方法。
1. 什么是valgrind?
Valgrind 是一个强大的内存分析工具,主要用于内存走漏检测、内存访问错误和性能分析。它是一个开源工具集,包罗多个工具,如Memcheck、Callgrind等。
- Memcheck: 用于检测内存错误,如内存走漏、非法内存访问等。
- Callgrind: 用于收集程序运行时的函数调用信息,帮助进行性能分析。
- Cachegrind: 它主要用来查抄程序中缓存使用出现的问题。
- Helgrind: 它主要用来查抄多线程程序中出现的竞争问题。
- Massif: 用于分析程序的内存使用情况,帮助优化内存分配。
Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。
Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU情况,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。
注意事项:
- valgrind不会自动的查抄程序的每一行代码,只会查抄运行到的代码分支。
- 编译代码时,发起增加-g -o0选项,不要使用-o1、-o2选项。如许错误信息才能定位到代码行。
2. (Ubuntu)安装valgrind
- # 更新软件源
- sudo apt-get update
- # 安装valgrind
- sudo apt-get install valgrind
- # 验证valgrind是否安装成功
- valgrind --version
复制代码 3. valgrind工具的使用
3.1. 下令的语法格式
valgrind -q --tool= --log-file= ./
- -q: -quiet 安静地运行,只打印荣誉的信息,如版本号。
- --tool=: 要使用的工具名称,如:memcheck、callgrind,该选项未设置时,默以为memcheck。tool_name可以是
- memcheck
- callgrind
- cachegrind
- helgrind
- massif
- --log-file=: 日志输出文件。
- : 针对tool_name的其他选项。
示例:- # 内存泄漏检测
- valgrind -q --tool=memcheck --leak-check=full --log-file=log.txt ./demo05.out
- # 针对memcheck也可以省略 --tool=memcheck
- valgrind -q --leak-check=full --log-file=log.txt ./demo05.out
复制代码 3.2. 工具选项
适用于所有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
3.3. LOG信息输出
- –xml=yes: 将信息以xml格式输出,只有memcheck可用
- –num-callers=: show < numbe r> 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]
3.4. Demo演示
源码demo05.cpp:- #include <iostream>
- int main()
- {
- int* ptr = new int[10];
- ptr[10] = 0; // 数组越界访问
- delete[] ptr;
- return 0;
- }
复制代码 编译程序:- # 编译demo05.cpp
- # -g选项使编译结果保留调试符号表,内存分析工具发现错误时才能定位到代码行。
- g++ -g ./demo05.cpp -o ./demo05.out
复制代码 memcheck的使用:- # 内存检测
- valgrind -q --tool=memcheck --leak-check=full ./demo05.out
- ==13097== Invalid write of size 4
- ==13097== at 0x10918B: main (demo05.cpp:6)
- ==13097== Address 0x4e270a8 is 0 bytes after a block of size 40 alloc'd
- ==13097== at 0x48485C3: operator new[](unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
- ==13097== by 0x10917E: main (demo05.cpp:5)
- ==13097==
复制代码 可以看到Valgrind输出了内存错误和走漏信息。
其他工具的使用:- # callgrind
- valgrind --tool=callgrind --log-file=log.txt ./demo05.out
- # cachegrind
- valgrind --tool=cachegrind --log-file=log.txt ./demo05.out
- # helgrind
- valgrind --tool=helgrind --log-file=log.txt ./demo05.out
- # massif
- valgrind --tool=massif --log-file=log.txt ./demo05.out
复制代码 历史文章保举:
大家好,我是陌尘。
IT从业10年+, 北漂过也深漂过,目前暂定居于杭州,未来不知还会飘向何方。
搞了8年C++,也干过2年前端;用Python写过书,也玩过一点PHP,未来还会折腾更多东西,不死不休。
感谢大家的关注,等待与你一起成长。
【SunLogging】扫码二维码,关注微信公众号,阅读更多精彩内容
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |