我创建了一个简单的pin工具,可以转储任何win32 CreateFileW调用.它工作正常,但当我尝试将它附加到已经运行的进程时,该过程只是终止.尝试了几个应用程序(记事本,wordpad,Internet Explorer),相同的结果.这是我使用的命令:
.\pin -pid 8804 -t dumpfile.dll
Run Code Online (Sandbox Code Playgroud)
我有一个提示尝试关闭多线程,如下所示:
.\pin -mt 0 -pid 8804 -t dumpfile.dll
Run Code Online (Sandbox Code Playgroud)
但它没有帮助.还尝试了另一个,开箱即用的pintool,也没有工作,所以问题不在我的pintool.有任何想法吗?
提前致谢!
我制作了一个 pin 工具来转储 CreatFile win32 调用(在我的例子中为 CreateFileW)及其返回值。它看起来像这样:
/* ... */
VOID Image(IMG img, VOID *v)
{
RTN cfwRtn = RTN_FindByName(img, "CreateFileW");
if (RTN_Valid(cfwRtn))
{
RTN_Open(cfwRtn);
RTN_InsertCall(cfwRtn, IPOINT_BEFORE, (AFUNPTR)CreateFileWArg,
IARG_ADDRINT, "CreateFileW",
IARG_FUNCARG_ENTRYPOINT_VALUE, 0,
IARG_END);
RTN_InsertCall(cfwRtn, IPOINT_AFTER, (AFUNPTR)CreateFileWafter,
IARG_FUNCRET_EXITPOINT_VALUE, IARG_END);
RTN_Close(cfwRtn);
}
}
/* ... */
VOID CreateFileWArg(CHAR * name, wchar_t * filename)
{
TraceFile << name << "(" << filename << ")" << endl;
}
VOID CreateFileWafter(ADDRINT ret)
{
TraceFile << "\tReturned handle: " << ret << endl;
}
Run Code Online (Sandbox Code Playgroud)
它给出了有趣的结果。例如,在一个只打开现有文件而不执行其他操作的小程序上,它给出:
CreateFileW(file.txt) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Pin编写函数调用跟踪器.它可以打印每个函数调用以及每个参数的值.
困难在于获得函数的所有参数.使用RTN_InsertCall,您可以将函数参数传递给检测代码:
intel pin RTN_InsertCall多个函数参数
但是,您需要知道当前例程的参数数量.有没有办法做到这一点?
谢谢!
我相对较不熟悉使用英特尔Pin工具进行代码检测,并且正在尝试研究分支预测。具体来说,我想生成所有分支的列表,它们的分支目标以及是否采用它们。我知道SimpleExamples中有用于生成内存地址跟踪的pintool,例如“ pinatrace.cpp”工具,但是我看不到任何适合列出分支的需求的工具。
我可以在示例中使用的某个地方存在现有的pintool,还是需要编写一个新的pintool?
我在Linux计算机上使用pin-2.14。
谢谢!
我对 Intel Pin 与 C++14 或其他 C++ 版本的使用有一些疑问。
我正在构建一个动态调用图 pin 工具。为了便于理解,我正在计算调用堆栈的深度。为了安全起见,我决定用std::mutex. 这让我遇到了std::mutex自 C++11 以来才可用的问题,这不是我机器中的 Intel Pin 默认值。
$ g++ -v
[...]
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2)
Run Code Online (Sandbox Code Playgroud)
编译命令:
$ make obj-intel64/callgraph.so
[...]
error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled …Run Code Online (Sandbox Code Playgroud) 我写了这个pintool:
#include "pin.H"
#include <iostream>
#include <fstream>
VOID Instruction(INS ins, VOID *v)
{
cout << INS_Disassemble(ins) << endl;
}
VOID Fini(INT32 code, VOID *v)
{
cout << "Fin" << endl;
}
int main(int argc, char *argv[])
{
if( PIN_Init(argc,argv) )
{
cout << "Erreur PIN_Init" << endl;
return 0;
}
INS_AddInstrumentFunction(Instruction, 0);
PIN_AddFiniFunction(Fini, 0);
PIN_StartProgram();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在打印所有说明。我现在要做的是显示指令地址(EIP)
我怎样才能做到这一点 ?
谢谢
Pin中有四个粒度级别:例程、指令和图像、跟踪。我可以指定一个限制/区域来开始和停止插入检测代码。可以通过类似指令(#start instrumentation,#end instrumentation)或类似的东西,
一个例子:
for( int i=0; i< x; i++)
{
#startInstrumentation
for( ....;.....;.....)
{
// some code
// function call, conditions , loops, ....
}
#endInstrumentation
}
有没有办法做到这一点?
正如标题所述,我正在寻找一种方法来编译我的具有某些依赖项的 PIN 工具。例如,如果我#include "somefile.h"在我的 PIN 工具中生成一些目标文件g++ -c somefile.cpp,我如何链接我的目标文件以使用我的 PIN 工具进行编译,以便我可以在我的 PIN 工具中使用它的功能?
我是Intel pin tool的新手,最近开始研究pin tool。在教程中,它描述了 pin 工具的模式:
但是,有时查看与跟踪不同的粒度会很有用。为此,Pin 提供了两种附加模式:图像和常规仪器。这些模式是通过“缓存”检测请求来实现的,因此会产生空间开销,这些模式也称为提前检测。
我想知道“形象”是什么意思。
谢谢你。