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=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 作图

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

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
clang llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz是一个编译器工具集合的压缩文件。这个工具集合由ClangLLVM组成,适用于在Linux系统上进行编译和开发。此处压缩文件的扩展名为.tar.xz,表明它使用tar命令进行打包,并使用xz算法进行压缩。它提供了x86_64架构的二进制文件,可以在基于Ubuntu 16.04的Linux操作系统上运行。 Clang是一个开的C语言家族编译器,支持C、C++、Objective-C和Objective-C++等语言,它以其高度模块化的设计、优秀的诊断功能和快速的编译速度而闻名。LLVM是一个低级虚拟机( Low Level Virtual Machine)工具链,提供了C、C++等语言的编译器基础设施,如编译器前端、汇编器、优化器和链接器等。ClangLLVM通常一起使用,可以为开发者提供强大而高效的编译工具。 这个压缩文件适用于Ubuntu 16.04操作系统,其x86_64架构表示支持64位的x86计算机。当我们解压缩这个文件时,可以得到ClangLLVM的执行文件,可以通过命令行或其他集成开发环境进行调用和使用。它可以用于编译C、C++、Objective-C和Objective-C++等语言的代码,并生成可执行文件或库。这个工具集合还提供了各种调试和优化选项,以及丰富的编程接口,使开发者能够更好地进行代码的分析和优化。 总而言之,clang llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz是一个包含ClangLLVM工具集的压缩文件,用于在Ubuntu 16.04操作系统上进行C、C++、Objective-C和Objective-C++等语言的编译和开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ziix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值