这次来介绍一下pin的基本使用方法,我也是仅仅接触这个工具几天,也许对它的了解还不够深入,所以就把我知道的写出来,大家一起学习进步
Pin的source\tools里面有许多的文件夹,我们可以通过文件夹的名字来大致猜测出它的作用,首先可以找到一个MannualExamples的文件夹,进入,可以看到一堆的cpp文件,还有一个obj-ia32的文件夹(如果是64位的电脑应该是obj-intel64,功能都是一样的)。这个文件夹就应该是存放当前文件中已经编译好的pintools工具,pin主要是利用.dll文件来对二进制代码进行动态追踪,因此我们主要用到的都是这样的.dll文件
如下图:
此时输入pin -help
就会出现它的帮助文档信息,pin的基本用法格式为:
那么下面的就是它的option的选项说明了。
我们暂时先不考虑这些,先使用最简单的。
我在主目录下新建了一个test文件 ,用来进行一些小测试。
那我们先看看ManualExamples文件夹里面的那些工具具体是什么含义
上次用了inscount0.dll我们可以通过打开它的cpp文件来查看它的源代码
可以看到这样的注释:
// The running count of instructions is kept here
// make it static to help the compiler optimize docount
这样我们就可以猜测这个工具主要就是计算程序运行的指令数目
接着看源代码:
看到KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool",
"o", "inscount.out", "specify output file name");
这就说明这个文件把获取到的信息输出到了一个文件中,那么就可以通过在命令中加上-o output 这样来选择输出的文件,不过并不是对所有的工具添加这句命令都有用,因为有的工具的源代码中并没有将捕捉到的信息输出到文件中,不过既然有了源代码,那么一切都是有可可能的,我们可以参照inscount0.cpp这个文件中的代码形式来修改其他的cpp文件,再重新编译来获得具有新功能的工具。
说到这里,想必大家也对这个pin的基本使用有了一定的了解把。它不仅提供了许多的工具来供我们自己选择使用,并且还允许用户自定义工具。但是前提就是我们自己能写出工具的cpp文件,那么剩下的就是编译这个工具。在一开始,我联想到了曾经使用过的,都是使用VS2010编译器来生成.dll文件,但是在这里面我们可以发现一个Nmakefile文件。这个文件就是我们接下来要注意的东西了。
首先我们用UE打开它,以ManualExamples中的Nmakefile文件为例:
代码不多,我就直接粘过来了
######################################################################################
# This is the NMAKE file for building and testing PIN toos contained in one of the
# subdirectories of the PinTool project or PIN kit.
#
# For description of targets and options, see Nmakefile in the root directory.
######################################################################################
!if "$(PIN_HOME)"==""
PIN_HOME=..
!endif
# Define tools to be buit and tested
######################################################################################
COMMON_TOOLS= inscount0.dll inscount1.dll inscount2.dll proccount.dll imageload.dll \
staticcount.dll detach.dll pinatrace.dll itrace.dll isampling.dll
# Include building and testing rules from the root Nmakefile.
######################################################################################
INCLUDE_SUB_RULES=1
!INCLUDE $(PIN_HOME)\Nmakefile
最上面解释了它的功能,就是编译cpp文件,生成.dll文件,需要更详细的了解它,可以查看根目录下的Nmakefile文件,那里解释的更详细一些。
注意到这句话: Define tools to be buit and tested
下面接着就是COMMON——TOOLS=。。。。了,仔细观察发现的话,我们会注意到这些.dll文件不正式那个obj-ia32文件夹里面的那些吗。因此我有了下面的猜想:
这个脚本文件就是来编译cpp文件的,通过修改这里面的编译信息,可以将自己的cpp文件进行编译生成.dll文件,那么我做了下面的实验
进入目录
cd source\tools\MyPintool
dir
发现里面有一个MyPinTool,cpp文件,但是没有Nmakefile文件,怎么办,没关系,COPY一个过来。用UE打开,修改下COMMOM_TOOLS后面的内容:
这里有一点要注意的就是,如果这后面的工具很多,一行显示不了,那么在换行的时候在末尾加上‘\’。
保存好。
在这个目录下运行下面命令:
即..\nmake tools
那么就会执行当前的Nmakefile文件,对cpp文件进行编译。
这时再看看当前目录的内容就会发现多了一个obj-ia32的文件夹,进去看看发现有4个文件:
我们来测试下这个工具,看看是干嘛的。
我进入自己的测试文件夹test:
运行:
pin -t source\tools\MyPinTool\obj-ia32\MyPinTool.dll -o myPinTool.out -- hello
如:
再看看生成的myPinTool.out文件
可以直接查看type myPinTool.out
也可以用UE查看
这样就显示结果了
从这数据我认为这个工具的功能是显示该二进制文件的指令条数,基本模块个数,以及线程个数
好了,基本的从一个cpp文件生成.dll文件并且使用这个pintools的基本流程我们已经了解了。接下来就是试试每个工具,看看有什么其他发现!