使用valgrind分析C程序调用线路图

valgrind内存泄露和线程竞态检测 } int main(void) { test(); return 0; } 将程序编译生成可执行文件后执行: valgrind --leak-check=full ./程序名 输出结果如下: ==4832== Memcheck, a memory error detector ==4832== Copyright © 2002-2010, and GNU GPL’d, by Julian Seward et al. ==4832== Using V.. 阅读详情

Valgrind可以检测内存泄漏和内存违例,但是用Valgrind生成的日志信息结合kcachegrind就可以查看C程序的执行线路图,调用时间,是做性能优化和查看代码的非常好的工具。


1.下载安装

Valgrind 安装

到www.valgrind.org下载最新版valgrind

# wget http://www.valgrind.org/downloads/valgrind-3.9.0.tar.bz2
# tar -xvf valgrind-3.9.0.tar.bz2
# cd valgrind-3.9.0
# ./configure
# make && make install


2.Valgrind说明
Valgrind的使用非常简单,valgrind命令的格式如下:
valgrind [valgrind-options] your-prog [your-prog options]
一些常用的选项如下:
选项
作用
-h --help
显示帮助信息。
--version
显示valgrind内核的版本,每个工具都有各自的版本。
-q --quiet
安静地运行,只打印错误信息。
-v --verbose
打印更详细的信息。
--tool= [default: memcheck]
最常用的选项。运行valgrind中名为toolname的工具。如果省略工具名,默认运行memcheck。
--db-attach= [default: no]
绑定到调试器上,便于调试错误。


3.使用Valgrind分析Nginx

这是正常的Nginx的启动命令

#/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

使用Valgrind的callgrind来分析一下程序的效率

# valgrind --tool=callgrind  /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

按Ctrl+C结束,在valgrind安装目录生成callgrind.out.2026文件

 

4.kcachegrind图形化显示

使用kcachegrind工具打开,右键导出图片

1).总览图

 

可以右键调整图形


2).程序模块执行百分比图


3).程序模块调用关系图


# valgrind --tool=callgrind /etc/init.d/php-fpm

PHP-FPM分析图

更复杂了



5.Valgrind工具
1).Memcheck
最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。所以,它能检测以下问题:
1.对未初始化内存的使用;
2.读/写释放后的内存块;
3.读/写超出malloc分配的内存块;
4.读/写不适当的栈中内存块;
5.内存泄漏,指向一块内存的指针永远丢失;
6.不正确的malloc/free或new/delete匹配;
7,memcpy()相关函数中的dst和src指针重叠。
这些问题往往是C/C++程序员最头疼的问题,Memcheck在这里帮上了大忙。 


2).Callgrind
和gprof类似的分析工具,但它对程序的运行观察更是入微,能给我们提供更多的信息。和gprof不同,它不需要在编译源代码时附加特殊选项,但加上调试选项是推荐的。Callgrind收集程序运行时的一些数据,建立函数调用关系图,还可以有选择地进行cache模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。 比起Cachegrind而言Callgrind更有用。Callgrind在Cachegrind基础上实现,可以可视化展示函数调用关系,以及每个函数在整个进程运行过程中所占的成本


3).Cachegrind
Cache分析器,它模拟CPU中的一级缓存I1,Dl和二级缓存,能够精确地指出程序中cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。 


4).Helgrind
它主要用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为“Eraser”的竞争检测算法,并做了进一步改进,减少了报告错误的次数。不过,Helgrind仍然处于实验阶段。


5). Massif

堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。
此外,lackey和nulgrind也会提供。Lackey是小型工具,很少用到;Nulgrind只是为开发者展示如何创建一个工具。我们就不做介绍了。


6.Valgrind分析内存泄漏

#include <stdio.h>
#include <stdlib.h>
void f(void) 
{ 
int* x = malloc(10 * sizeof(int)); 
x[10] = 0; // problem 1: heap block overrun 
} // problem 2: memory leak -- x not freed 
int main(void) 
{ 
int i=0; 
f(); 
printf("i=%d/n",i); //problem 3: use uninitialised value. 
return 0; 
} 

保存为memleak.c并编译,然后用valgrind检测。
# cc -Wall -o memleak memleak.c
# valgrind --tool=memcheck ./memleak 



前面的2405是程序运行时的进程号。第一行是告诉我们错误类型,这里是非法写入。下面的是告诉我们错误发生的位置,在main()调用的f()函数中。
在程序运行结束后,valgrind还给出了一个小的总结SUMMARY.我们可以很清楚地看出,分配和释放了多少内存,有多少内存泄漏。这对我们查找内存泄漏十分方便.


重新编译程序并绑定调试器:
# gcc -Wall -ggdb -o memleak memleak.c
# valgrind --db-attach=yes --tool=memcheck ./memleak
一出现错误,valgrind会自动启动调试器(一般是gdb):


#  valgrind --tool=cachegrind ./memleak

上面的是指令缓存,I1和L2i缓存,的访问信息,包括总的访问次数,丢失次数,丢失率。
中间的是数据缓存,D1和L2d缓存,的访问的相关信息,下面的L2缓存单独的信息。Cachegrind也生成一个文件,名为cachegrind.out.pid,可以通过cg_annotate来读取。输出是一个更详细的列表。Massif的使用和cachegrind类似,不过它也会生成一个名为massif.pid.ps的PostScript文件,里面只有一幅描述堆栈使用状况的彩图。


参考:

php扩展xdebug安装以及用kcachegrind系统分析

用 kcachegrind 调优 squid 2.7 笔记

valgrind 简介与用法

C语言调试和分析工具 gprof 是 GNU Profiler 的简称,是一个用于性能分析的工具,主要用于分析 C、C++ 以及其他支持的编程语言编写的程序。它的主要功能是帮助开发者找出程序的性能瓶颈,从而优化代码。gprof 的工作原理是通过插入代码段来记录程序的运行时间和调用关系,然后生成性能分析报告。 阅读详情

相关推荐

no-pool-nginx:用普通的malloc替换nginx的池机制,并免费使用valgrind之类的工具

名称 no-pool-nginx-NGINX修补程序,用于禁用NGINX的内存池进行调试。 描述 这是Nginx源的一组补丁文件。 它用简单的malloc和free代替了nginx的池机制,以帮助valgrind的memcheck之类的工具来更可靠地检测内存问题。 用法 cd nginx-VERSION/ patch -p1 < /path/to/nginx-VERSION-no_pool.patch ./configure make make install 版权和许可 该程序已获得BSD许可。 OpenResty Inc.版权所有(c)2010-2017,宜春市“ agentzh” Zhang 版权所有(c)2010,Shrimp虾 。 版权所有。 如果满足以下条件,则允许以源代码和二进制形式进行重新分发和使用,无论是否经过修改,都可以: 重新分发源代码必须保留上述版权声

valgrind (二)--函数调用分析

既上一篇介绍了使用valgrind进行内存泄露和内存越界访问检查之后,本文介绍如何使用valgrind进行函数调用的性能分析。 使用方法 测试代码和编译步骤参见我的上一篇博文《valgrind (一)–检测内存泄露和内存越界》。这里只介绍如何进行性能分析。再开始之前首先安装一下需要使用的工具: sudo apt-get install valgrind sudo apt-get install p...

程序猿Ricky的日常干货 1824

SRT公网点对点传输及搭建SRT流媒体服务器

SRT是一种开源传输技术,它是基于UDP协议的,与RTMP不同的是,它具有高码率低延迟的传输特性,加强了在复杂不稳定网络环境中的传输可靠性,提升了不可预测的网络环境上的流传输性能。它不像NDI那样只适用于局域网传输,它更适用于公网环境下的信号传输。 S代表Secure,即安全加密的视频流,R代表Reliable,即具有从数据严重丢包中恢复的可靠性,T代表Transport,即动态适应变化的网络状况。 在音视频数据包传输的过程中,SRT会检测并适应两个传输点之间的实时网络状况,有助于补偿由于网络的拥塞而引起的

罗宇。的媒体技术工作室 1万+

nginx-模块内存泄露调试

在开发或使用别人模块时,偶尔会出现内存泄露的情况,这个时候在配置文件中配置 worker_processer 1; daemon off; master_process off; 然后使用valgrind调试: valgrind --leak-check=yes --log-file=valgrind_result_leak --trace-children=yes ./nginx 然后出现如下结果: ==29006== 355,213,312 bytes in 86,722 bl

zhangge3663的博客 688

PVE(Proxmox VE)添加VMware Esxi并迁移虚拟机

跨平台迁移虚拟机:从VMware虚拟化平台迁移虚拟机到PVE平台。

VEGETA的博客 7718

STM32G474使用HRTIM触发多路ADC采样,通过DMA传输,通过串口打印显示,实现PWM中间时刻采样,避免开关噪声

本章工程使用HRTIM定时器进行ADC的触发,打开主定时器,子定时器A,B,C。(本工程未使用到A与C定时器,配置时可无需打开)主定时器配置:设置主定时器的频率为100KHz,并且设置自动更新以及自动重装载值。子定时器B设置:设置子定时器B为100KHz,并且每九次计数完成后产生一次中断。配置如上:1.打开自动预装载值2.打开自动复位3.设置死区时间以及互补PWM4.定时器复位触发更新寄存器5.定时器翻转重置更新6.重置触发源(定时器计数器在发生更新事件时重置)

weixin_41407439的博客 4909

Linux调试工具

1. 使用printf调试 #ifdef DEBUG Printf(“valriable x has value = %d\n”, x) #endif 然后在编译选项中加入-DDEBUG 更复杂的调试应用如: #define BASIC_DEBUG 1 #define EXTRA_DEBUG 2 #define SUPER_DEBUG 4

bugouyonggan的专栏 1万+

拆解一个带主动均衡的BMS模块:从变压器、MOS管矩阵到控制逻辑,图文详解内部设计与成本构成

本文深度拆解了一款带主动均衡功能的BMS模块,详细解析了其核心架构、元器件选型与成本构成。通过高频变压器、MOS管矩阵等硬件设计,该模块实现了高达87%的能量转移效率,远超普通被动均衡方案。文章还揭示了汽车级PCB设计、软件策略优化等关键技术细节,为锂电池管理系统设计提供了实用参考。

weixin_42638178的博客 348

用valgrind kcachegind gprof2dot等生成函数调用图

为了分析大型软件动态运行时的函数调用关系,有时需要抓取其trace分析。目前一般有几种办法:

Heron——Linux & ARM 2436

手把手教你学Simulink——基于Simulink的固态变压器(SST)多级协同控制

摘要:本文详细介绍了基于Simulink的固态变压器(SST)多级协同控制方法。SST作为新一代智能电网核心设备,通过AC-DC整流、DC-DC隔离和DC-AC逆变三级架构实现电能高效转换。针对多级耦合难题,提出能量-功率协同控制策略:纵向解耦电压环与功率前馈,横向联动级间功率指令。在Simulink中搭建10kV/400V系统模型,实现直流母线电压波动<2%的动态性能。特别设计了负载突变时的三级协同机制,通过虚拟惯性算法和前馈控制实现快速响应。文章包含完整的建模步骤、控制推导和参数设置,为电力电子工

MHD0815的博客 195

11、体内皮质功能的电压敏感染料成像技术

本文详细介绍了电压敏感染料成像(VSDI)技术在体内皮质功能研究中的应用。内容涵盖VSDI的技术起源、作用机制、信号特点与解读局限性,以及其在映射感觉皮质功能区方面的优势。文章对比了VSDI与电极记录和钙成像技术的差异,突出了其在高时空分辨率下监测神经元群体亚阈值活动的独特价值。同时,提供了完整的实验操作流程,包括手术步骤、染料应用、光学系统配置及数据分析方法,并总结了常见问题及其解决方案。随着基因靶向和多模态技术结合的发展,VSDI有望进一步提升信号特异性和空间精度,成为解析大脑网络动态的重要工具。

Apple的专栏 81

性能分析工具使用-callgrind+kcachegrind

性能分析工具使用-callgrind+kcachegrind   一、简述     本文讲述如何应用callgrind和kcachegrind进行性能分析。该工具可以方便分析出可执行文件函数的执行时间及调用关系。 二、开发环境 操作系统 Mint17 内核 3.13.0 编译器 gcc4.8.0

fengjingge 1万+

【Proteus仿真】用24C04与1602LCD设计的简易加密电子密码锁

【Proteus仿真】用24C04与1602LCD设计的简易加密电子密码锁

perseverance51博客 1122

3.Linux基础开发⼯具【由浅入深-Linux】

在 Windows 环境中,我们习惯了双击 或 文件并一路点击“下一步”来安装软件。但在 Linux 的世界里,软件的分发和安装理念有着本质的不同。Linux 强调权限控制、模块化和依赖管理。为了帮您构建完整的 Linux 系统管理知识体系,我们可以将 Linux 下安装软件的方式归纳为五大主流阵营。这是 Linux 下最正统、也是日常使用频率最高的方式。它又细分为“在线仓库安装”和“本地包安装”两种场景。1. 在线仓库安装(如同手机自带的 App Store) 操作系统维护着一个庞大的软件云端仓库。通

插花弄玉的博客 839

面向红外小目标检测的SCTransNet:模型优势解析、代码实现与完整复现指南

摘要:本文详细介绍了基于SCTransNet的红外小目标检测全流程实践方案。针对红外小目标检测面临的三大挑战(特征稀缺、背景干扰、尺度变化),SCTransNet通过空-通道交叉注意力机制有效增强目标特征。文章包含完整的PyTorch实现代码,涵盖特征提取、注意力模块、多尺度融合等核心组件,并提供模型训练、评估的具体方法。同时给出毕设创新方向的建议,如模型轻量化、多模态融合等,帮助提升研究深度。该方案技术难度适中,应用价值明确,是红外目标检测领域理想的毕设选题方向。

m0_71589036的博客 4760

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

valgrind 使用 kcachegrind 查看函数运行时间

安装 首先安装运行分析函数时间的工具 kcachegrind 下载安装包 http://kcachegrind.sourceforge.net/,下载最新的 tar.gz 文件 解压文件,进入解压之后的目录,从 README 中可以找到安装方式,这里记录一下 cmake . make -j8 sudo make install 中间过程中遇到的一些,cmake的时候出问题,找不到一个依赖包 CM...

NeilZhy 2174

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Callgrind:调用图生成缓存和分支预测分析器

目录 6.1。概观 6.1.1。功能6.1.2。基本用法 6.2。高级用法 6.2.1。从一个程序运行多次分析转储6.2.2。限制收集事件的范围6.2.3。计算全球巴士事件6.2.4。避免循环6.2.5。分岔程序 6.3。Callgrind命令行选项 6.3.1。转储创建选项6.3.2。活动选项6.3.3。数据收集选项6.3.4。成本实体分离选项6.3.5。模拟选项6.3.6。缓存模拟

swartz_lubel的专栏 4983

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

nginx常见问题(七):内存占用过高排查与处理过程

通过以上步骤,可以系统性地排查和解决 Nginx 内存占用过高问题,同时建立长效的内存监控机制,避免因内存问题导致服务中断。

sre救赎之路 1653

valgrind memory leak check for nginx

valgrind --tool=memcheck --leak-check=full --show-reachable=yes --log-file=./valgrind.log.`date +%m%d%s` ./nginx

heidas的专栏 1506

nginx下使用asan和valgrind两个静态检查工具

1、valgrind valgrind安装:参考:https://blog.youkuaiyun.com/justheretobe/article/details/52986461 wegit:http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2 tar -jxvf valgrind-3.12.0.tar.bz2 cd valgrind-3.12.0 ./configure make sudo make install 输入valgrin...

zhangge3663的博客 1335

告别内存泄漏:Nginx内存监控与优化实战指南

你是否曾遭遇Nginx服务器在高并发下突然崩溃?是否疑惑为何系统内存持续攀升却找不到原因?本文将带你深入Nginx内存管理核心,掌握从监控统计到泄漏检测的全流程解决方案,让你的服务器稳定运行不再受内存问题困扰。读完本文,你将能够:配置关键内存参数、使用内置模块监控实时内存状态、分析内存分配源码、部署专业泄漏检测工具,并通过实战案例解决常见内存问题。 ## Nginx内存管理机制解析 Nginx...

gitblog_00226的博客 826

【nginx】服务器程序框架

服务器程序目录规划、makefile编写 一、信号高级认识范例 在触发SIGUSR1信号并因此sleep的10秒种期间,就算你多次触发SIGUSR1信号,也不会重新执行SIGUSR1信号对应的信号处理函数,而是会等这个信号处理程序执行完了,把那些信号为一次执行一次信号处理程序。但是,如果在USR1的信号处理程序执行时收到了USR2,则会跳到USR2的信号处理程序,如果不想让它跳,应屏蔽该信号,...

Hustle Everyday 824

nginx学习笔记

nginx总结

qq_45892987的博客 1018

Valgrind——内存调试和性能分析工具

Valgrind是一套开放源代码(GPL V2)的仿真调试工具集合,由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件(plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind 是一个强大的内存调试和性能分析工具,广泛用于 Linux 系统上的程序开发和测试。它可以帮助开发者检测内存泄漏、数组越界、未初始化变量等问题,并提供详细的报告。

wei_Embedded_z的博客 6646

内存检查工具valgrind介绍、安装与使用

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

mijichui2153的博客 3万+
上一篇: 轻量级简单队列服务HTTPSQS安装与使用
下一篇: FAST-CGI安装与使用
unix21
博客等级 码龄14年 115粉丝 248原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值