我正在使用 Intel Pin 编写分析器。通过在每个例程之前和之后添加检测代码,工具配置文件在可执行文件中起作用。对于每个例程,我在Pin中添加回调,如下所示
RTN_InsertCall(routine, IPOINT_BEFORE, (AFUNPTR)BeforeCall,
IARG_UINT32, RTN_Id(routine),
IARG_THREAD_ID,
IARG_END);
RTN_InsertCall(routine, IPOINT_AFTER, (AFUNPTR)AfterCall,
IARG_UINT32, RTN_Id(routine),
IARG_THREAD_ID,
IARG_END);
BeforeCall和AfterCall看起来像
VOID BeforeCall(unsigned int funcID,THREADID threadID);
VOID AfterCall(unsigned int funcID,THREADID threadID);
这些回调中的“ threadID ”变量始终具有值零。正在检测的应用程序正在运行 32个线程。 Pin附带的示例使用相同的方法来访问线程ID。这种实施是对的吗?如果没有,我如何获得例程正在运行的线程的实际线程ID?
答案 0 :(得分:0)
如果您查看英特尔手册,它会告诉您有关检测多线程程序的必要条件。有几种方法可以检索threadid ---适合我的方法是使用
PIN_GetThreadID()
在分析程序中。但有些情况下使用该论证更为理想;我不确定您是否尝试使用本手册,但here是使用基于图像的工具插入RTN级别调用的多线程目标的一个很好的示例 。相比之下,我不确切知道你的是什么。
另外,虽然你提到的示例intel附带使用这种方法,但你没有多说你的结果和英特尔提供的pintool之间的对比。为什么不尝试对目标运行他们的工具以查看它是否有效,并发布结果?此外,如果它确实有效,那么修改其工具以合并代码的路线又如何呢?
此外,还有一个困扰你的pintool的微妙错误;由于您还没有完全阅读本手册,因此您似乎正在使用RTN级别的仪器,相信您将能够从给定的呼叫中收集所有回报。在这种情况下你应该知道的是编译器进行了大量的优化,虽然通常可以保证你可以捕获所有的调用,但是不能保证检测所有的返回,因为函数可以有多个返回。为此,您应该使用基于跟踪的检测(也在手册中描述)。
如果您发现这不能回答您的问题,我认为发布您的来源更合适。希望你最好能够设置一个github repo,我可以直接使用它,它会立即为我工作 - 小巧且可重复,只需很少的配置。为此,我建议使用out of folder makefile。