Valgrind内存调试和性能分析工具使用教程
Valgrind是一款 内存调试和性能分析工具,主要功能:
- 内存泄漏检测:
- 检测程序中的内存泄漏,即分配的内存没有被正确释放。
- 内存错误检测:
- 检测 未初始化的内存读取、越界访问、释放后访问 等内存错误。
- 线程错误检测:
- 检测线程中的 数据竞争 和其他线程错误。
- 性能分析:
- 缓存使用分析、程序的性能瓶颈,帮助开发者优化程序。
- 堆栈溢出检测:
- 检测栈的 溢出 或访问未分配的内存区域。
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项目编译时添加调试信息的方法
- 在CMakeLists.txt中添加 set(CMAKE_BUILD_TYPE debug)
- 构建项目时添加 -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 的基本步骤
- 编译程序:
- 在使用 Valgrind 分析程序之前,确保程序是 以调试模式 编译的(开启调试符号)。可以通过以下编译选项来启用:
g++ -g -o your_program your_program.cpp
- 运行程序并进行分析:
使用 Valgrind 跟踪和分析你的程序,以下是一个简单的例子:
valgrind --leak-check=full --track-origins=yes ./your_program
- 这将会检测程序的 内存泄漏,并显示每个未初始化内存访问的来源。
- 查看报告:
- Valgrind 会在终端输出分析报告,你可以根据这些信息来定位内存问题。
- 修复问题:
- 根据 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内存调试和性能分析工具使用教程的更多相关文章
- valgrind和Kcachegrind性能分析工具详解
一.valgrind介绍 valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,用于构建动态分析工具的装备性框架.它包括一个工具集,每个工具执行某种类型的调试.分析或类似的任务, ...
- 11个Visual Studio代码性能分析工具
软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...
- jstack(查看线程)、jmap(查看内存)和jstat(性能分析)
公司内部同事分享的一篇文章 周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令.供大家参考 1.Jstack 1.1 ...
- jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令 公司内部同事分享的一篇文章 周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jma ...
- Linux性能分析工具与图形化方法
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~. 作者:赵坤|腾讯魔王工作室后台开发工程师 在项目开发中,经常会遇到程序启动时间过长.CPU使用率过高等问题,这个时候需要依靠性能分析工具来 ...
- 系统级性能分析工具perf的介绍与使用[转]
测试环境:Ubuntu16.04(在VMWare虚拟机使用perf top存在无法显示问题) Kernel:3.13.0-32 系统级性能优化通常包括两个阶段:性能剖析(performance pro ...
- 命令:jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
命令:jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令 这些命令 必须 在 linux jdk bin 路径 下执行 eq: ./jstack 10303 即可 如果想把 ...
- .NET 11 个 Visual Studio 代码性能分析工具
原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...
- Linux下性能分析工具汇总
来自:http://os.51cto.com/art/201104/253114.htm 本文讲述的是:CPU性能分析工具.Memory性能分析工具.I/O性能分析工具.Network性能分析工具. ...
- 11 个 Visual Studio 代码性能分析工具
软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...
随机推荐
- STC内部扩展RAM的应用
RAM是用来在程序运行中存放随机变量的数据空间,51单片机默认的内部RAM只有128字节,52单片机增加至256字节,STC89C52增加到512字节,STC89C54.55.58.516等增加到12 ...
- 给大模型添加联网功能的免费方案,以langchain为例
langchain介绍 LangChain 是一个用于开发由大型语言模型 (LLM) 驱动的应用程序的框架. 简单来说,它可以帮助你更轻松地构建利用 LLM(例如 OpenAI 的 GPT 模型.Go ...
- NebulaGraph Desktop 使用初体验
前言 前两天 NebulaGraph 官方宣布了全新的开源 Desktop,旨在通过一体化方案解决图数据库部署复杂.工具碎片化.学习成本高等的痛点问题,我也是跃跃欲试.前期在初识 NebulaGrap ...
- pnpm : 无法加载文件 \AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本。
1. 安装pnpm npm install -g pnpm #安装 pnpm pnpm --version #查看pnpm版本 安装完成后查看版本时报错 pnpm : 无法加载文件 C:\Users\ ...
- 探秘Transformer之(8)--- 位置编码
探秘Transformer之(8)--- 位置编码 0x00 概述 位置编码(Positional Embedding)是一种用于处理序列数据的技术,被用来表示输入序列中的单词位置.在Transfor ...
- Abaqus-Steady-State-Dynamic-Analysis的求解原理
0. 总括 基于模态的谐响应分析,可以通过扫频的方式求解频率范围内结构的线性稳态响应情况.阻尼是和频率相关的,但模态叠加法只需要知道n个模态阻尼即可推广到其他频率范围(原因详见文内公式). 1. 谐响 ...
- PPT-产品页图片并茂
一.好的文案原则 图片并茂 -重点突出 二.操作 抠图 拷贝图片到ppt页面->选中图片->双击删除背景->标记要删除的区域 背景替换 1.复制图片->粘贴->置于底层 ...
- allure 报告环境搭建
1.安装 pip install allure-pytest 2.下载allure 地址: https://repo.maven.apache.org/maven2/io/qameta/allure/ ...
- openpyxl 写入字典
def write(self,data_path, sheetname,value): index = len(value) workbook = openpyxl.Workbook() sheet ...
- 错误修正记录: [Vivado 12-8300] Launch HLS failed! Please see vitis_hls.log for details.
起因 使用了Vivado Video Frame Buffer Read和Vivado Video Frame Buffer Write,按out of context模式综合失败.vivado版本2 ...