《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
1 | # 更新软件源 |
3. valgrind工具的使用
3.1. 命令的语法格式
valgrind -q –tool=
–log-file= ./
-q:-quiet 安静地运行,只打印荣誉的信息,如版本号。--tool=<tool_name>: 要使用的工具名称,如:memcheck、callgrind,该选项未设置时,默认为memcheck。tool_name可以是memcheckcallgrindcachegrindhelgrindmassif
--log-file=<file_name>: 日志输出文件。<other_options>: 针对tool_name的其他选项。
示例:
1 | # 内存泄漏检测 |
3.2. 工具选项
适用于所有Valgrind工具。
-–tool=<toolname>: 最常用的选项。运行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
3.3. LOG信息输出
–xml=yes: 将信息以xml格式输出,只有memcheck可用–num-callers=<number>: show < numbe r> 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]
3.4. Demo演示
源码demo05.cpp:
1 |
|
编译程序:
1 | # 编译demo05.cpp |
memcheck的使用:
1 | # 内存检测 |
可以看到Valgrind输出了内存错误和泄漏信息。
其他工具的使用:
1 | # callgrind |
历史文章推荐: