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相关推荐

  1. 内存问题分析的利器——valgrind的memcheck

    在<内存.性能问题分析的利器--valgrind>一文中我们简单介绍了下valgrind工具集,本文将使用memcheck工具分析各种内存问题.(转载请指明出于breaksoftware的 ...

  2. 动态执行流程分析和性能瓶颈分析的利器——valgrind的callgrind

    在<内存.性能问题分析的利器--valgrind>一文中我们简单介绍了下valgrind工具集,本文将使用callgrind工具进行动态执行流程分析和性能瓶颈分析.(转载请指明出于brea ...

  3. 总结篇:性能问题分析及优化的一般方法,工具速查

    目录 性能分析的一般步骤 一.CPU 性能分析 二.内存性能分析 三.磁盘和文件系统 I/O 性能分析 四.网络性能分析 五.应用程序瓶颈 性能优化的一般方法 一.CPU 优化 二.内存优化 三.磁盘 ...

  4. .NET内存性能分析指南

    .NET Memory Performance Analysis 知道什么时候该担心,以及在需要担心的时候该怎么做 译者注 作者信息:Maoni Stephens - 微软架构师,负责.NET Run ...

  5. android内存占用分析,Android App性能评测分析-内存篇

    1.内存了解 在Android App的性能优化的各个部分里,内存方面的知识较多且不易理解,内存的问题绝对是最令人头疼的一部分,需要对内存基础知识.内存分配.内存管理机制等非常熟悉,才能排查问题. 1 ...

  6. .NET内存性能分析宝典

    .NET Memory Performance Analysis 知道什么时候该担心,以及在需要担心的时候该怎么做 译者注 **作者信息:Maoni Stephens ** - 微软架构师,负责.NE ...

  7. element下拉列表触发_记一次vue长列表的内存性能分析和优化

    好久没写东西,博客又长草了,这段时间身心放松了好久,都没什么主题可以写了 上周接到一个需求,优化vue的一个长列表页面,忙活了很久也到尾声了,内存使用和卡顿都做了一点点优化,还算有点收获 写的有点啰嗦 ...

  8. 编写一个能监控到windows进程占用内存大小的脚本_Java性能监控分析及调优工具...

    >>>推荐阅读<<< 1.性能测试学习笔记-场景设计 2.性能测试的重要意义 3.性能分析流程及方法 4.应用系统性能调优之性能分析 Java性能监控分析及调优工具 ...

  9. 流计算 Oceanus | Flink JVM 内存超限的分析方法总结

    作者:董伟柯,腾讯 CSIG 高级工程师 问题背景 前段时间,某客户线上运行的大作业(并行度 200 左右)遇到了 TaskManager JVM 内存超限问题(实际内存用量 4.1G > 容器 ...

最新文章

  1. jQuery实例——仿京东仿淘宝列表导航菜单
  2. 在寻找SD-WAN供应商之前,你应该考虑啥呢?
  3. python基础教程是什么意思-python基础教程都有什么?
  4. 图解在emu8086中学习汇编语言数字比较程序
  5. 企业运维之域控篇(九)--辅助域强制占用后的操作--清除数据
  6. 【渝粤题库】陕西师范大学180103市场营销学Ⅰ作业(高起专)
  7. API(应用程序接口)是什么
  8. 决策树案例:基于python的商品购买能力预测系统
  9. 1、Java多线程基础:进程和线程之由来
  10. DAY02.使用JAVA从国家统计局爬取2020年全国统计用区划代码和城乡划分代码(省市区数据)
  11. ASP版微信分享JS-SDK代码
  12. PHP使用声网的页面录制、合流录制、单流录制
  13. 电信增值短信平台软件模块清单(sp专用)
  14. MyBatis-Plus 代码生成器最新版配置方案
  15. Flow公链 |动态交易手续费
  16. 国产紫光FPGA实现DDS信号发生器(ModelSim仿真)
  17. 大学生综合测评系统(C++)
  18. 05机器学习--多项式回归与模型泛化及python实现
  19. 汇编语言题库总结及题目分析
  20. 密码学读书笔记系列(一):《密码故事——人类智力的另类较量》

热门文章

  1. html5表单实例元素,HTML5新表单元素的图文实例-
  2. opencv--车牌识别
  3. 随笔:计算机编程中的一些术语
  4. mxnet deepspeech网络结构打印
  5. Udacity机器人软件工程师课程笔记(五)-样本搜索和找回-基于漫游者号模拟器-自主驾驶
  6. 【烦人的问题】有一天发现VSCode中自己的鼠标选择老是跨行选择多段代码,怎么都改不回来,而且用alt+shift+鼠标都无法切换,肿么办?
  7. 在Ubuntu 16.04.3 LTS上安装Go 1.10
  8. Rocksdb iterator和snapshot 接口
  9. ceph pool 相关命令
  10. Keras使用多个GPU并行