动态分析C语言代码生成函数调用关系的利器——gprof

大纲

  • 准备工作
    • 下载libevent代码
    • 安装编译依赖
    • 编译libevent
  • 收集运行数据
    • 编译插入检测代码的可执行程序
    • 收集数据
  • 数据转换
    • 环境准备
    • 转换为dot
  • 转换为图片
    • 环境准备
    • 转换图片
  • 参考代码
  • 参考资料

gprof是一个C语言程序性能分析工具。在编译期间,我们给编译指令增加-pg选项,就可以将检测代码插入到源码中。然后使用gprof启动编译程序,它会收集程序运行的流程以及其他相关数据。最后我们使用gprof2dot将这些数据转换成dot文件,使用graphviz进行图形化展示。
在这里插入图片描述

以《静态分析C语言生成函数调用关系的利器——cflow(二)》中的libevent为例。

准备工作

下载libevent代码

git clone https://github.com/libevent/libevent.git

安装编译依赖

sudo apt-get install libssl-dev

编译libevent

cd libevent
mkdir build && cd build
cmake ..     # Default to Unix Makefiles.
make

收集运行数据

编译插入检测代码的可执行程序

我们还是选用test-time.c为例子。
因为我们不希望使用静态库链接的形式,所以直接编译整个源码。
主要关注的就是-pg -c选项的新增,其他的命令我们在《静态分析C语言生成函数调用关系的利器——cally和egypt》已经见过。

gcc `find . -regextype posix-extended -regex '^./[^/]*\.c$' ! -name 'wepoll.c' ! -name 'win32select.c' ! -name 'evthread_win32.c' ! -name 'buffer_iocp.c' ! -name 'bufferevent_async.c' ! -name 'arc4random.c' ! -name 'event_iocp.c' ! -name 'bufferevent_mbedtls.c'` \./test/test-time.c \-pg \-I./build/include/ -I./include -I./ \-L./build/lib/ -lcrypto -lssl \-DLITTLE_ENDIAN -D__clang__ \-UD_WIN32 -UDMBEDTLS_SSL_RENEGOTIATION \-o test-time

收集数据

执行下面指令,就能将程序运行的数据记录到test-time.output中。但是这个文件还是不能直接被图形化表达,需要进行一些处理。

gprof test-time > test-time.output

数据转换

上一步gprof采集的数据分为两部分,其中一个是调用关系(Call graph)

		     Call graph (explanation follows)granularity: each sample hit covers 4 byte(s) for 100.00% of 0.01 secondsindex % time    self  children    called     name0.00    0.01       1/1           main [3]
[1]    100.0    0.00    0.01       1         event_base_dispatch [1]0.01    0.00       1/1           event_base_loop [2]
-----------------------------------------------0.01    0.00       1/1           event_base_dispatch [1]
[2]    100.0    0.01    0.00       1         event_base_loop [2]0.00    0.00   13033/13033       clear_time_cache [41]0.00    0.00   13032/13032       timeout_next [43]……

这个数据格式我们需要转换成dot格式,以方便graphviz转换成图片。

环境准备

然后使用《管理Python虚拟环境的脚本》中的脚本构建虚拟环境,并安装gprof2dot

source env.sh init
source env.sh enter
source env.sh install gprof2dot

转换为dot

gprof2dot -e0 -n0  test-time.output>test-time.dot
digraph {graph [fontname=Arial, nodesep=0.125, ranksep=0.25];node [fontcolor=white, fontname=Arial, height=0, shape=box, style=filled, width=0];edge [fontname=Arial];1 [color="#ff0000", fontcolor="#ffffff", fontsize="10.00", label="event_base_dispatch\n100.00%\n(0.00%)\n1×"];1 -> 2 [arrowsize="1.00", color="#ff0000", fontcolor="#ff0000", fontsize="10.00", label="100.00%\n1×", labeldistance="4.00", penwidth="4.00"];2 [color="#ff0000", fontcolor="#ffffff", fontsize="10.00", label="event_base_loop\n100.00%\n(100.00%)\n1×"];2 -> 41 [arrowsize="0.35", color="#0d0d73", fontcolor="#0d0d73", fontsize="10.00", label="0.00%\n13033×", labeldistance="0.50", penwidth="0.50"];2 -> 42 [arrowsize="0.35", color="#0d0d73", fontcolor="#0d0d73", fontsize="10.00", label="0.00%\n13032×", labeldistance="0.50", penwidth="0.50"];2 -> 43 [arrowsize="0.35", color="#0d0d73", fontcolor="#0d0d73", fontsize="10.00", label="0.00%\n13032×", labeldistance="0.50", penwidth="0.50"];2 -> 45 [arrowsize="0.35", color="#0d0d73", fontcolor="#0d0d73", fontsize="10.00", label="0.00%\n13031×", labeldistance="0.50", penwidth="0.50"];2 -> 47 [arrowsize="0.35", color="#0d0d73", fontcolor="#0d0d73", fontsize="10.00", label="0.00%\n13031×", labeldistance="0.50", penwidth="0.50"];2 -> 49 [arrowsize="0.35", color="#0d0d73", fontcolor="#0d0d73", fontsize="10.00", label="0.00%\n13031×", labeldistance="0.50", penwidth="0.50"];
……

转换为图片

环境准备

sudo apt-get install python3 graphviz

转换图片

dot test-time.dot -Tpng -o test-time.png

请添加图片描述

参考代码

https://github.com/f304646673/tools/tree/main/gprof2dot

参考资料

  • https://ftp.gnu.org/old-gnu/Manuals/gprof-2.9.1/html_mono/gprof.html
  • https://en.wikipedia.org/wiki/Gprof

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第 8 章:Linux中使用时钟、计时器和信号

在本章中,我们将开始探索Linux环境中可用的各种计时器。随后,我们将深入了解时钟的重要性,并探讨UNIX时间的概念。接下来,我们将揭示在Linux中使用POSIX准确测量时间间隔的方法。之后,我们将进入std::chrono的领域&…

创业7年复盘,中美企业服务市场差异浅析

2024 年伊始,Kyligence 联合创始人兼 CEO 韩卿在公司内部的飞书订阅号发表了多篇 Rethink Data & Analytics 的内部信,分享了对数据与分析行业的一些战略思考,尤其是 AI 带来的各种变化和革命,是如何深刻地影响这个行业乃至整…

一篇文带你使用js实现拖拽排序

先介绍一下html5的drag属性,拖放(Drag 和 drop)是 HTML5 标准的组成部分。想要启用drag,只要给元素加上draggable"true"就行了(Safari 5.1.2除外)。   实际效果: 拖动事件(了解事件详情)   事…

Node.js 模块化

一、介绍 1.1 什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他 模块使用 1…

股票市场

(一)股票市场 顾名思义,就是买卖股票的场所。就是为了撮合想发展但缺钱的企业与有钱但想投资的投资者。 股票市场按照交易场所,可分为场内市场和场外市场: 场内市场是指证券交易所, 场外市场就是证券交易…

【Linux】Linux环境基础开发工具使用

上篇博客我们学习了Linux权限相关知识,那么这节课我们来学习一下Linux环境基础开发工具使用吧~,主要包括yum、vim、gcc/g的使用,以及Linux项目自动化构建工具。 目录 Linux软件包管理器--yum yum是什么 yum相关操作 yum本地配置 Linux编…

蓝桥杯-循环节长度

两个整数做除法,有时会产生循环小数,其循环部分称为: 循环节。比如,11/136>0.8461553846153..... 其循环节为[846153] 共有 6 位。下面的方法,可以求出循环节的长度。请仔细阅读代码,并填写划线部分缺少的代码。 注…

redis—Zset有序集合

目录 前言 1.常见命令 2.使用场景 3.渐进式遍历 4.数据库管理 前言 有序集合相对于字符串、列表、哈希、集合来说会有一-些陌生。它保留了集合不能有重复成员的 特点,但与集合不同的是,有序集合中的每个元素都有-个唯- -的浮 点类型的分数(score) …

20240126收获

el-table比较常见的需要跳转column的场景,目前遇到三种,一种是前面列变成序号,用的是typeindex和:index来设置索引,第二种是变成多选,用的是typeselect和在table上加上select-change事件,第三种…

故障脚本的重要作用:预防、诊断与恢复

故障脚本是在信息技术和计算机领域中广泛使用的一种自动化工具,它们的主要目的是预测、诊断和修复系统或软件中的故障。这些脚本在现代技术环境中扮演着至关重要的角色,本文将介绍故障脚本的主要作用。 一、预防性作用 监控和预警 故障脚本可以用于监控系…

web应用课——(第一讲:html基础标签)

目录 一、html文件结构 二、文本标签 三、图片 四、音频和视频 五、超链接 六、表单 七、列表 八、表格 九、语义标签 十、特殊符号 一、html文件结构 <html>标签&#xff1a;表示一个 HTML 文档的根&#xff08;顶级元素&#xff09;&#xff0c;所以它也被…

vue3-hand-mobile

当我写完手势移动事件后&#xff0c;我又通过svg的方法添加了一段文字和polygon。当我在这个蓝色的polygon上滑动手势的时候&#xff0c;会报错。 可能这个bug只是我个人的代码导致的。但是我觉得vue3-hand-mobile插件的这一段代码写的有问题。 我通过circular-json库修复了这…

在Windows中如何格式化硬盘?这里提供了详细的步骤

格式化硬盘意味着擦除硬盘上的任何信息和设置文件系统,以便操作系统可以从硬盘读取数据并将数据写入硬盘。如果你计划在Windows中使用硬盘,则需要格式化硬盘。 如何在Windows中格式化硬盘 按照以下简单步骤在Windows 11,Windows 10,Windows 8,Windows 7,Windows Vista或…

3d模型上的材质怎么删除---模大狮模型网

在大多数3D软件中&#xff0c;可以通过以下步骤来删除3D模型上的材质&#xff1a; 选择要删除材质的模型&#xff1a;首先&#xff0c;从场景中选择包含目标材质的模型。可以使用选择工具或按名称查找模型。 进入编辑模式&#xff1a;将模型切换到编辑模式。这通常需要选择相应…

私有化部署pdf工具箱

功能简介 用于合并/拆分/旋转/移动PDF及其页面的完全交互式GUI。 将多个 PDF 合并到一个生成的文件中。 将 PDF 拆分为多个文件&#xff0c;并按指定的页码或将所有页面提取为单个文件。 将 PDF 页面重新组织为不同的顺序。 以 90 度为增量旋转 PDF。 删除页面。 多页布局…

专业143总分420+复旦大学957信号与系统考研经验电子信息与通信工程

本人本科排名中流211院校报考复旦。今年考研成绩出来&#xff0c;专业课143&#xff0c;符合自己预估&#xff0c;数学有点拉胯&#xff0c;英语有点超预期&#xff0c;政治正常&#xff0c;总分420&#xff0c;顺利考上复旦大学电子信息&#xff0c;以下总结一些自己去年的复习…

张维迎《博弈与社会》纳什均衡与囚徒困境博弈(3)理性共识的问题

理性人不选择坏战略 上一节&#xff0c;我们借助囚徒困境博弈阐述了什么是占优均衡。在囚徒困境中&#xff0c;无论别人采取什么行动&#xff0c;每一个参与人都有一个特定的最优选择&#xff08;占优战略&#xff09;。也就是说&#xff0c;一个理性的参与人在做决策时&#x…

腾讯云轻量应用Ubuntu服务器如何一键部署幻兽帕鲁Palworld私服?

幻兽帕鲁/Palworld是一款2024年Pocketpair开发的开放世界生存制作游戏&#xff0c;在帕鲁的世界&#xff0c;玩家可以选择与神奇的生物“帕鲁”一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。而帕鲁可以进行战斗、繁殖、协助玩家做农活&#xff0c;也…

SAC(Soft Actor-Critic)理论与代码解释

标题 理论序言基础Q值与V值算法区别 SAC概念Q函数与V函数最大化熵强化学习&#xff08;Maximum Entropy Reinforcement Learning, MERL&#xff09;算法流程1个actor&#xff0c;4个Q Critic1个actor&#xff0c;2个V Critic&#xff0c;2个Q Critic 代码详解Actor网络理论中的…

Opencv——霍夫变换

霍夫直线变换 霍夫直线变换(Hough Line Transform)用来做直线检测 为了加升大家对霍夫直线的理解,我在左图左上角大了一个点,然后在右图中绘制出来经过这点可能的所有直线 绘制经过某点的所有直线的示例代码如下,这个代码可以直接拷贝运行 import cv2 as cv import matplot…