0

我正在使用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?

4

1 回答 1

0

如果您查看英特尔手册,它会告诉您检测多线程程序所需的内容。有几种方法可以检索 threadid——对我有用的方法是使用

 PIN_GetThreadID() 

在分析程序中。但在某些情况下,使用该论点更为理想。我不确定您是否尝试使用手册,但这是使用基于图像的检测插入 RTN 级别调用的多线程目标的一个很好的示例。相比之下,我不知道你的到底是什么。

此外,虽然您提到英特尔附带的示例使用此方法,但您并没有过多说明您的结果与英特尔提供的 pintool 之间的对比。为什么不尝试针对您的目标运行他们的工具,看看它是否有效,然后发布您的结果?此外,如果它确实有效,那么修改他们的工具以合并您的代码的路线呢?

此外,还有一个微妙的错误困扰着您的 pintool;由于您还没有完全阅读手册,因此您似乎正在使用 RTN 级别的仪器,相信您将能够从给定的调用中收集所有返回。在这种情况下你应该知道的是编译器做了很多优化,虽然通常可以保证你可以捕获所有调用,但不能保证检测所有返回,因为一个函数可以有多个返回。为此,您应该使用基于 Trace 的检测(也在手册中描述)。

如果您发现这不能回答您的问题,我认为您发布您的来源更合适。希望您可以设置一个 github 存储库,我可以直接拉取它,这将更好地为我工作 - 小且可重现,无需花费太多精力进行配置。为此,我建议使用文件夹外的 makefile。

于 2013-11-04T17:03:56.970 回答