为什么英特尔引脚不能识别某些执行指令的映像/例程



我正在创建一个大的pintool,我有两个问题:


该工具(仅在下面删节到相关部分)有时无法识别特定执行指令的映像/例程。有人知道这种情况何时/为什么会发生吗?


该工具(在检测Barnes-Hut基准测试时)在运行一段时间后总是以内存不足(OOM)错误终止(尽管在独立运行时,基准测试会成功完成)。使用哪些工具来调试/跟踪引脚仪表应用程序的OOM错误?

int main(int argc, char *argv[])
{
    PIN_InitSymbols();
    if( PIN_Init(argc, argv) )
    {
    return 0;
    }
    INS_AddInstrumentFunction(Instruction, 0);
    PIN_StartProgram();
    return 0;
}
VOID Instruction(INS ins, VOID *v)
{
    INS_InsertPredicatedCall( ins,
    IPOINT_BEFORE, 
    (AFUNPTR) handle_ins_execution,
    IARG_INST_PTR,
    .....);
}

VOID handle_ins_execution (ADDRINT   addr, ...)
{
    PIN_LockClient();
    IMG img = IMG_FindByAddress(addr);
    RTN rtn = RTN_FindByAddress(addr);
    PIN_UnlockClient();
    if( IMG_Valid(img) ) {
    std::cerr << "From Image  : " << IMG_Name( img ) << std::endl;
    } else {
    std::cerr << "From Image  : " << "(UKNOWN)" << std::endl;
    }
    if( RTN_Valid(rtn) ) {
    std::cerr << "From Routine  : " << RTN_Name(rtn) << std::endl;
    } else {
    std::cerr << "From Routine  : " << "(UKNOWN)" << std::endl;
    }
}

我最近在PinHeads论坛上问了这个问题,我正在等待回应。我在文档中读到的是IMG_FindByAddress函数通过查找"对于每个图像,检查地址是否在其一个段的映射内存区域内"来操作。可能会执行不在有效范围内的指令。

在这种情况下,知道它在哪个图像中的最好方法是查看上下文。我的pintool(基于DebugTrace)即使不知道它在哪个图像中也会继续运行。您可以查看此操作发生之前和之后的日志条目。我在OSX上的dydl中经常看到这个

最新更新