《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 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
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,未来还会折腾更多东西,不死不休。
感谢大家的关注,期待与你一起成长。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容