clang插件对llvm源码插桩,分析函数调用日志(2)--google镜像

tick_plot__compile.ipynb
clang插件对llvm源码插桩,分析函数调用日志(1)

分析

进出、链、出

df进出=df[  df['tickKind'].isin( [FuncEnter,FuncReturn] )  ]#代码中,只有在函数进入时,计算了链条长度 并写磁盘
df入=df[  df['tickKind'].isin( [FuncEnter] )  ]
df链=df入# 函数本地时长 应 用  出时的计数器的值 
df出=df[  df['tickKind'].isin( [FuncReturn] )  ]

从funcEnterId查funcId的字典

fei2fi = df链.set_index('funcEnterId')['funcId'].to_dict()
type(fei2fi), list(fei2fi.items())[0:10] 
(dict,[(0, 725),(1, 576),(2, 355),(3, 2237),(4, 165),(5, 355),(6, 2237),(7, 165),(8, 355),(9, 2237)])
fei2fn = df链.set_index('funcEnterId')['funcName'].to_dict()
type(fei2fn), list(fei2fn.items())[0:10] 
(dict,[(0, 'llvm::cl::getGeneralCategory'),(1, 'llvm::cl::OptionCategory::registerCategory'),(2, 'llvm::ManagedStaticBase::RegisterManagedStatic'),(3, 'llvm::llvm_is_multithreaded'),(4, 'getManagedStaticMutex'),(5, 'llvm::ManagedStaticBase::RegisterManagedStatic'),(6, 'llvm::llvm_is_multithreaded'),(7, 'getManagedStaticMutex'),(8, 'llvm::ManagedStaticBase::RegisterManagedStatic'),(9, 'llvm::llvm_is_multithreaded')])

构造字段funcIdSeq

#利用字典fei2fi ,将输入 funcEnterIdSeqK 转为 funcIdSeqK
def funcEnterIdSeq2funcIdSeq(funcEnterIdSeqK:str):    fis=[]fiK=Nonefor feiK_str in funcEnterIdSeqK.split("#"):if feiK_str == '': continuefeiK=int(feiK_str) # feiK 必须是数字格式,如果不是 正好报错fiK=fei2fi[feiK] # feiK 必须在字典fei2fi中,如果不在 正好报错fis.append(fiK)fiKStr_ls=  [ f'{fiK}' for fiK in fis]return '#'.join(fiKStr_ls)
#利用字典fei2fn ,将输入 funcEnterIdSeqK 转为 funcNameSeqK
def funcEnterIdSeq2funcNameSeq(funcEnterIdSeqK:str):    fns=[]fnK=Nonefor feiK_str in funcEnterIdSeqK.split("#"):if feiK_str == '': continuefeiK=int(feiK_str) # feiK 必须是数字格式,如果不是 正好报错fnK=fei2fn[feiK] # feiK 必须在字典fei2fi中,如果不在 正好报错fns.append(fnK)return '#'.join(fns)
#测试函数funcEnterIdSeq2funcIdSeq
# funcEnterIdSeqK="#3#2#1#"
# funcEnterIdSeq2funcIdSeq(funcEnterIdSeqK),funcEnterIdSeq2funcNameSeq(funcEnterIdSeqK)
df进出['funcIdSeq']=df进出['funcEnterIdSeq'] .apply(lambda feisJ:  funcEnterIdSeq2funcIdSeq(feisJ) )df入['funcIdSeq']=df入['funcEnterIdSeq'] .apply(lambda feisJ:  funcEnterIdSeq2funcIdSeq(feisJ) )
df链=df入df出['funcIdSeq']=df出['funcEnterIdSeq'] .apply(lambda feisJ:  funcEnterIdSeq2funcIdSeq(feisJ) )
df进出['funcNameSeq']=df进出['funcEnterIdSeq'] .apply(lambda feisJ:  funcEnterIdSeq2funcNameSeq(feisJ) )df入['funcNameSeq']=df入['funcEnterIdSeq'] .apply(lambda feisJ:  funcEnterIdSeq2funcNameSeq(feisJ) )
df链=df入df出['funcNameSeq']=df出['funcEnterIdSeq'] .apply(lambda feisJ:  funcEnterIdSeq2funcNameSeq(feisJ) )

查看

df进出.shape,  df链.shape,  df出.shape
#((666718, 26), (333359, 26), (333359, 26))
df进出.head(5)

在这里插入图片描述

查看2

函数本地时长分组 = df出.groupby('funcLocalClock').size().reset_index(name='该时长的出数')函数本地时长分组_降序 = 函数本地时长分组.sort_values(by='该时长的出数', ascending=False)
函数本地时长分组_降序.head(5)

在这里插入图片描述
在这里插入图片描述

3.4B 时长边界_时上链异数

 df时=df出时顶=df出['funcLocalClock'].max()
时底=df出['funcLocalClock'].min()
print("时顶,时底", 时顶,时底)时长边界_时上链异数_对们=[]
for 时长边界k in range(时底,时顶):时上函=df时[ df时['funcLocalClock'].ge(时长边界k)  ] .funcId.unique()时上链=df链[ df链['funcId'].isin( 时上函 ) ]时上链异数=len(时上链.funcIdSeq.unique())  #funcEnterIdSeq 改为 funcIdSeq时长边界_时上链异数_对们.append( (时长边界k,时上链异数)  )if 时上链异数 <=1:breakif 时长边界k % 800 == 0:print(f"时长边界k,时上链异数 :{时长边界k},{时上链异数}")

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4 计算 本地时长短的函数id们

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

长短函数调用链列表

['llvm::StringMapImpl::RehashTable','','llvm::StringMapImpl::RehashTable#llvm::PassRegistry::registerPass#LLVMInitializeX86Target','llvm::StringMapImpl::RehashTable#llvm::PassRegistry::registerPass#llvm::initializeGlobalISel#LLVMInitializeX86Target','llvm::StringMapImpl::RehashTable#llvm::PassRegistry::registerPass#llvm::initializeLazyBPIPassPass#llvm::initializeGlobalISel#LLVMInitializeX86Target','llvm::opt::OptTable::OptTable#clang::driver::getDriverOptTable#clang::driver::getDriverMode','llvm::StringMapImpl::RehashTable#llvm::opt::OptTable::OptTable#clang::driver::getDriverOptTable#clang::driver::getDriverMode','llvm::opt::OptTable::addValues#clang::driver::getDriverOptTable#clang::driver::getDriverMode','llvm::StringMapImpl::RehashTable#clang::driver::Driver::getToolChain#clang::driver::Driver::BuildCompilation',#csdn blog 复制不了那么多行'llvm::StringMapImpl::RehashTable#llvm::MCContext::createELFSectionImpl#llvm::MCContext::createELFRelSection#(anonymous namespace)::ELFWriter::createRelocationSection#(anonymous namespace)::ELFWriter::writeObject#llvm::MCAssembler::Finish#llvm::MCObjectStreamer::finishImpl#llvm::MCELFStreamer::finishImpl#llvm::MCStreamer::finish#llvm::AsmPrinter::doFinalization#llvm::FPPassManager::doFinalization#(anonymous namespace)::MPPassManager::runOnModule#(anonymous namespace)::EmitAssemblyHelper::RunCodegenPipeline#(anonymous namespace)::EmitAssemblyHelper::EmitAssembly#clang::EmitBackendOutput#clang::ParseAST#clang::ASTFrontendAction::ExecuteAction#clang::CodeGenAction::ExecuteAction#clang::FrontendAction::Execute#clang::CompilerInstance::ExecuteAction#cc1_main#ExecuteCC1Tool#llvm::CrashRecoveryContext::RunSafely#clang::driver::CC1Command::Execute#clang::driver::Compilation::ExecuteCommand#clang::driver::Compilation::ExecuteJobs#clang::driver::Driver::ExecuteCompilation','llvm::StringMapImpl::RehashTable#llvm::MCContext::createELFSectionImpl#llvm::MCContext::getELFSection#llvm::MCContext::getELFSection#(anonymous namespace)::ELFWriter::computeSymbolTable#(anonymous namespace)::ELFWriter::writeObject#llvm::MCAssembler::Finish#llvm::MCObjectStreamer::finishImpl#llvm::MCELFStreamer::finishImpl#llvm::MCStreamer::finish#llvm::AsmPrinter::doFinalization#llvm::FPPassManager::doFinalization#(anonymous namespace)::MPPassManager::runOnModule#(anonymous namespace)::EmitAssemblyHelper::RunCodegenPipeline#(anonymous namespace)::EmitAssemblyHelper::EmitAssembly#clang::EmitBackendOutput#clang::ParseAST#clang::ASTFrontendAction::ExecuteAction#clang::CodeGenAction::ExecuteAction#clang::FrontendAction::Execute#clang::CompilerInstance::ExecuteAction#cc1_main#ExecuteCC1Tool#llvm::CrashRecoveryContext::RunSafely#clang::driver::CC1Command::Execute#clang::driver::Compilation::ExecuteCommand#clang::driver::Compilation::ExecuteJobs#clang::driver::Driver::ExecuteCompilation']

在这里插入图片描述

4 作图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

SQL SERVER Inregration Services-OLE DB、Oracle和ODBC操作

OLE DB链接器 OLE DB插件下载&#xff1a;https://learn.microsoft.com/zh-cn/sql/connect/oledb/download-oledb-driver-for-sql-server?viewsql-server-ver16 配置OLE DB Connection Manager 在点击“新建”时&#xff0c;会弹出警告信息“不支持指定的提供程序&#xff0…

网页制作-引入icon

1.如何引入icon 1.1 进入https://www.iconfont.cn/ 1.2 登录或者注册一下 1.3 在搜索框输入你想搜索的内容 1.4 加入购物车 1.5 在购物车中点击下载代码 1.6 若是普通的html项目&#xff0c;则至需要将如下两个拷贝到你的项目中 1.7 在你需要的网页中引入iconfont.css就可以使…

程序设计:控制台输出二叉树 二叉树的形象显示

本文指导你编写一个输出到字符控制台的形象的二叉树展示。 目录 一般的Tree显示方式 理想的显示方式 实现方法 计算显示位置 输出数据 计算显示位置的代码 输出数据的代码 一般的Tree显示方式 编写二叉树算法时调试是很头疼的&#xff0c;如何显示成一目了然的树结构呢…

WordPress主题 JustNews主题6.0.1(亲测首页不空白)

介绍 资源入口 需要用WordPress5.X版本 JustNews介绍&#xff1a;一款专为博客、自媒体、资讯类的网站设计开发的WordPress主题&#xff0c;自v3.0版开始支持自主研发的前端用户中心&#xff0c;不仅支持注册、登录、账户设置、个人中心等常用页面的添加&#xff0c;还可以上传…

将一个Series序列保存为列表格式Series.to_list()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将Series中的所有值 保存为列表 series.to_list() [太阳]选择题 关于以下代码的说法中正确的是? import pandas as pd s pd.Series([1,2]) print("【显示】s") print(s) print(【执…

SpringBoot使用Mybatis

SpringBoot使用Mybatis Orm 框架的本质是简化编程中操作数据库的编码&#xff0c;发展到现在基本上就剩两家了&#xff0c;一个是宣称可以不用写一句 Sql 的 Hibernate&#xff0c;一个是可以灵活调试动态 Sql 的 Mybatis ,两者各有特点&#xff0c;在企业级系统开发中可以根…

xshell是什么软件,1000字让你完全了解xshell

很多从事开发或网络安全的人都或多或少知道xshell是什么软件&#xff0c;但是如果没有试用过的话可能对它的功能并不完全了解。今天小编就带你详细了解一下Xshell究竟是什么。 xshell是什么软件 一、xshell是什么软件 Xshell是一款功能强大的SSH&#xff08;Secure Shell&…

漏刻有时百度地图API实战开发(4)显示指定区域在移动端异常的解决方案

百度地图JavaScript API使用Boundary方法添加覆盖物显示省市某一区域的解决方案&#xff0c;具体参见&#xff1a;https://blog.csdn.net/weixin_41290949/article/details/105338685 Boundary 表示一个行政区域的边界 一般步骤 百度地图提供new BMap.Boundary()方法根据地区…

大语言模型(LLM)综述(六):大型语言模型的基准和评估

A Survey of Large Language Models 前言7 CAPACITY AND EVALUATION7.1 基本能力7.1.1 语言生成7.1.2 知识利用7.1.3 复杂推理 7.2 高级能力7.2.1 人类对齐7.2.2 与外部环境的交互7.2.3 工具操作 7.3 基准和评估方法7.3.1 综合评价基准7.3.2 评估方法 7.4 实证评估7.4.1 实验设…

51单片机+SIM800C(GSM模块)实现短信发送功能

一、前言 本项目利用51单片机和SIM800C GSM模块实现短信发送功能。短信作为一种广泛应用的通信方式&#xff0c;在许多领域具有重要的作用&#xff0c;如物联网、安防系统、远程监控等。通过将51单片机与SIM800C GSM模块相结合&#xff0c;可以实现在各种应用场景下的短信通信…

516TX 336A4940DNP516TX 具有用于联网工业以太网协议

516TX 336A4940DNP516TX 具有用于联网工业以太网协议 UPS系列旨在通过保护基于微处理器的设备免受破坏性脉冲和电源中断的影响&#xff0c;帮助企业减少生产损失并保持输出水平。 具有用于联网工业以太网协议(例如:以太网/IP)和离散(无源干触点继电器应用)的通信端口&#xf…

搭建 Makefile+OpenOCD+CMSIS-DAP+Vscode arm-none-eabi-gcc 工程模板

STM32F407-GCC-Template Arm-none-eabi-gcc MakefileOpenOCDCMSIS-DAPVscode工程模板 一、本次环境搭建所用的软硬件 1&#xff09;Windows or Linux (本文以Windows为主) 2&#xff09;JLink、Daplink、Wch-Link烧录器 3&#xff09;GNU Arm Embedded Toolchain交叉编译…

13.求面积[有问题]

#include<stdio.h> #include<math.h> #include<bits/stdc.h> using namespace std;void fun(double a,b,c) {double p,c;p (abc)/2;c sqrt(p*(p-a)*(p-b)*(p-c));printf("面积是&#xff1a;%lf",c); }int main(){double a,b,c;scanf("%lf,%…

【LearnOpenGL基础入门——2】搭建第一个OpenGL窗口

目录 一.配置GLFW 二.配置GLAD 三.第一个OpenGL窗口 3.1 GLFW设置 3.2 GLAD设置 3.3 视口 3.4 输入 3.5渲染 在我们画出出色的效果之前&#xff0c;首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而&#xff0c;这些操作在每个系统上都是不一样…

从TCP到Socket,彻底理解网络编程是怎么回事

进行程序开发的同学&#xff0c;无论Web前端开发、Web后端开发&#xff0c;还是搜索引擎和大数据&#xff0c;几乎所有的开发领域都会涉及到网络编程。比如我们进行Web服务端开发&#xff0c;除了Web协议本身依赖网络外&#xff0c;通常还需要连接数据库&#xff0c;而数据库连…

易点易动固定资产管理系统:定制流程与用量控制的高效管理利器

固定资产管理对于企业来说至关重要&#xff0c;而如何提高固定资产管理的效率和精确度一直是企业管理者关注的焦点。易点易动固定资产管理系统以其自定义固定资产流程和用量控制功能&#xff0c;成为了提升固定资产管理效率的利器。本文将详细介绍易点易动固定资产管理系统的自…

功能: 在web应用程序中、读取文件

通过使用文件 API&#xff0c;web 内容可以要求用户选择本地文件&#xff0c;然后读取这些文件的内容。这种选择可以通过使用 HTML <input type"file"> 元素或通过拖放来完成。 1.通过 click() 方法使用隐藏的文件 input 元素 你可以隐藏公认难看的文件 <…

Android MotionLayout

MotionLayout exends ConstraintLayout(动画框架 过渡) View动画 API1 属性动画API11 过渡动画API18 root.width RootViewWidth TransitionManager.beginDelayedTransition(view) 过渡动画 可以改变其大小和流畅性 Fade 可以改变透明度 通过TrasitinManager管理 Go:动态替…

Android Gldie复用只取之前decode过的缓存resource,Kotlin

Android Gldie复用只取之前decode过的缓存resource&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.life…

小程序开发平台源码系统 各种类型小程序任由选择 带完整的搭建教程

近年来随着微信、支付宝等平台对小程序的大力推广和支持下应运而生的。小程序作为一种轻量级的应用程序&#xff0c;为用户提供了无需下载安装、即用即走的便捷体验&#xff0c;因此得到了广大用户的喜爱和青睐。所以今天罗峰来给大家介绍一款小程序开发平台源码系统&#xff0…