为什么Intel Pin无法识别某些执行指令的图像/例程?

时间:2013-03-23 10:08:36

标签: debugging ld intel-pin

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


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


该工具(在检测Barnes-Hut基准测试时)总是在运行一段时间后以内存不足(OOM)错误终止(尽管基准测试,当独立运行时,成功完成)。哪些工具用于调试/跟踪Pin-instrumented应用程序的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;
    }
}

1 个答案:

答案 0 :(得分:0)

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

了解这种情况的最佳方式是查看上下文。我的pintool(基于DebugTrace)甚至在不知道它是什么图像的情况下继续运行。您可以在此之前和之后查看日志条目。我在OSX上的dydl一直都看到这个。