Valgrind 是一款 内存调试和性能分析工具,主要功能:

  1. 内存泄漏检测

    • 检测程序中的内存泄漏,即分配的内存没有被正确释放。
  2. 内存错误检测
    • 检测 未初始化的内存读取越界访问释放后访问 等内存错误。
  3. 线程错误检测
    • 检测线程中的 数据竞争 和其他线程错误。
  4. 性能分析
    • 缓存使用分析程序的性能瓶颈,帮助开发者优化程序。
  5. 堆栈溢出检测
    • 检测栈的 溢出 或访问未分配的内存区域。

1. 安装 Valgrind

sudo apt update
sudo apt install valgrind -y

2. 编译程序

假设有一个 C 程序 test.c

#include <stdio.h>
#include <stdlib.h> void leak_memory() {
int *p = (int *)malloc(10 * sizeof(int)); // 分配了内存但未释放
} int main() {
leak_memory();
printf("Hello, Valgrind!\n");
return 0;
}

编译时添加调试信息 -g

gcc -g test.c -o test

CMake项目编译时添加调试信息的方法

  1. 在CMakeLists.txt中添加 set(CMAKE_BUILD_TYPE debug)
  2. 构建项目时添加 -DCMAKE_BUILD_TYPE=Debug
  • 直接在CMakeLists.txt文件中添加add_compile_options(-g)

使用 Valgrind 检测内存问题:

valgrind --leak-check=full --show-leak-kinds=all ./test

输出示例:

==12345== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==12345== at 0x4C2DB8F: malloc (vg_replace_malloc.c:299)
==12345== by 0x4005E7: leak_memory (test.c:5)
==12345== by 0x4005F5: main (test.c:10)

分析:

  • definitely lost 说明内存泄漏。

  • test.c:5 指示问题代码行。

Valgrind 常用参数

  • --leak-check=yes / --leak-check=full:开启内存泄漏检查,full 提供更详细的报告。

  • --track-origins=yes:跟踪未初始化内存的来源。帮助查找未初始化的内存访问来源。

  • --show-leak-kinds=all:显示所有类型的内存泄漏。

  • --max-stackframe=128:显示堆栈溢出的信息,限制栈帧的大小。

  • --verbose:显示更多的调试信息。

使用 Valgrind 的基本步骤

  1. 编译程序
  • 在使用 Valgrind 分析程序之前,确保程序是 以调试模式 编译的(开启调试符号)。可以通过以下编译选项来启用:
g++ -g -o your_program your_program.cpp
  1. 运行程序并进行分析

    使用 Valgrind 跟踪和分析你的程序,以下是一个简单的例子:
valgrind --leak-check=full --track-origins=yes ./your_program
  • 这将会检测程序的 内存泄漏,并显示每个未初始化内存访问的来源。
  1. 查看报告
  • Valgrind 会在终端输出分析报告,你可以根据这些信息来定位内存问题。
  1. 修复问题
  • 根据 Valgrind 的报告,找到代码中的问题(比如内存泄漏、越界访问等),并修复它们。

示例:使用 Memcheck 查找内存泄漏

valgrind --leak-check=full --show-leak-kinds=all ./your_program 2> valgrind_log.txt

输出示例:

==12345== Memcheck, a memory error detector
==12345== Command: ./your_program
==12345==
==12345== 1 bytes in 1 blocks are definitely lost in loss record 1 of 2
==12345== at 0x4C29A4A: malloc (vg_replace_malloc.c:309)
==12345== by 0x4E6E9D9: main (your_program.cpp:10)
==12345==
==12345== LEAK SUMMARY:
==12345== definitely lost: 1 byte in 1 block
==12345== indirectly lost: 0 bytes in 0 blocks
==12345== possibly lost: 0 bytes in 0 blocks
==12345== still reachable: 0 bytes in 0 blocks
==12345== suppressed: 0 bytes in 0 blocks

该报告指出程序在 main 函数中有 1 字节的内存泄漏,并给出了泄漏的调用堆栈信息。


Valgrind内存调试和性能分析工具使用教程的更多相关文章

  1. valgrind和Kcachegrind性能分析工具详解

    一.valgrind介绍 valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,用于构建动态分析工具的装备性框架.它包括一个工具集,每个工具执行某种类型的调试.分析或类似的任务, ...

  2. 11个Visual Studio代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

  3. jstack(查看线程)、jmap(查看内存)和jstat(性能分析)

    公司内部同事分享的一篇文章 周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令.供大家参考 1.Jstack 1.1 ...

  4. jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

    jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令   公司内部同事分享的一篇文章 周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jma ...

  5. Linux性能分析工具与图形化方法

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~. 作者:赵坤|腾讯魔王工作室后台开发工程师 在项目开发中,经常会遇到程序启动时间过长.CPU使用率过高等问题,这个时候需要依靠性能分析工具来 ...

  6. 系统级性能分析工具perf的介绍与使用[转]

    测试环境:Ubuntu16.04(在VMWare虚拟机使用perf top存在无法显示问题) Kernel:3.13.0-32 系统级性能优化通常包括两个阶段:性能剖析(performance pro ...

  7. 命令:jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

    命令:jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令 这些命令 必须 在 linux jdk bin 路径 下执行 eq: ./jstack 10303 即可  如果想把 ...

  8. .NET 11 个 Visual Studio 代码性能分析工具

    原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...

  9. Linux下性能分析工具汇总

    来自:http://os.51cto.com/art/201104/253114.htm 本文讲述的是:CPU性能分析工具.Memory性能分析工具.I/O性能分析工具.Network性能分析工具. ...

  10. 11 个 Visual Studio 代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

随机推荐

  1. C#字符串拼接的6种方式及其性能分析对比

    前言 在C#编程中字符串拼接是一种常见且基础的操作,广泛应用于各种场景,如动态生成SQL查询.构建日志信息.格式化用户显示内容等.然而,不同的字符串拼接方式在性能和内存使用上可能存在显著差异.今天咱们 ...

  2. [BZOJ3451] Normal 题解

    这题分三步:葺网(期望).淀粉质(点分治).蓉翅(容斥),再佐以芬芳团(FFT),一道巨难无比的 luogu 黑题就诞生了. 期望 先考虑在淀粉树上,\(i\) 点在 \(j\) 点的子树里的概率.实 ...

  3. Linux命令行连接蓝牙设备

    Linux命令行连接蓝牙设备 查看Bluetooth设备: hciconfig 启动一个Bluetooth设备,例如:hci0: hciconfig hci0 up 相关指令 查看特定的Bluetoo ...

  4. ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this

    mysql操作错误: mysql> use mysql;ERROR 1820 (HY000): You must reset your password using ALTER USER sta ...

  5. 数据挖掘 | 数据隐私(2) | 差分隐私 | 数据重构化攻击(Reconstruction Attacks)

    L2-Reconstruction Attacks 本节课的目的在于正式地讨论隐私,但是我们不讨论算法本身有多隐私,取而代之去讨论一个算法隐私性有多么的不可靠.并且聚焦于 Dinur 与 Nissim ...

  6. helm部署redis集群

    Redis 集群部署流程 前提:K8s+helm安装完成 1. 安装 NFS 服务器 1.1 安装 NFS 工具包 在 NFS 服务器上安装 nfs-utils 包: sudo yum install ...

  7. Windows编程----CreateProcess函数

    CreateProcess函数原型 CreateProcess 函数用于创建一个新进程(子进程)及其主线程,其函数原型如下: BOOL CreateProcess( LPCWSTR lpApplica ...

  8. 锐翊6800H-ES小主机PVE Windows11LTSC核显直通记录

    因为之前做AIO所以开始捣鼓了下PVE虚拟化,又突发奇想想在PVE下挂一些Windows端的游戏,故有了这篇文章. 还有一个原因是网上的大部分教程对PVE8/AMD小主机并不适用. 本次使用的硬件/软 ...

  9. 移动端 web 调试神器 - Eruda

    移动端 web 调试神器 - Eruda 移动端 web 调试神器 - Eruda 基本使用 效果预览 核心步骤 安装依赖 yarn add vite-plugin-html -D # or npm ...

  10. Windows 10 的 "邮件" 设置完成QQ账户,提示您的Qq帐户设置已过期的处置方法

    引起这问题的原因可能是QQ未开启 1.POP3/SMTP服务 2.IMAP/SMTP服务   开启方法: 1.登录QQ邮箱(mail.qq.com) 2.点击"设置"->&q ...