tick_plot__compile.ipynb
clang plug-in instrumentation of llvm source code and analysis of function call logs (1)
Analysis
In and out, chain, out
df in and out=df[ df['tickKind'].isin( [FuncEnter,FuncReturn] ) ] #In the code, only when the function enters, the chain length is calculated and written to the disk dfin=df[ df['tickKind'].isin( [FuncEnter] ) ] df chain=df in # Function local duration application counter value when exiting dfout=df[ df['tickKind'].isin( [FuncReturn] ) ]
Look up funcId dictionary from funcEnterId
fei2fi = df chain.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 chain.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')])
Construction field funcIdSeq
#Use the dictionary fei2fi to convert the input funcEnterIdSeqK into funcIdSeqK def funcEnterIdSeq2funcIdSeq(funcEnterIdSeqK:str): fis=[] fiK=None for feiK_str in funcEnterIdSeqK.split("#"): if feiK_str == '': continue feiK=int(feiK_str) # feiK must be in digital format, if not, an error will be reported fiK=fei2fi[feiK] # feiK must be in the dictionary fei2fi, if not, an error will be reported fis.append(fiK) fiKStr_ls= [ f'{<!-- -->fiK}' for fiK in fis] return '#'.join(fiKStr_ls)
#Use the dictionary fei2fn to convert the input funcEnterIdSeqK into funcNameSeqK def funcEnterIdSeq2funcNameSeq(funcEnterIdSeqK:str): fns=[] fnK=None for feiK_str in funcEnterIdSeqK.split("#"): if feiK_str == '': continue feiK=int(feiK_str) # feiK must be in digital format, if not, an error will be reported fnK=fei2fn[feiK] # feiK must be in the dictionary fei2fi, if not, an error will be reported fns.append(fnK) return '#'.join(fns)
#Test function funcEnterIdSeq2funcIdSeq # funcEnterIdSeqK="#3#2#1#" # funcEnterIdSeq2funcIdSeq(funcEnterIdSeqK),funcEnterIdSeq2funcNameSeq(funcEnterIdSeqK)
df in and out ['funcIdSeq']=df in and out ['funcEnterIdSeq'] .apply(lambda feisJ: funcEnterIdSeq2funcIdSeq(feisJ) ) dfin['funcIdSeq']=dfin['funcEnterIdSeq'] .apply(lambda feisJ: funcEnterIdSeq2funcIdSeq(feisJ) ) df chain=df in dfout['funcIdSeq']=dfout['funcEnterIdSeq'] .apply(lambda feisJ: funcEnterIdSeq2funcIdSeq(feisJ) )
df in and out ['funcNameSeq']=df in and out ['funcEnterIdSeq'] .apply(lambda feisJ: funcEnterIdSeq2funcNameSeq(feisJ) ) dfIn['funcNameSeq']=dfIn['funcEnterIdSeq'] .apply(lambda feisJ: funcEnterIdSeq2funcNameSeq(feisJ) ) df chain=df in dfout['funcNameSeq']=dfout['funcEnterIdSeq'] .apply(lambda feisJ: funcEnterIdSeq2funcNameSeq(feisJ) )
View
df in and out.shape, df chain.shape, df out.shape #((666718, 26), (333359, 26), (333359, 26))
df in and out.head(5)
View 2
Function local duration grouping = dfout.groupby('funcLocalClock').size().reset_index(name='The number of outgoing durations') Function local duration grouping_descending order = Function local duration grouping.sort_values(by='The number of outputs of this duration', ascending=False) Function local duration group_descending.head(5)
3.4B Duration Boundary_Time On-Chain Variation
df=dfout When top = df out ['funcLocalClock'].max() Time bottom=dfout['funcLocalClock'].min() print("Top of time, bottom of time", top of time, bottom of time) Duration boundary_time chain anomaly_pairs=[] for duration boundary k in range (time bottom, time top): Time upper function = df time [ df time ['funcLocalClock'].ge (duration boundary k) ] .funcId.unique() Time chain = df chain [ df chain ['funcId'].isin( time chain) ] Time chaining odd number = len(time chaining.funcIdSeq.unique()) #funcEnterIdSeq changed to funcIdSeq Duration boundary_time-on-chain anomaly_pairs.append((duration boundary k, time-on-chain anomaly)) If the on-chain odd number <=1: break if duration boundary k % 800 == 0: print(f"Duration boundary k, time-on-chain exception: {<!-- -->Duration boundary k}, {<!-- -->time-on-chain exception}")
3.4 Calculate function IDs with short local duration
Long and short function call chain lists
['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 cannot copy so many lines '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 Drawing