内存、性能问题分析的利器——valgraind
valgrind是一个知名的分析软件集。我们可以使用它进行内存、多线程及性能等各种问题的分析。它采用非侵入方式,所谓非侵入方式是指:我们不用在代码中插入分析工具的库。这对于开发者来说是友好的。因为如果要将工具编译到文件中,或者要调用其提供的一些API,才能进行问题分析,无疑增大了用户的学习和使用成本。(转载请指明出于breaksoftware的csdn博客)
valgrind [valgrind-options] your-prog [your-prog-options]
当我们需要分析一款软件时,只要采用上面格式的调用。其中your-prog是被分析的程序文件路径,your-prog-options是原本要传递给待分析程序的参数。valgrind-options是valgrind的一些参数,最常用的是--tool=【tool_name】。我们可以使用不同的tool进行不同的分析,比如使用memcheck进行内存问题分析。
valgrind --tool=memcheck ls -l
那么valgrind和memcheck到底是什么关系呢?我们可以通过下图表达出
当待分析程序片段第一次被执行时,valgrind会将代码片段交给工具——比如内存调试时使用的memcheck处理,工具会在代码中插入一些辅助分析的代码片段。新的代码会在valgrind模拟出的CPU上执行。然后valgrind会结合之前读取到的待执行程序和其所关联的库文件的调试信息,输出分析结果。
因为有新插入的代码逻辑,valgrind运行下的程序都比其独立运行时要慢。视选择的工具不同,其效率可能是正常值的1/4~1/50。所以使用valgrind做性能分析时,一般不使用绝对数据,而使用相同环境下的相对数据进行对比。
为了让valgrind读取出准确的调试信息,待分析程序最好使用-O0禁止编译器优化,以及使用-g让编译器把行号信息编入到文件中。比如对于下面的代码
#include <stdlib.h>int main() {const int array_count = 4;int* p = malloc(array_count * sizeof(int));p[array_count] = 0;return 0;
}
如果我们使用O2参数让编译器去做优化
gcc -O2 mem_leak.c -o mem_leak
编译器会认为4~6行是没有意义的,于是被优化了。于是使用valgrind分析不出代码的问题
这并不是valgrind的错误,因为编译器的确编译出了一个空的main函数。我们可以用IDA反编译看看
所以我们要使用O0禁止编译优化
gcc -O0 mem_leak.c -o mem_leak
此时编译出来的二进制代码可以被解读为
此时使用valgrind分析,可以看到它给出内存写违例和内存泄露的报告。
但是它没有告诉我们哪行出错了,于是我们要加上-g编译参数
gcc -g -O0 mem_leak.c -o mem_leak
这样我们可以看到第6行导致写违例。
有时候,待分析的程序会启动子程序。如果我们希望分析子程序,则需要增加--trace-children=yes。比如我们使用time启动上面的程序
可以看出,valgrind分析出作为父程序的time是没有问题的,但是作为子程序的mem_leak有两个错误。
内存、性能问题分析的利器——valgraind相关推荐
- 内存问题分析的利器——valgrind的memcheck
在<内存.性能问题分析的利器--valgrind>一文中我们简单介绍了下valgrind工具集,本文将使用memcheck工具分析各种内存问题.(转载请指明出于breaksoftware的 ...
- 动态执行流程分析和性能瓶颈分析的利器——valgrind的callgrind
在<内存.性能问题分析的利器--valgrind>一文中我们简单介绍了下valgrind工具集,本文将使用callgrind工具进行动态执行流程分析和性能瓶颈分析.(转载请指明出于brea ...
- 总结篇:性能问题分析及优化的一般方法,工具速查
目录 性能分析的一般步骤 一.CPU 性能分析 二.内存性能分析 三.磁盘和文件系统 I/O 性能分析 四.网络性能分析 五.应用程序瓶颈 性能优化的一般方法 一.CPU 优化 二.内存优化 三.磁盘 ...
- .NET内存性能分析指南
.NET Memory Performance Analysis 知道什么时候该担心,以及在需要担心的时候该怎么做 译者注 作者信息:Maoni Stephens - 微软架构师,负责.NET Run ...
- android内存占用分析,Android App性能评测分析-内存篇
1.内存了解 在Android App的性能优化的各个部分里,内存方面的知识较多且不易理解,内存的问题绝对是最令人头疼的一部分,需要对内存基础知识.内存分配.内存管理机制等非常熟悉,才能排查问题. 1 ...
- .NET内存性能分析宝典
.NET Memory Performance Analysis 知道什么时候该担心,以及在需要担心的时候该怎么做 译者注 **作者信息:Maoni Stephens ** - 微软架构师,负责.NE ...
- element下拉列表触发_记一次vue长列表的内存性能分析和优化
好久没写东西,博客又长草了,这段时间身心放松了好久,都没什么主题可以写了 上周接到一个需求,优化vue的一个长列表页面,忙活了很久也到尾声了,内存使用和卡顿都做了一点点优化,还算有点收获 写的有点啰嗦 ...
- 编写一个能监控到windows进程占用内存大小的脚本_Java性能监控分析及调优工具...
>>>推荐阅读<<< 1.性能测试学习笔记-场景设计 2.性能测试的重要意义 3.性能分析流程及方法 4.应用系统性能调优之性能分析 Java性能监控分析及调优工具 ...
- 流计算 Oceanus | Flink JVM 内存超限的分析方法总结
作者:董伟柯,腾讯 CSIG 高级工程师 问题背景 前段时间,某客户线上运行的大作业(并行度 200 左右)遇到了 TaskManager JVM 内存超限问题(实际内存用量 4.1G > 容器 ...
最新文章
- jQuery实例——仿京东仿淘宝列表导航菜单
- 在寻找SD-WAN供应商之前,你应该考虑啥呢?
- python基础教程是什么意思-python基础教程都有什么?
- 图解在emu8086中学习汇编语言数字比较程序
- 企业运维之域控篇(九)--辅助域强制占用后的操作--清除数据
- 【渝粤题库】陕西师范大学180103市场营销学Ⅰ作业(高起专)
- API(应用程序接口)是什么
- 决策树案例:基于python的商品购买能力预测系统
- 1、Java多线程基础:进程和线程之由来
- DAY02.使用JAVA从国家统计局爬取2020年全国统计用区划代码和城乡划分代码(省市区数据)
- ASP版微信分享JS-SDK代码
- PHP使用声网的页面录制、合流录制、单流录制
- 电信增值短信平台软件模块清单(sp专用)
- MyBatis-Plus 代码生成器最新版配置方案
- Flow公链 |动态交易手续费
- 国产紫光FPGA实现DDS信号发生器(ModelSim仿真)
- 大学生综合测评系统(C++)
- 05机器学习--多项式回归与模型泛化及python实现
- 汇编语言题库总结及题目分析
- 密码学读书笔记系列(一):《密码故事——人类智力的另类较量》
热门文章
- html5表单实例元素,HTML5新表单元素的图文实例-
- opencv--车牌识别
- 随笔:计算机编程中的一些术语
- mxnet deepspeech网络结构打印
- Udacity机器人软件工程师课程笔记(五)-样本搜索和找回-基于漫游者号模拟器-自主驾驶
- 【烦人的问题】有一天发现VSCode中自己的鼠标选择老是跨行选择多段代码,怎么都改不回来,而且用alt+shift+鼠标都无法切换,肿么办?
- 在Ubuntu 16.04.3 LTS上安装Go 1.10
- Rocksdb iterator和snapshot 接口
- ceph pool 相关命令
- Keras使用多个GPU并行