在程序设计和优化过程中,我们通常希望能有工具帮助我们分析热点代码、覆盖率、内存泄露等这些特性,对多线程程序还希望能分析并发性、竞争和死锁等等。但这些特征通常在静态编译时很难获取,而且往往只能在运行时才能确定。Pin是intel开发的动态插桩工具,它提供一套API让我们开发和定制自己的性能分析工具,此外它还被广泛用在体系结构研究、安全等领域。目前intel parallel studio的很多特性便是基于pin开发而成。

Pin的工作机制

目前对程序进行剖析(profiling),主要有二种方法:统计硬件计数器和插桩。Pin采用了插装技术,在程序的执行过程中动态插入分析代码。下面的代码片段演示了插装的过程,假设我们要统计程序执行的指令数,可以在程序每执行一条指令时,插入一条count++语句,当程序执行完时,count的值就是程序执行的指令数。

count++ sub $0xff, %edx count++ cmp %esi, %edx count++ jle <L1> count++ mov $0x1, %edi count++ add $0x10, %eax

Pin是采用动态编译技术实现动态插装,将分析代码和被分析程序动态编译后放置到代码缓存,然后由cpu动态执行代码缓存里的代码。

利用pin统计程序执行的指令数

#include <iostream> #include <fstream> #include "pin.H" // The running count of instructions is kept here // make it static to help the compiler optimize docount static UINT64 icount = 0; // This function is called before every instruction is executed VOID docount() { icount++; } // Pin calls this function every time a new instruction is encountered VOID Instruction(INS ins, VOID *v) { // Insert a call to docount before every instruction, no arguments are passed INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_END); } KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool", "o", "inscount.out", "specify output file name"); // This function is called when the application exits VOID Fini(INT32 code, VOID *v) { // Write to a file since cout and cerr maybe closed by the application ofstream OutFile; OutFile.open(KnobOutputFile.Value().c_str()); OutFile.setf(ios::showbase); OutFile << "Count " << icount << endl; OutFile.close(); } // argc, argv are the entire command line, including pin -t <toolname> -- ... int main(int argc, char * argv[]) { // Initialize pin PIN_Init(argc, argv); // Register Instruction to be called to instrument instructions INS_AddInstrumentFunction(Instruction, 0); // Register Fini to be called when the application exits PIN_AddFiniFunction(Fini, 0); // Start the program, never returns PIN_StartProgram(); return 0; }

注释比较详细,很容易看懂

Pin主页:http://www.pintool.org

转载于:https://www.cnblogs.com/weiffun/archive/2009/06/29/3302401.html

利用Pin分析程序的动态行为特征相关推荐

  1. 利用LDA分析《天龙八部》中每十回的话题演变情况

    利用LDA分析<天龙八部>中每十回的话题演变情况 一.LDA主题分配模型简介 1.1 LDA是什么 在机器学习领域LDA是两种模型的简称,一种是统计学中的线性判别分析(Linear Dis ...

  2. 2022年数维杯国际大学生数学建模挑战赛C题如何利用大脑结构特征和认知行为特征诊断阿尔茨海默病解题过程

    2022年数维杯国际大学生数学建模挑战赛 C题 如何利用大脑结构特征和认知行为特征诊断阿尔茨海默病 原题再现:   阿尔茨海默病(AD)是一种起病隐匿的进行性神经退行性疾病.临床特征为全谱痴呆,包括记 ...

  3. 利用预测分析改进欠款催收策略,控制欺诈风险和信贷风险

    前提摘要 在数字经济新时代,金融服务主管正在寻求方法去细分他们的产品和市场,保持与客户的联系,寻找能够推动增长和收入的新市场,并利用可以增加优势和降低风险的新技术. 在拥有了众多可用数据之后,金融机构 ...

  4. 小程序在wxml里转数字_2020年利用名片小程序开启数字化营销的方法

    数字营销是什么意思?所谓数字营销,就是指借助于互联网.电脑通信技术和数字交互式媒体来实现营销目标的一种营销方式.数字营销将尽可能地利用先进的计算机网络技术,以更有效.省钱地谋求新的市场的开拓和新的消费 ...

  5. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)...

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

  6. python解zuobiaoxi方程_滑坡稳定性分析程序初探---Python版!

    0 前言 山体滑坡是常见的自然灾害,从理论分析的角度讲,滑坡的稳定性分析方法源自于高中物理学,如图1所示.前者的滑动分析非常简单,在已知滑块的重量以及接触面摩擦系数的基础上通过计算下滑力和抗滑力的关系 ...

  7. 转载文章:Microsoft 将僵尸网络威胁智能分析程序引入云中以提供近实时数据

    Microsoft 数字犯罪部门打击网络犯罪的首要任务是保护用户.我们深知,清理世界各地感染恶意软件的用户计算机与打破威胁同等重要,因此我们在 2010 年推出了Project MARS (Micro ...

  8. 利用Python分析航空公司客户价值

      利用Python分析航空公司客户价值 一.背景介绍 随着社会生活中数据量的急剧增多,如何从这些海量的数据中提取与发掘出对我们决策有用的信息成为当前亟待解决的题,因此,数据分析与挖掘技术在这些年得到 ...

  9. 利用水文分析方法提取山脊、山谷线

    1.背景 作为地形特征线的山音线.山谷线对地形.地貌具有一定的控制作用.它们与山顶点.谷底点以及鞍部点等一起构成了地形起伏变化的骨架结构.同时由于山登线具有分水性,山谷线具有合水性特征,使得它们在地形 ...

最新文章

  1. 我的Dll(动态链接库)学习笔记
  2. C++ with STL(二)map
  3. GridView:根据单元格的值给单元格着色
  4. shell getopts
  5. C语言——第六周作业
  6. 同时遍历多个dataframe_Java面试-容器的遍历
  7. 从一个C程序学“逐步求精”的分析方法
  8. 如何找到某个 ABAP structure 某字段的源头来自哪个数据库表
  9. python ftplib模块_python:ftplib模块
  10. python opencv3 检测人
  11. Spring Data JPA 从入门到精通~Specification工作中的一些扩展
  12. html静态网页模板_aspnetcore 实现简单的伪静态化
  13. 什么是python元祖_Python学习之元组
  14. rpcbind 、nfs无法启动问题
  15. 龙帝国与避风港最新网址
  16. 百度地图api的实现
  17. 正点原子 fac_us=SystemCoreClock/8000000
  18. 解决问题:RuntimeError: the sip module implements API v11.0 to v11.2 but the module requires API v12.0
  19. 移动端某些网络下域名无法解析的DNS问题
  20. 人脸识别技术入驻了哪些行业

热门文章

  1. 滴滴 Web 移动端组件库 cube-ui 开源
  2. 使用crontab定时备份mysql
  3. 30岁的我们还能做什么?
  4. 《Microsoft Sql server 2008 Internals》读书笔记--第五章Table(6)
  5. 杜拉拉升职记(1和2)
  6. Twitter开源软件项目列表
  7. java 获取bean的注解_如何获取spring 注解的bean
  8. python语言中、外部模块先导入、再使用_python引入导入自定义模块和外部文件--转载Sumomo的博客...
  9. form表单会跨域_我的Vue不小心跨域了o()o 干它
  10. 小程序正式发布后,打开白屏(已解决)