Linux C++ 开发10 - 手把手教你使用valgrind性能分析工具

news/2024/11/16 15:23:41/文章来源:https://www.cnblogs.com/luoweifu/p/18428350
  • 1. 什么是valgrind?
  • 2. (Ubuntu)安装valgrind
  • 3. valgrind工具的使用
    • 3.1. 命令的语法格式
    • 3.2. 工具选项
    • 3.3. LOG信息输出
    • 3.4. Demo演示

《Linux C++ 开发9 - 手把手教你使用gprof性能分析工具》一文中,我们讲解了gprof工具的使用方法,本文将继续讲解valgrind工具的使用方法。

1. 什么是valgrind?

Valgrind 是一个强大的内存分析工具,主要用于内存泄漏检测、内存访问错误和性能分析。它是一个开源工具集,包含多个工具,如MemcheckCallgrind等。

  • Memcheck: 用于检测内存错误,如内存泄漏、非法内存访问等。
  • Callgrind: 用于收集程序运行时的函数调用信息,帮助进行性能分析。
  • Cachegrind: 它主要用来检查程序中缓存使用出现的问题。
  • Helgrind: 它主要用来检查多线程程序中出现的竞争问题。
  • Massif: 用于分析程序的内存使用情况,帮助优化内存分配。

Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。
Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。

file

注意事项:

  1. valgrind不会自动的检查程序的每一行代码,只会检查运行到的代码分支。
  2. 编译代码时,建议增加-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=<tool_name> --log-file=<file_name> <other_options> ./<program_name>

  • -q: -quiet 安静地运行,只打印荣誉的信息,如版本号。
  • --tool=<tool_name>: 要使用的工具名称,如:memcheckcallgrind,该选项未设置时,默认为memcheck。tool_name可以是
    • memcheck
    • callgrind
    • cachegrind
    • helgrind
    • massif
  • --log-file=<file_name>: 日志输出文件。
  • <other_options>: 针对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=<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:

#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

历史文章推荐:

  • Linux C++ 开发10 - 手把手教你使用valgrind性能分析工具

  • Linux C++ 开发9 - 手把手教你使用gprof性能分析工具

  • Linux C++ 开发8 - 性能分析工具汇总

  • Linux C++ 开发7 - GDB常用命令汇总

  • Linux C++ 开发6 - GDB调试入门指南

  • Linux C++ 开发5 - 一文了解CMake构建

  • Linux C++ 开发4 - 入门makefile一篇文章就够了

  • Linux C++ 开发3 - 你写的Hello world经过哪些过程才被计算机理解和执行?

  • Linux C++ 开发2 - 编写、编译、执行第一个程序

  • VSCode系列2 - 如何用VSCode搭建C++高效开发环境?

  • Linux C++ 开发1 - 搭建C++开发环境


大家好,我是陌尘。

IT从业10年+, 北漂过也深漂过,目前暂定居于杭州,未来不知还会飘向何方。

搞了8年C++,也干过2年前端;用Python写过书,也玩过一点PHP,未来还会折腾更多东西,不死不休。

感谢大家的关注,期待与你一起成长。



【SunLogging】
扫码二维码,关注微信公众号,阅读更多精彩内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/802657.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js DOM学习的综合样例

js DOM学习的综合样例 本人简单学习了一点md语法,写出来的博客会更好看喵. 样例介绍 主要实现利用DOM的获取标签对象的功能和对监听功能实现三个功能:(1)开灯,关灯(2)对标签进行全选,反选(3)对文本框聚焦时字母为大写,反之为小写基本实现方法(1)开灯关灯:a.用img标签贴图关灯的…

救园最后7天:「坚持你所相信的,相信你所坚持的」

从7月15日开始的救园还剩最后7天,很有希望,也很紧张,能否救园成功,取决于最后7天有多少园友出手相救。前二十年,我们选择了「坚持我们所相信的」,相信真心为开发者服务,一定会有出路,我们坚持了下来。在第二十年遇到最大难关时,我们选择了「相信我们所坚持的」从7月15…

统计一个字符在字符串里出现的次数

统计一个字符在字符串里出现的次数 背景在数据库操作中,统计字符串中某个特定字符出现的次数是一个常见需求。无论是分析文本数据、格式化字符串,还是确保数据一致性,字符出现次数的统计对于开发人员和数据库管理员来说都是一项重要任务。这个问题看似简单,但可以通过数据库…

React的useId,现在Vue3.5终于也有了!

前言 React在很早之前的版本中加了useId,用于生成唯一ID。在Vue3.5版本中,终于也有了期待已久的useId。这篇文章来带你搞清楚useId有哪些应用场景,以及他是如何实现的。 关注公众号:【前端欧阳】,给自己一个进阶vue的机会 useId的作用 他的作用也是生成唯一ID,同一个Vue应…

Windows 目录统计信息

WinDirStat 是适用于各种版本 Microsoft Windows 的磁盘使用情况统计查看器和清理工具。注意:如果您正在寻找 Linux 的替代品,您正在寻找 KDirStat(在 Debian 衍生产品上为 apt-get install kdirstat 或 apt-get install k4dirstat)或 QDirStat,对于 MacOS X,则为 Disk I…

Cisco Secure Firewall Threat Defense Virtual 7.6.0 发布下载,新增功能概览

Cisco Secure Firewall Threat Defense Virtual 7.6.0 - 思科下一代防火墙虚拟设备 (FTDv)Cisco Secure Firewall Threat Defense Virtual 7.6.0 - 思科下一代防火墙虚拟设备 (FTDv) Firepower Threat Defense (FTD) Software for ESXi & KVM 请访问原文链接:https://sysi…

让人眼前一亮的开源项目「GitHub 热点速览」

时隔两周,我又带着让人眼前一亮的开源项目回来了! 告别数据线、蓝牙、WiFi 和网络,只需用手机的摄像头扫描一张动图条形码(需安装应用),就能在设备间传输文件的 libcimbar,一款无需联网和蓝牙的文件传输工具,仅用摄像头传输数据。用 Rust 编写的 PostgreSQL 数据库命令…

Redis系列补充:聊聊布隆过滤器(go语言实践篇)

★ Redis24篇集合 1 介绍 布隆过滤器(Bloom Filter)是 Redis 4.0 版本之后提供的新功能,我们一般将它当做插件加载到 Redis Service服务器中,给 Redis 提供强大的滤重功能。 它是一种概率性数据结构,可用于判断一个元素是否存在于一个集合中。相比较之 Set 集合的去重功能…

伯克利函数调用排行榜(BFCL)

自 2022 年底以来,大语言模型(LLMs)凭借其执行通用任务的强大能力,成为众人关注的焦点。不仅限于聊天应用,将这些模型应用于开发各类 AI 应用和软件(如 Langchain, Llama Index, AutoGPT, Voyager)已成为一种趋势。GPT, Gemini, Llama, Mistral 等模型通过与外部世界的交…

读构建可扩展分布式系统:方法与实践13可扩展的事件驱动处理

可扩展的事件驱动处理1. 可扩展的事件驱动处理 1.1. 使用消息传递系统进行通信,你可以创建松耦合的架构1.1.1. 消息生产者只是将消息存储在队列中,而不用关心消费者如何处理消息1.1.2. 有一个或多个消费者,并且生产者和消费者的集合可以随着时间的推移而改变1.1.3. 有助于提…

java基础 -反射笔记

710,反射快速入门 代码: 先创建一个 re.properties 文件:classfullpath=com.hspedu.Cat method=hiCat.javapackage com.hspedu;public class Cat {private String name = "招财猫";public void hi() { //常用方法System.out.println("hi " + name);} …