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

news2024/11/23 15:35:31

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=None
    for feiK_str in funcEnterIdSeqK.split("#"):
        if feiK_str == '': 
            continue
        
        feiK=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=None
    for feiK_str in funcEnterIdSeqK.split("#"):
        if feiK_str == '': 
            continue
        
        feiK=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:
        break
    if 时长边界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.coloradmin.cn/o/1190301.html

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

相关文章

linux如何实现免密登录

shigen日更文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 十一月是比较特殊的月份&#xff0c;因为很多云资源都是在这个时候过期&#xff0c;包括我自己买的云服务器。作…

安装pr提示VCRUNTIME140.dll丢失的修复方法,3个有效的方法

在学习和工作中&#xff0c;我们经常需要使用到PR和PS。然而&#xff0c;在安装这些软件时&#xff0c;有时会遇到一些错误提示&#xff0c;其中之一就是“VCRUNTIME140.dll丢失”&#xff0c;无法运行启动软件程序。那么&#xff0c;如何解决VCRUNTIME140.dll丢失的问题呢&…

无人机航迹规划:七种智能优化算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划--提供MATLAB代码

一、七种算法&#xff08;DBO、LO、SWO、COA、LSO、KOA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…

栈的顺序存储实现(C语言)(数据结构与算法)

栈的顺序存储实现通常使用数组来完成。实现方法包括定义一个固定大小的数组&#xff0c;以及一个指向栈顶的指针。当元素入栈时&#xff0c;指针加一并将元素存储在相应位置&#xff1b;当元素出栈时&#xff0c;指针减一并返回相应位置的元素。 1. 顺序栈定义 #define MaxSi…

C++ 之多态(一)

什么是虚函数 在类的定义中&#xff0c;前面有 virtual 关键字的成员函数称为虚函数&#xff1b;virtual 关键字只用在类定义里的函数声明中&#xff0c;写函数体时不用。 class Base {virtual int Fun() ; // 虚函数 };int Base::Fun() // virtual 字段不用在函数体时定义 …

python- os模块

一、文件与目录相关的操作 1、删除文件/文件夹 2、os.stat("path/filename"): 获取文件/目录信息的结构说明 3、os.listdir 和 os.path.join 在Python中&#xff0c;os.listdir()和os.path.join()是操作系统模块&#xff08;os模块&#xff09;的两个函数&#x…

运维相关(一) - Vue项目配置WebSocket连接{ws、wss 连接方式}

Vue项目配置WebSocket连接 ws、wss 两种方式 1. 写作背景2. 晒出代码2.1 前端 vue.config.js 的代码2.2 Vue项目路由配置代码3.3 服务器Nginx配置 3. 使用方式3.1 前端代码3.2 后端代码 4. 测试使用 1. 写作背景 项目使用的是ruoyi的前后端分离框架项目需要使用到 websocket , …

上市公司-赫芬达尔指数(2000-2022年)(数据+2种结果)

上市公司-赫芬达尔指数&#xff08;HHI&#xff09;可衡量一个公司在市场中的相对份额或集中度。它是由每家公司在市场中份额的平方和得到的。指数值越高&#xff0c;表示该市场或行业的集中度越高&#xff0c;竞争可能相对较小&#xff1b;而指数值越低&#xff0c;则意味着该…

如何让群晖Audio Station公开共享的本地音频公网可访问?

文章目录 1. 本教程使用环境&#xff1a;2. 制作音频分享链接3. 制作永久固定音频分享链接&#xff1a; 之前文章我详细介绍了如何在公网环境下使用pc和移动端访问群晖Audio Station&#xff1a; 公网访问群晖audiostation听歌 - cpolar 极点云 群晖套件不仅能读写本地文件&a…

公众号开发实践:用PHP实现通过接口自定义微信公众号菜单

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

Apache DolphinScheduler如何完全设置东八区?

默认情况 为了兼容全世界不同时区&#xff0c;Apache DolphinScheduler 使用的是 UTC 0 时区&#xff0c;包括保存到数据库表中的数据时区&#xff0c;以及展示到页面上的时区。 如果我们想在页面上看到东八区时间&#xff0c;则需要在页面上手动选择上海时区&#xff0c;如下…

小程序订单中心path设置本次审核不通过,审核原因:小程序尚未发布,无法审核。

小程序尚未发布&#xff0c;无法审核。 先按照这篇文章把小程序审核通过&#xff0c;小程序版本审核未通过&#xff0c;需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path&#xff0c;请设置后再提交代码审核 小程序审核通过后&#xff0c;发布…

2023.11.09 homework

4年级数学&#xff1a;不会做就作图&#xff0c;画出来&#xff0c;简单化就容易懂 2023.11.09 homework &#xff08;2&#xff09;-CSDN博客

MySQL代码子查询续集

dept表&#xff1a; emp表&#xff1a; -- 查询每个部门的信息(包括&#xff1a;部门名&#xff0c;编号&#xff0c;地址)和人员数量 -- 1.将两张表结合起来&#xff0c;筛选出部门名&#xff0c;编号&#xff0c;地址 tips: 表.* 表示将该表所有列都显示出来&#xff…

基于SpringBoot+Vue的婚恋相亲交友系统

基于SpringBootVue的婚恋相亲交友系统~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 管理员界面 摘要 基于SpringBootVue的婚恋相亲交友系统是一个现代化的、高效的交…

【算法设计】回溯法算法设计——骑士游历问题(C++实现)

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法分析与设计知识专栏&#xff1a;算法分析&#x1f525; 给大家跳…

【19】c++11新特性 —>线程异步

什么是异步&#xff1f; async的两种方式 //方式1 async( Function&& f, Args&&... args ); //方式2 async( std::launch policy, Function&& f, Args&&... args );函数参数&#xff1a; f:任务函数 Args:传递给f的参数 policy:可调用对象f的…

小解List的使用【C++】

小解List的使用【C】 一. List1.1. 与vector的不同1.2 与vector的使用不同1.2.1 迭代器失效1.2.2. insert1.2.3 erase1.2.4 sort1.3. 其他接口 补充迭代器容器与迭代器的关系迭代器的类型 一. List 学习了STL&#xff0c;也已经到了List的内容 因为List与string以及vector比起…

【Kurbernetes资源管理】陈述式资源管理方式

陈述式 一、 理论部分1.1 管理K8s资源的基本方法1.1.1 陈述式资源管理方式1.1.2声明式资源管理方式1.1.3 GUI式资源管理方法 1.2 陈述式资源管理方式1.2.1 Kubelet工具简介1.2.2 kubectl 的基本语法1.2.3 Kubectl工具的自动补全功能 1.3 Kubernetes Service1.4 Service 的类型(…